Obsoleted 22 more effects

Also added a better way of calculating battle_tv score properly; to do: Make it Rain
This commit is contained in:
Nephrite 2023-12-27 17:41:45 +09:00
parent cd5c59ae5a
commit 77c722ea09
24 changed files with 316 additions and 335 deletions

View File

@ -57,12 +57,12 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectHit @ EFFECT_FUSION_COMBO .4byte BattleScript_EffectHit @ EFFECT_FUSION_COMBO
.4byte BattleScript_EffectSuperFang @ EFFECT_SUPER_FANG .4byte BattleScript_EffectSuperFang @ EFFECT_SUPER_FANG
.4byte BattleScript_EffectDragonRage @ EFFECT_DRAGON_RAGE .4byte BattleScript_EffectDragonRage @ EFFECT_DRAGON_RAGE
.4byte BattleScript_EffectTrap @ EFFECT_TRAP .4byte BattleScript_EffectHit @ EFFECT_UNUSED_35
.4byte BattleScript_EffectHealBlock @ EFFECT_HEAL_BLOCK .4byte BattleScript_EffectHealBlock @ EFFECT_HEAL_BLOCK
.4byte BattleScript_EffectRecoilIfMiss @ EFFECT_RECOIL_IF_MISS .4byte BattleScript_EffectRecoilIfMiss @ EFFECT_RECOIL_IF_MISS
.4byte BattleScript_EffectMist @ EFFECT_MIST .4byte BattleScript_EffectMist @ EFFECT_MIST
.4byte BattleScript_EffectFocusEnergy @ EFFECT_FOCUS_ENERGY .4byte BattleScript_EffectFocusEnergy @ EFFECT_FOCUS_ENERGY
.4byte BattleScript_EffectHit @ EFFECT_RECOIL .4byte BattleScript_EffectHit @ EFFECT_UNUSED_40
.4byte BattleScript_EffectConfuse @ EFFECT_CONFUSE .4byte BattleScript_EffectConfuse @ EFFECT_CONFUSE
.4byte BattleScript_EffectAttackUp2 @ EFFECT_ATTACK_UP_2 .4byte BattleScript_EffectAttackUp2 @ EFFECT_ATTACK_UP_2
.4byte BattleScript_EffectDefenseUp2 @ EFFECT_DEFENSE_UP_2 .4byte BattleScript_EffectDefenseUp2 @ EFFECT_DEFENSE_UP_2
@ -83,9 +83,9 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectPoison @ EFFECT_POISON .4byte BattleScript_EffectPoison @ EFFECT_POISON
.4byte BattleScript_EffectParalyze @ EFFECT_PARALYZE .4byte BattleScript_EffectParalyze @ EFFECT_PARALYZE
.4byte BattleScript_EffectTwoTurnsAttack @ EFFECT_TWO_TURNS_ATTACK .4byte BattleScript_EffectTwoTurnsAttack @ EFFECT_TWO_TURNS_ATTACK
.4byte BattleScript_EffectHit @ EFFECT_VITAL_THROW .4byte BattleScript_EffectHit @ EFFECT_UNUSED_61
.4byte BattleScript_EffectSubstitute @ EFFECT_SUBSTITUTE .4byte BattleScript_EffectSubstitute @ EFFECT_SUBSTITUTE
.4byte BattleScript_EffectHit @ EFFECT_RECHARGE .4byte BattleScript_EffectHit @ EFFECT_UNUSED_63
.4byte BattleScript_EffectRage @ EFFECT_RAGE .4byte BattleScript_EffectRage @ EFFECT_RAGE
.4byte BattleScript_EffectMimic @ EFFECT_MIMIC .4byte BattleScript_EffectMimic @ EFFECT_MIMIC
.4byte BattleScript_EffectMetronome @ EFFECT_METRONOME .4byte BattleScript_EffectMetronome @ EFFECT_METRONOME
@ -108,7 +108,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectHit @ EFFECT_FALSE_SWIPE .4byte BattleScript_EffectHit @ EFFECT_FALSE_SWIPE
.4byte BattleScript_EffectHealBell @ EFFECT_HEAL_BELL .4byte BattleScript_EffectHealBell @ EFFECT_HEAL_BELL
.4byte BattleScript_EffectTripleKick @ EFFECT_TRIPLE_KICK .4byte BattleScript_EffectTripleKick @ EFFECT_TRIPLE_KICK
.4byte BattleScript_EffectHit @ EFFECT_THIEF .4byte BattleScript_EffectHit @ EFFECT_UNUSED_86
.4byte BattleScript_EffectMeanLook @ EFFECT_MEAN_LOOK .4byte BattleScript_EffectMeanLook @ EFFECT_MEAN_LOOK
.4byte BattleScript_EffectNightmare @ EFFECT_NIGHTMARE .4byte BattleScript_EffectNightmare @ EFFECT_NIGHTMARE
.4byte BattleScript_EffectMinimize @ EFFECT_MINIMIZE .4byte BattleScript_EffectMinimize @ EFFECT_MINIMIZE
@ -140,7 +140,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectHit @ EFFECT_HIDDEN_POWER .4byte BattleScript_EffectHit @ EFFECT_HIDDEN_POWER
.4byte BattleScript_EffectRainDance @ EFFECT_RAIN_DANCE .4byte BattleScript_EffectRainDance @ EFFECT_RAIN_DANCE
.4byte BattleScript_EffectSunnyDay @ EFFECT_SUNNY_DAY .4byte BattleScript_EffectSunnyDay @ EFFECT_SUNNY_DAY
.4byte BattleScript_EffectHit @ EFFECT_ALL_STATS_UP_HIT .4byte BattleScript_EffectHit @ EFFECT_UNUSED_118
.4byte BattleScript_EffectHit @ EFFECT_FELL_STINGER .4byte BattleScript_EffectHit @ EFFECT_FELL_STINGER
.4byte BattleScript_EffectBellyDrum @ EFFECT_BELLY_DRUM .4byte BattleScript_EffectBellyDrum @ EFFECT_BELLY_DRUM
.4byte BattleScript_EffectPsychUp @ EFFECT_PSYCH_UP .4byte BattleScript_EffectPsychUp @ EFFECT_PSYCH_UP
@ -169,7 +169,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectMemento @ EFFECT_MEMENTO .4byte BattleScript_EffectMemento @ EFFECT_MEMENTO
.4byte BattleScript_EffectHit @ EFFECT_FACADE .4byte BattleScript_EffectHit @ EFFECT_FACADE
.4byte BattleScript_EffectFocusPunch @ EFFECT_FOCUS_PUNCH .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_EffectFollowMe @ EFFECT_FOLLOW_ME
.4byte BattleScript_EffectNaturePower @ EFFECT_NATURE_POWER .4byte BattleScript_EffectNaturePower @ EFFECT_NATURE_POWER
.4byte BattleScript_EffectCharge @ EFFECT_CHARGE .4byte BattleScript_EffectCharge @ EFFECT_CHARGE
@ -194,7 +194,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectGrudge @ EFFECT_GRUDGE .4byte BattleScript_EffectGrudge @ EFFECT_GRUDGE
.4byte BattleScript_EffectSnatch @ EFFECT_SNATCH .4byte BattleScript_EffectSnatch @ EFFECT_SNATCH
.4byte BattleScript_EffectHit @ EFFECT_LOW_KICK .4byte BattleScript_EffectHit @ EFFECT_LOW_KICK
.4byte BattleScript_EffectHit @ EFFECT_SECRET_POWER .4byte BattleScript_EffectHit @ EFFECT_UNUSED_172
.4byte BattleScript_EffectTeeterDance @ EFFECT_TEETER_DANCE .4byte BattleScript_EffectTeeterDance @ EFFECT_TEETER_DANCE
.4byte BattleScript_EffectHitEscape @ EFFECT_HIT_ESCAPE .4byte BattleScript_EffectHitEscape @ EFFECT_HIT_ESCAPE
.4byte BattleScript_EffectMudSport @ EFFECT_MUD_SPORT .4byte BattleScript_EffectMudSport @ EFFECT_MUD_SPORT
@ -211,9 +211,9 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectPledge @ EFFECT_PLEDGE .4byte BattleScript_EffectPledge @ EFFECT_PLEDGE
.4byte BattleScript_EffectFling @ EFFECT_FLING .4byte BattleScript_EffectFling @ EFFECT_FLING
.4byte BattleScript_EffectNaturalGift @ EFFECT_NATURAL_GIFT .4byte BattleScript_EffectNaturalGift @ EFFECT_NATURAL_GIFT
.4byte BattleScript_EffectWakeUpSlap @ EFFECT_WAKE_UP_SLAP .4byte BattleScript_EffectHit @ EFFECT_UNUSED_189
.4byte BattleScript_EffectHit @ EFFECT_WRING_OUT .4byte BattleScript_EffectHit @ EFFECT_WRING_OUT
.4byte BattleScript_EffectHit @ EFFECT_HEX .4byte BattleScript_EffectHit @ EFFECT_UNUSED_191
.4byte BattleScript_EffectHit @ EFFECT_ASSURANCE .4byte BattleScript_EffectHit @ EFFECT_ASSURANCE
.4byte BattleScript_EffectHit @ EFFECT_TRUMP_CARD .4byte BattleScript_EffectHit @ EFFECT_TRUMP_CARD
.4byte BattleScript_EffectHit @ EFFECT_ACROBATICS .4byte BattleScript_EffectHit @ EFFECT_ACROBATICS
@ -226,7 +226,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectHit @ EFFECT_PAYBACK .4byte BattleScript_EffectHit @ EFFECT_PAYBACK
.4byte BattleScript_EffectHit @ EFFECT_ROUND .4byte BattleScript_EffectHit @ EFFECT_ROUND
.4byte BattleScript_EffectHit @ EFFECT_BRINE .4byte BattleScript_EffectHit @ EFFECT_BRINE
.4byte BattleScript_EffectHit @ EFFECT_VENOSHOCK .4byte BattleScript_EffectHit @ EFFECT_UNUSED_204
.4byte BattleScript_EffectHit @ EFFECT_RETALIATE .4byte BattleScript_EffectHit @ EFFECT_RETALIATE
.4byte BattleScript_EffectHit @ EFFECT_BULLDOZE .4byte BattleScript_EffectHit @ EFFECT_BULLDOZE
.4byte BattleScript_EffectHit @ EFFECT_FOUL_PLAY .4byte BattleScript_EffectHit @ EFFECT_FOUL_PLAY
@ -290,23 +290,23 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectCopycat @ EFFECT_COPYCAT .4byte BattleScript_EffectCopycat @ EFFECT_COPYCAT
.4byte BattleScript_EffectDefog @ EFFECT_DEFOG .4byte BattleScript_EffectDefog @ EFFECT_DEFOG
.4byte BattleScript_EffectHitEnemyHealAlly @ EFFECT_HIT_ENEMY_HEAL_ALLY .4byte BattleScript_EffectHitEnemyHealAlly @ EFFECT_HIT_ENEMY_HEAL_ALLY
.4byte BattleScript_EffectSmackDown @ EFFECT_SMACK_DOWN .4byte BattleScript_EffectHit @ EFFECT_UNUSED_268
.4byte BattleScript_EffectSynchronoise @ EFFECT_SYNCHRONOISE .4byte BattleScript_EffectSynchronoise @ EFFECT_SYNCHRONOISE
.4byte BattleScript_EffectPsychoShift @ EFFECT_PSYCHO_SHIFT .4byte BattleScript_EffectPsychoShift @ EFFECT_PSYCHO_SHIFT
.4byte BattleScript_EffectPowerTrick @ EFFECT_POWER_TRICK .4byte BattleScript_EffectPowerTrick @ EFFECT_POWER_TRICK
.4byte BattleScript_EffectFlameBurst @ EFFECT_FLAME_BURST .4byte BattleScript_EffectHit @ EFFECT_UNUSED_272
.4byte BattleScript_EffectAfterYou @ EFFECT_AFTER_YOU .4byte BattleScript_EffectAfterYou @ EFFECT_AFTER_YOU
.4byte BattleScript_EffectBestow @ EFFECT_BESTOW .4byte BattleScript_EffectBestow @ EFFECT_BESTOW
.4byte BattleScript_EffectRototiller @ EFFECT_ROTOTILLER .4byte BattleScript_EffectRototiller @ EFFECT_ROTOTILLER
.4byte BattleScript_EffectFlowerShield @ EFFECT_FLOWER_SHIELD .4byte BattleScript_EffectFlowerShield @ EFFECT_FLOWER_SHIELD
.4byte BattleScript_EffectHit @ EFFECT_HIT_PREVENT_ESCAPE .4byte BattleScript_EffectHit @ EFFECT_UNUSED_277
.4byte BattleScript_EffectSpeedSwap @ EFFECT_SPEED_SWAP .4byte BattleScript_EffectSpeedSwap @ EFFECT_SPEED_SWAP
.4byte BattleScript_EffectDefenseUp2Hit @ EFFECT_DEFENSE_UP2_HIT .4byte BattleScript_EffectHit @ EFFECT_UNUSED_279
.4byte BattleScript_EffectHit @ EFFECT_REVELATION_DANCE .4byte BattleScript_EffectHit @ EFFECT_REVELATION_DANCE
.4byte BattleScript_EffectAuroraVeil @ EFFECT_AURORA_VEIL .4byte BattleScript_EffectAuroraVeil @ EFFECT_AURORA_VEIL
.4byte BattleScript_EffectThirdType @ EFFECT_THIRD_TYPE .4byte BattleScript_EffectThirdType @ EFFECT_THIRD_TYPE
.4byte BattleScript_EffectHit @ EFFECT_FEINT .4byte BattleScript_EffectHit @ EFFECT_UNUSED_283
.4byte BattleScript_EffectSparklingAria @ EFFECT_SPARKLING_ARIA .4byte BattleScript_EffectHit @ EFFECT_UNUSED_284
.4byte BattleScript_EffectAcupressure @ EFFECT_ACUPRESSURE .4byte BattleScript_EffectAcupressure @ EFFECT_ACUPRESSURE
.4byte BattleScript_EffectAromaticMist @ EFFECT_AROMATIC_MIST .4byte BattleScript_EffectAromaticMist @ EFFECT_AROMATIC_MIST
.4byte BattleScript_EffectPowder @ EFFECT_POWDER .4byte BattleScript_EffectPowder @ EFFECT_POWDER
@ -315,12 +315,12 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectMatBlock @ EFFECT_MAT_BLOCK .4byte BattleScript_EffectMatBlock @ EFFECT_MAT_BLOCK
.4byte BattleScript_EffectHit @ EFFECT_STOMPING_TANTRUM .4byte BattleScript_EffectHit @ EFFECT_STOMPING_TANTRUM
.4byte BattleScript_EffectInstruct @ EFFECT_INSTRUCT .4byte BattleScript_EffectInstruct @ EFFECT_INSTRUCT
.4byte BattleScript_EffectThroatChop @ EFFECT_THROAT_CHOP .4byte BattleScript_EffectHit @ EFFECT_UNUSED_293
.4byte BattleScript_EffectLaserFocus @ EFFECT_LASER_FOCUS .4byte BattleScript_EffectLaserFocus @ EFFECT_LASER_FOCUS
.4byte BattleScript_EffectMagneticFlux @ EFFECT_MAGNETIC_FLUX .4byte BattleScript_EffectMagneticFlux @ EFFECT_MAGNETIC_FLUX
.4byte BattleScript_EffectGearUp @ EFFECT_GEAR_UP .4byte BattleScript_EffectGearUp @ EFFECT_GEAR_UP
.4byte BattleScript_EffectHit @ EFFECT_INCINERATE .4byte BattleScript_EffectHit @ EFFECT_UNUSED_297
.4byte BattleScript_EffectHit @ EFFECT_BUG_BITE .4byte BattleScript_EffectHit @ EFFECT_UNUSED_298
.4byte BattleScript_EffectStrengthSap @ EFFECT_STRENGTH_SAP .4byte BattleScript_EffectStrengthSap @ EFFECT_STRENGTH_SAP
.4byte BattleScript_EffectMindBlown @ EFFECT_MIND_BLOWN .4byte BattleScript_EffectMindBlown @ EFFECT_MIND_BLOWN
.4byte BattleScript_EffectPurify @ EFFECT_PURIFY .4byte BattleScript_EffectPurify @ EFFECT_PURIFY
@ -376,11 +376,11 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectShellTrap @ EFFECT_SHELL_TRAP .4byte BattleScript_EffectShellTrap @ EFFECT_SHELL_TRAP
.4byte BattleScript_EffectHit @ EFFECT_PSYBLADE .4byte BattleScript_EffectHit @ EFFECT_PSYBLADE
.4byte BattleScript_EffectHit @ EFFECT_HYDRO_STEAM .4byte BattleScript_EffectHit @ EFFECT_HYDRO_STEAM
.4byte BattleScript_EffectHit @ EFFECT_HIT_SET_ENTRY_HAZARD .4byte BattleScript_EffectHit @ EFFECT_UNUSED_354
.4byte BattleScript_EffectHit @ EFFECT_BARB_BARRAGE .4byte BattleScript_EffectHit @ EFFECT_UNUSED_355
.4byte BattleScript_EffectRevivalBlessing @ EFFECT_REVIVAL_BLESSING .4byte BattleScript_EffectRevivalBlessing @ EFFECT_REVIVAL_BLESSING
.4byte BattleScript_EffectSnow @ EFFECT_SNOWSCAPE .4byte BattleScript_EffectSnow @ EFFECT_SNOWSCAPE
.4byte BattleScript_EffectHit @ EFFECT_INFERNAL_PARADE .4byte BattleScript_EffectHit @ EFFECT_UNUSED_358
.4byte BattleScript_EffectTakeHeart @ EFFECT_TAKE_HEART .4byte BattleScript_EffectTakeHeart @ EFFECT_TAKE_HEART
.4byte BattleScript_EffectHit @ EFFECT_COLLISION_COURSE .4byte BattleScript_EffectHit @ EFFECT_COLLISION_COURSE
.4byte BattleScript_EffectMakeItRain @ EFFECT_MAKE_IT_RAIN .4byte BattleScript_EffectMakeItRain @ EFFECT_MAKE_IT_RAIN
@ -1187,7 +1187,7 @@ BattleScript_EffectNoRetreat:
waitanimation waitanimation
call BattleScript_AllStatsUp call BattleScript_AllStatsUp
jumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_MoveEnd jumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_MoveEnd
setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE | MOVE_EFFECT_AFFECTS_USER
seteffectprimary seteffectprimary
printstring STRINGID_CANTESCAPEDUETOUSEDMOVE printstring STRINGID_CANTESCAPEDUETOUSEDMOVE
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
@ -1786,10 +1786,6 @@ BattleScript_EffectThirdType:
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_EffectDefenseUp2Hit:
setmoveeffect MOVE_EFFECT_DEF_PLUS_2 | MOVE_EFFECT_AFFECTS_USER
goto BattleScript_EffectHit
BattleScript_EffectFlowerShield: BattleScript_EffectFlowerShield:
attackcanceler attackcanceler
attackstring attackstring
@ -1899,10 +1895,6 @@ BattleScript_EffectAfterYou:
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_EffectFlameBurst:
setmoveeffect MOVE_EFFECT_FLAME_BURST | MOVE_EFFECT_AFFECTS_USER
goto BattleScript_EffectHit
BattleScript_MoveEffectFlameBurst:: BattleScript_MoveEffectFlameBurst::
tryfaintmon BS_TARGET tryfaintmon BS_TARGET
copybyte sBATTLER, sSAVED_BATTLER copybyte sBATTLER, sSAVED_BATTLER
@ -1992,10 +1984,6 @@ BattleScript_SynchronoiseNoEffect:
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_SynchronoiseMoveTargetEnd goto BattleScript_SynchronoiseMoveTargetEnd
BattleScript_EffectSmackDown:
setmoveeffect MOVE_EFFECT_SMACK_DOWN
goto BattleScript_EffectHit
BattleScript_MoveEffectSmackDown:: BattleScript_MoveEffectSmackDown::
printstring STRINGID_FELLSTRAIGHTDOWN printstring STRINGID_FELLSTRAIGHTDOWN
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
@ -3063,11 +3051,6 @@ BattleScript_EffectHealBlock:
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_EffectThroatChop:
jumpifsubstituteblocks BattleScript_EffectHit
setmoveeffect MOVE_EFFECT_THROAT_CHOP | MOVE_EFFECT_CERTAIN
goto BattleScript_EffectHit
BattleScript_EffectHitEscape: BattleScript_EffectHitEscape:
call BattleScript_EffectHit_Ret call BattleScript_EffectHit_Ret
jumpifmovehadnoeffect BattleScript_MoveEnd jumpifmovehadnoeffect BattleScript_MoveEnd
@ -3885,10 +3868,6 @@ BattleScript_EffectDragonRage::
adjustdamage adjustdamage
goto BattleScript_HitFromAtkAnimation goto BattleScript_HitFromAtkAnimation
BattleScript_EffectTrap::
setmoveeffect MOVE_EFFECT_WRAP
goto BattleScript_EffectHit
BattleScript_EffectRecoilIfMiss:: BattleScript_EffectRecoilIfMiss::
attackcanceler attackcanceler
accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE
@ -5073,11 +5052,6 @@ BattleScript_SkullBashEnd::
call BattleScript_PowerHerbActivation call BattleScript_PowerHerbActivation
goto BattleScript_TwoTurnMovesSecondTurn goto BattleScript_TwoTurnMovesSecondTurn
BattleScript_EffectBulldoze:
setmoveeffect MOVE_EFFECT_SPD_MINUS_1
BattleScript_EffectEarthquake:
goto BattleScript_EffectHit
BattleScript_EffectFutureSight:: BattleScript_EffectFutureSight::
attackcanceler attackcanceler
attackstring attackstring
@ -5519,13 +5493,6 @@ BattleScript_EffectFocusPunch::
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd 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:: BattleScript_EffectFollowMe::
attackcanceler attackcanceler
attackstring attackstring
@ -5830,7 +5797,6 @@ BattleScript_EffectSnatch:
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_EffectRecoilHP25: BattleScript_EffectRecoilHP25:
setmoveeffect MOVE_EFFECT_RECOIL_HP_25 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit
incrementgamestat GAME_STAT_USED_STRUGGLE incrementgamestat GAME_STAT_USED_STRUGGLE
goto BattleScript_EffectHit goto BattleScript_EffectHit

View File

@ -780,9 +780,7 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER
#define IS_MOVE_SPECIAL(move)(GetBattleMoveCategory(move) == BATTLE_CATEGORY_SPECIAL) #define IS_MOVE_SPECIAL(move)(GetBattleMoveCategory(move) == BATTLE_CATEGORY_SPECIAL)
#define IS_MOVE_STATUS(move)(gBattleMoves[move].category == BATTLE_CATEGORY_STATUS) #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)(gBattleMoves[move].recoil > 0 || gBattleMoves[move].effect == EFFECT_RECOIL_IF_MISS)
#define IS_MOVE_RECOIL(move)(IS_EFFECT_RECOIL(gBattleMoves[move].effect))
#define BATTLER_MAX_HP(battlerId)(gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP) #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])) #define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0) || (gBattleStruct->enduredDamage & gBitTable[gBattlerTarget]))

View File

@ -66,6 +66,7 @@ u32 AI_GetBattlerMoveTargetType(u32 battlerId, u32 move);
bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove);
u32 AI_CalcSecondaryEffectChance(u32 battler, u32 secondaryEffectChance); u32 AI_CalcSecondaryEffectChance(u32 battler, u32 secondaryEffectChance);
bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef); bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef);
u32 AI_ShouldSetUpHazards(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef);
// stat stage checks // stat stage checks
bool32 AnyStatIsRaised(u32 battlerId); bool32 AnyStatIsRaised(u32 battlerId);
@ -122,7 +123,7 @@ bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, u32 holdEffect);
bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef); bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef);
bool32 IsHealingMoveEffect(u32 effect); bool32 IsHealingMoveEffect(u32 effect);
bool32 HasHealingEffect(u32 battler); bool32 HasHealingEffect(u32 battler);
bool32 IsTrappingMoveEffect(u32 effect); bool32 IsTrappingMove(u32 move);
bool32 HasTrappingMoveEffect(u32 battler); bool32 HasTrappingMoveEffect(u32 battler);
bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move); bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move);
bool32 HasThawingMove(u32 battler); bool32 HasThawingMove(u32 battler);

View File

@ -36,12 +36,12 @@
#define EFFECT_FUSION_COMBO 32 #define EFFECT_FUSION_COMBO 32
#define EFFECT_SUPER_FANG 33 #define EFFECT_SUPER_FANG 33
#define EFFECT_DRAGON_RAGE 34 #define EFFECT_DRAGON_RAGE 34
#define EFFECT_TRAP 35 #define EFFECT_UNUSED_35 35
#define EFFECT_HEAL_BLOCK 36 #define EFFECT_HEAL_BLOCK 36
#define EFFECT_RECOIL_IF_MISS 37 #define EFFECT_RECOIL_IF_MISS 37
#define EFFECT_MIST 38 #define EFFECT_MIST 38
#define EFFECT_FOCUS_ENERGY 39 #define EFFECT_FOCUS_ENERGY 39
#define EFFECT_RECOIL 40 #define EFFECT_UNUSED_40 40
#define EFFECT_CONFUSE 41 #define EFFECT_CONFUSE 41
#define EFFECT_ATTACK_UP_2 42 #define EFFECT_ATTACK_UP_2 42
#define EFFECT_DEFENSE_UP_2 43 #define EFFECT_DEFENSE_UP_2 43
@ -62,9 +62,9 @@
#define EFFECT_POISON 58 #define EFFECT_POISON 58
#define EFFECT_PARALYZE 59 #define EFFECT_PARALYZE 59
#define EFFECT_TWO_TURNS_ATTACK 60 #define EFFECT_TWO_TURNS_ATTACK 60
#define EFFECT_VITAL_THROW 61 #define EFFECT_UNUSED_61 61
#define EFFECT_SUBSTITUTE 62 #define EFFECT_SUBSTITUTE 62
#define EFFECT_RECHARGE 63 #define EFFECT_UNUSED_63 63
#define EFFECT_RAGE 64 #define EFFECT_RAGE 64
#define EFFECT_MIMIC 65 #define EFFECT_MIMIC 65
#define EFFECT_METRONOME 66 #define EFFECT_METRONOME 66
@ -87,7 +87,7 @@
#define EFFECT_FALSE_SWIPE 83 #define EFFECT_FALSE_SWIPE 83
#define EFFECT_HEAL_BELL 84 #define EFFECT_HEAL_BELL 84
#define EFFECT_TRIPLE_KICK 85 #define EFFECT_TRIPLE_KICK 85
#define EFFECT_THIEF 86 #define EFFECT_UNUSED_86 86
#define EFFECT_MEAN_LOOK 87 #define EFFECT_MEAN_LOOK 87
#define EFFECT_NIGHTMARE 88 #define EFFECT_NIGHTMARE 88
#define EFFECT_MINIMIZE 89 #define EFFECT_MINIMIZE 89
@ -119,7 +119,7 @@
#define EFFECT_HIDDEN_POWER 115 #define EFFECT_HIDDEN_POWER 115
#define EFFECT_RAIN_DANCE 116 #define EFFECT_RAIN_DANCE 116
#define EFFECT_SUNNY_DAY 117 #define EFFECT_SUNNY_DAY 117
#define EFFECT_ALL_STATS_UP_HIT 118 #define EFFECT_UNUSED_118 118
#define EFFECT_FELL_STINGER 119 #define EFFECT_FELL_STINGER 119
#define EFFECT_BELLY_DRUM 120 #define EFFECT_BELLY_DRUM 120
#define EFFECT_PSYCH_UP 121 #define EFFECT_PSYCH_UP 121
@ -148,7 +148,7 @@
#define EFFECT_MEMENTO 144 #define EFFECT_MEMENTO 144
#define EFFECT_FACADE 145 #define EFFECT_FACADE 145
#define EFFECT_FOCUS_PUNCH 146 #define EFFECT_FOCUS_PUNCH 146
#define EFFECT_SMELLING_SALTS 147 #define EFFECT_DOUBLE_POWER_ON_ARG_STATUS 147
#define EFFECT_FOLLOW_ME 148 #define EFFECT_FOLLOW_ME 148
#define EFFECT_NATURE_POWER 149 #define EFFECT_NATURE_POWER 149
#define EFFECT_CHARGE 150 #define EFFECT_CHARGE 150
@ -173,7 +173,7 @@
#define EFFECT_GRUDGE 169 #define EFFECT_GRUDGE 169
#define EFFECT_SNATCH 170 #define EFFECT_SNATCH 170
#define EFFECT_LOW_KICK 171 #define EFFECT_LOW_KICK 171
#define EFFECT_SECRET_POWER 172 #define EFFECT_UNUSED_172 172
#define EFFECT_TEETER_DANCE 173 #define EFFECT_TEETER_DANCE 173
#define EFFECT_HIT_ESCAPE 174 #define EFFECT_HIT_ESCAPE 174
#define EFFECT_MUD_SPORT 175 #define EFFECT_MUD_SPORT 175
@ -190,9 +190,9 @@
#define EFFECT_PLEDGE 186 #define EFFECT_PLEDGE 186
#define EFFECT_FLING 187 #define EFFECT_FLING 187
#define EFFECT_NATURAL_GIFT 188 #define EFFECT_NATURAL_GIFT 188
#define EFFECT_WAKE_UP_SLAP 189 #define EFFECT_UNUSED_189 189
#define EFFECT_WRING_OUT 190 #define EFFECT_WRING_OUT 190
#define EFFECT_HEX 191 #define EFFECT_UNUSED_191 191
#define EFFECT_ASSURANCE 192 #define EFFECT_ASSURANCE 192
#define EFFECT_TRUMP_CARD 193 #define EFFECT_TRUMP_CARD 193
#define EFFECT_ACROBATICS 194 #define EFFECT_ACROBATICS 194
@ -205,7 +205,7 @@
#define EFFECT_PAYBACK 201 #define EFFECT_PAYBACK 201
#define EFFECT_ROUND 202 #define EFFECT_ROUND 202
#define EFFECT_BRINE 203 #define EFFECT_BRINE 203
#define EFFECT_VENOSHOCK 204 #define EFFECT_UNUSED_204 204
#define EFFECT_RETALIATE 205 #define EFFECT_RETALIATE 205
#define EFFECT_BULLDOZE 206 #define EFFECT_BULLDOZE 206
#define EFFECT_FOUL_PLAY 207 #define EFFECT_FOUL_PLAY 207
@ -269,23 +269,23 @@
#define EFFECT_COPYCAT 265 #define EFFECT_COPYCAT 265
#define EFFECT_DEFOG 266 #define EFFECT_DEFOG 266
#define EFFECT_HIT_ENEMY_HEAL_ALLY 267 #define EFFECT_HIT_ENEMY_HEAL_ALLY 267
#define EFFECT_SMACK_DOWN 268 #define EFFECT_UNUSED_268 268
#define EFFECT_SYNCHRONOISE 269 #define EFFECT_SYNCHRONOISE 269
#define EFFECT_PSYCHO_SHIFT 270 #define EFFECT_PSYCHO_SHIFT 270
#define EFFECT_POWER_TRICK 271 #define EFFECT_POWER_TRICK 271
#define EFFECT_FLAME_BURST 272 #define EFFECT_UNUSED_272 272
#define EFFECT_AFTER_YOU 273 #define EFFECT_AFTER_YOU 273
#define EFFECT_BESTOW 274 #define EFFECT_BESTOW 274
#define EFFECT_ROTOTILLER 275 #define EFFECT_ROTOTILLER 275
#define EFFECT_FLOWER_SHIELD 276 #define EFFECT_FLOWER_SHIELD 276
#define EFFECT_HIT_PREVENT_ESCAPE 277 #define EFFECT_UNUSED_277 277
#define EFFECT_SPEED_SWAP 278 #define EFFECT_SPEED_SWAP 278
#define EFFECT_DEFENSE_UP2_HIT 279 #define EFFECT_UNUSED_279 279
#define EFFECT_REVELATION_DANCE 280 #define EFFECT_REVELATION_DANCE 280
#define EFFECT_AURORA_VEIL 281 #define EFFECT_AURORA_VEIL 281
#define EFFECT_THIRD_TYPE 282 #define EFFECT_THIRD_TYPE 282
#define EFFECT_FEINT 283 #define EFFECT_UNUSED_283 283
#define EFFECT_SPARKLING_ARIA 284 #define EFFECT_UNUSED_284 284
#define EFFECT_ACUPRESSURE 285 #define EFFECT_ACUPRESSURE 285
#define EFFECT_AROMATIC_MIST 286 #define EFFECT_AROMATIC_MIST 286
#define EFFECT_POWDER 287 #define EFFECT_POWDER 287
@ -294,12 +294,12 @@
#define EFFECT_MAT_BLOCK 290 #define EFFECT_MAT_BLOCK 290
#define EFFECT_STOMPING_TANTRUM 291 #define EFFECT_STOMPING_TANTRUM 291
#define EFFECT_INSTRUCT 292 #define EFFECT_INSTRUCT 292
#define EFFECT_THROAT_CHOP 293 #define EFFECT_UNUSED_293 293
#define EFFECT_LASER_FOCUS 294 #define EFFECT_LASER_FOCUS 294
#define EFFECT_MAGNETIC_FLUX 295 #define EFFECT_MAGNETIC_FLUX 295
#define EFFECT_GEAR_UP 296 #define EFFECT_GEAR_UP 296
#define EFFECT_INCINERATE 297 #define EFFECT_UNUSED_297 297
#define EFFECT_BUG_BITE 298 #define EFFECT_UNUSED_298 298
#define EFFECT_STRENGTH_SAP 299 #define EFFECT_STRENGTH_SAP 299
#define EFFECT_MIND_BLOWN 300 #define EFFECT_MIND_BLOWN 300
#define EFFECT_PURIFY 301 #define EFFECT_PURIFY 301
@ -355,11 +355,11 @@
#define EFFECT_SHELL_TRAP 351 #define EFFECT_SHELL_TRAP 351
#define EFFECT_PSYBLADE 352 #define EFFECT_PSYBLADE 352
#define EFFECT_HYDRO_STEAM 353 #define EFFECT_HYDRO_STEAM 353
#define EFFECT_HIT_SET_ENTRY_HAZARD 354 #define EFFECT_UNUSED_354 354
#define EFFECT_BARB_BARRAGE 355 #define EFFECT_UNUSED_355 355
#define EFFECT_REVIVAL_BLESSING 356 #define EFFECT_REVIVAL_BLESSING 356
#define EFFECT_SNOWSCAPE 357 #define EFFECT_SNOWSCAPE 357
#define EFFECT_INFERNAL_PARADE 358 #define EFFECT_UNUSED_358 358
#define EFFECT_TAKE_HEART 359 #define EFFECT_TAKE_HEART 359
#define EFFECT_COLLISION_COURSE 360 #define EFFECT_COLLISION_COURSE 360
#define EFFECT_MAKE_IT_RAIN 361 #define EFFECT_MAKE_IT_RAIN 361

View File

@ -1006,10 +1006,24 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
} }
} }
// check things that aren't move effects (recoil)
if (gBattleMoves[move].recoil > 0)
{
if (AI_IsDamagedByRecoil(battlerAtk))
{
u32 recoilDmg = max(1, aiData->simulatedDmg[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] * max(1, gBattleMoves[move].recoil) / 100);
if (!ShouldUseRecoilMove(battlerAtk, battlerDef, recoilDmg, AI_THINKING_STRUCT->movesetIndex))
ADJUST_SCORE(-10);
}
}
// check move effects // check move effects
switch (moveEffect) switch (moveEffect)
{ {
case EFFECT_HIT: case EFFECT_HIT: // only applies to Vital Throw
if (gBattleMoves[move].priority < 0 && AI_STRIKES_FIRST(battlerAtk, battlerDef, move) && aiData->hpPercents[battlerAtk] < 40)
ADJUST_SCORE(-1); // don't want to move last
break;
default: default:
break; // check move damage break; // check move damage
case EFFECT_SLEEP: case EFFECT_SLEEP:
@ -1361,7 +1375,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
} }
break; break;
//case EFFECT_BIDE: //case EFFECT_BIDE:
//case EFFECT_RECHARGE:
//case EFFECT_COUNTER: //case EFFECT_COUNTER:
case EFFECT_PRESENT: case EFFECT_PRESENT:
case EFFECT_SONICBOOM: case EFFECT_SONICBOOM:
@ -1856,15 +1869,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
if (aiData->abilities[battlerAtk] != ABILITY_MAGIC_GUARD && AI_DATA->moveAccuracy[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] < 75) if (aiData->abilities[battlerAtk] != ABILITY_MAGIC_GUARD && AI_DATA->moveAccuracy[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] < 75)
ADJUST_SCORE(-6); ADJUST_SCORE(-6);
break; 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: case EFFECT_TEETER_DANCE:
if (((gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) if (((gBattleMons[battlerDef].status2 & STATUS2_CONFUSION)
|| (!DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move) && aiData->abilities[battlerDef] == ABILITY_OWN_TEMPO) || (!DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move) && aiData->abilities[battlerDef] == ABILITY_OWN_TEMPO)
@ -2056,7 +2060,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|| ((aiData->abilities[battlerDef] == ABILITY_CONTRARY) && !IS_TARGETING_PARTNER(battlerAtk, battlerDef))) // don't want to raise target stats unless its your partner || ((aiData->abilities[battlerDef] == ABILITY_CONTRARY) && !IS_TARGETING_PARTNER(battlerAtk, battlerDef))) // don't want to raise target stats unless its your partner
ADJUST_SCORE(-10); ADJUST_SCORE(-10);
break; break;
case EFFECT_PSYCH_UP: // haze stats check case EFFECT_PSYCH_UP: // haze stats check
{ {
for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++)
@ -2392,8 +2395,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|| PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove))
ADJUST_SCORE(-10); ADJUST_SCORE(-10);
break; break;
case EFFECT_THROAT_CHOP:
break;
case EFFECT_HEAL_BLOCK: case EFFECT_HEAL_BLOCK:
if (gDisableStructs[battlerDef].healBlockTimer != 0 if (gDisableStructs[battlerDef].healBlockTimer != 0
|| PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove))
@ -2475,7 +2476,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
if (instructedMove == MOVE_NONE if (instructedMove == MOVE_NONE
|| gBattleMoves[instructedMove].instructBanned || gBattleMoves[instructedMove].instructBanned
|| gBattleMoves[instructedMove].twoTurnMove || gBattleMoves[instructedMove].twoTurnMove
|| gBattleMoves[instructedMove].effect == EFFECT_RECHARGE || MoveHasMoveEffectSelf(instructedMove, MOVE_EFFECT_RECHARGE)
|| IsZMove(instructedMove) || IsZMove(instructedMove)
|| (gLockedMoves[battlerDef] != 0 && gLockedMoves[battlerDef] != 0xFFFF) || (gLockedMoves[battlerDef] != 0 && gLockedMoves[battlerDef] != 0xFFFF)
|| gBattleMons[battlerDef].status2 & STATUS2_MULTIPLETURNS || gBattleMons[battlerDef].status2 & STATUS2_MULTIPLETURNS
@ -2566,10 +2567,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
if (aiData->hpPercents[battlerDef] < 50) if (aiData->hpPercents[battlerDef] < 50)
ADJUST_SCORE(-1); ADJUST_SCORE(-1);
break; 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: case EFFECT_FLAIL:
if (AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_SLOWER // Opponent should go first if (AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_SLOWER // Opponent should go first
|| aiData->hpPercents[battlerAtk] > 50) || aiData->hpPercents[battlerAtk] > 50)
@ -2700,7 +2697,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
case EFFECT_PERISH_SONG: case EFFECT_PERISH_SONG:
if (!(gBattleMons[battlerDef].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED))) 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); ADJUST_SCORE(1);
} }
break; break;
@ -3549,7 +3546,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
break; break;
case EFFECT_TOXIC: case EFFECT_TOXIC:
case EFFECT_POISON: case EFFECT_POISON:
case EFFECT_BARB_BARRAGE:
IncreasePoisonScore(battlerAtk, battlerDef, move, &score); IncreasePoisonScore(battlerAtk, battlerDef, move, &score);
break; break;
case EFFECT_LIGHT_SCREEN: case EFFECT_LIGHT_SCREEN:
@ -3591,14 +3587,8 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
if (gStatuses3[battlerAtk] & STATUS3_ALWAYS_HITS) if (gStatuses3[battlerAtk] & STATUS3_ALWAYS_HITS)
ADJUST_SCORE(5); ADJUST_SCORE(5);
break; break;
case EFFECT_TRAP:
if (HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN))
break;
//fallthrough
case EFFECT_MEAN_LOOK: case EFFECT_MEAN_LOOK:
if (IsBattlerTrapped(battlerDef, TRUE)) if (!IsBattlerTrapped(battlerDef, TRUE) && ShouldTrap(battlerAtk, battlerDef, move))
break; // in this case its a bad attacking move
else if (ShouldTrap(battlerAtk, battlerDef, move))
ADJUST_SCORE(5); ADJUST_SCORE(5);
break; break;
case EFFECT_MIST: case EFFECT_MIST:
@ -3847,15 +3837,10 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
break; break;
case EFFECT_SPIKES: case EFFECT_SPIKES:
case EFFECT_HIT_SET_ENTRY_HAZARD:
case EFFECT_STEALTH_ROCK: case EFFECT_STEALTH_ROCK:
case EFFECT_STICKY_WEB: case EFFECT_STICKY_WEB:
case EFFECT_TOXIC_SPIKES: case EFFECT_TOXIC_SPIKES:
if (aiData->abilities[battlerDef] == ABILITY_MAGIC_BOUNCE || CountUsablePartyMons(battlerDef) == 0) score += AI_ShouldSetUpHazards(aiData, battlerAtk, battlerDef);
break;
if (gDisableStructs[battlerAtk].isFirstTurn)
ADJUST_SCORE(2);
//TODO - track entire opponent party data to determine hazard effectiveness
break; break;
case EFFECT_FORESIGHT: case EFFECT_FORESIGHT:
if (aiData->abilities[battlerAtk] == ABILITY_SCRAPPY || aiData->abilities[battlerAtk] == ABILITY_MINDS_EYE) if (aiData->abilities[battlerAtk] == ABILITY_SCRAPPY || aiData->abilities[battlerAtk] == ABILITY_MINDS_EYE)
@ -4522,10 +4507,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
break; break;
}*/ }*/
break; break;
case EFFECT_FEINT:
if (gBattleMoves[predictedMove].effect == EFFECT_PROTECT)
ADJUST_SCORE(3);
break;
case EFFECT_EMBARGO: case EFFECT_EMBARGO:
if (aiData->holdEffects[battlerDef] != HOLD_EFFECT_NONE) if (aiData->holdEffects[battlerDef] != HOLD_EFFECT_NONE)
ADJUST_SCORE(1); ADJUST_SCORE(1);
@ -4539,12 +4520,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|| !IsBattlerGrounded(battlerDef)) || !IsBattlerGrounded(battlerDef))
ADJUST_SCORE(1); ADJUST_SCORE(1);
break; 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: case EFFECT_HEAL_BLOCK:
if (AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_FASTER && predictedMove != MOVE_NONE && IsHealingMoveEffect(gBattleMoves[predictedMove].effect)) if (AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_FASTER && predictedMove != MOVE_NONE && IsHealingMoveEffect(gBattleMoves[predictedMove].effect))
ADJUST_SCORE(3); // Try to cancel healing move ADJUST_SCORE(3); // Try to cancel healing move
@ -4623,16 +4598,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
&& !IS_MOVE_STATUS(move) && AI_GetTypeEffectiveness(predictedMove, battlerDef, battlerAtk) != AI_EFFECTIVENESS_x0) && !IS_MOVE_STATUS(move) && AI_GetTypeEffectiveness(predictedMove, battlerDef, battlerAtk) != AI_EFFECTIVENESS_x0)
ADJUST_SCORE(1); ADJUST_SCORE(1);
break; 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: case EFFECT_TOXIC_THREAD:
IncreasePoisonScore(battlerAtk, battlerDef, move, &score); IncreasePoisonScore(battlerAtk, battlerDef, move, &score);
IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPEED, &score); IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPEED, &score);
@ -4859,6 +4824,34 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
break; break;
} }
break; break;
case MOVE_EFFECT_STEALTH_ROCK:
case MOVE_EFFECT_SPIKES:
score += AI_ShouldSetUpHazards(aiData, battlerAtk, battlerDef);
break;
case MOVE_EFFECT_FEINT:
if (gBattleMoves[predictedMove].effect == EFFECT_PROTECT)
ADJUST_SCORE(3);
break;
case MOVE_EFFECT_THROAT_CHOP:
if (predictedMove != MOVE_NONE && gBattleMoves[predictedMove].soundMove && AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_FASTER)
ADJUST_SCORE(3); // Ai goes first and predicts the target will use a sound move
else if (HasSoundMove(battlerDef))
ADJUST_SCORE(3);
break;
case MOVE_EFFECT_FLAME_BURST:
if (isDoubleBattle)
{
if (IsBattlerAlive(BATTLE_PARTNER(battlerDef))
&& aiData->hpPercents[BATTLE_PARTNER(battlerDef)] < 12
&& aiData->abilities[BATTLE_PARTNER(battlerDef)] != ABILITY_MAGIC_GUARD
&& !IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerDef), TYPE_FIRE))
ADJUST_SCORE(1);
}
break;
case MOVE_EFFECT_WRAP:
if (!HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN) && !IsBattlerTrapped(battlerDef, TRUE) && ShouldTrap(battlerAtk, battlerDef, move))
ADJUST_SCORE(5);
break;
} }
} }
} }
@ -4869,6 +4862,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
// Effects that are encouraged on the first turn of battle // Effects that are encouraged on the first turn of battle
static s32 AI_SetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) static s32 AI_SetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
{ {
u8 i;
if (IS_TARGETING_PARTNER(battlerAtk, battlerDef) if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)
|| gBattleResults.battleTurnCounter != 0) || gBattleResults.battleTurnCounter != 0)
return score; return score;
@ -4967,19 +4961,33 @@ static s32 AI_SetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
case EFFECT_SNOWSCAPE: case EFFECT_SNOWSCAPE:
case EFFECT_GEOMANCY: case EFFECT_GEOMANCY:
case EFFECT_VICTORY_DANCE: case EFFECT_VICTORY_DANCE:
case EFFECT_HIT_SET_ENTRY_HAZARD:
ADJUST_SCORE(2); ADJUST_SCORE(2);
break; break;
default: default:
break; break;
} }
// Consider move effects
for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++)
{
switch (gBattleMoves[move].additionalEffects[i].moveEffect)
{
case MOVE_EFFECT_STEALTH_ROCK:
case MOVE_EFFECT_SPIKES:
ADJUST_SCORE(2);
break;
default:
break;
}
}
return score; return score;
} }
// Adds score bonus to 'riskier' move effects and high crit moves // Adds score bonus to 'riskier' move effects and high crit moves
static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
{ {
u8 i;
if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) if (IS_TARGETING_PARTNER(battlerAtk, battlerDef))
return score; return score;
@ -5000,7 +5008,6 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
case EFFECT_SWAGGER: case EFFECT_SWAGGER:
case EFFECT_ATTRACT: case EFFECT_ATTRACT:
case EFFECT_PRESENT: case EFFECT_PRESENT:
case EFFECT_ALL_STATS_UP_HIT:
case EFFECT_BELLY_DRUM: case EFFECT_BELLY_DRUM:
case EFFECT_MIRROR_COAT: case EFFECT_MIRROR_COAT:
case EFFECT_FOCUS_PUNCH: case EFFECT_FOCUS_PUNCH:
@ -5013,6 +5020,20 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
break; break;
} }
// Consider move effects
for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++)
{
switch (gBattleMoves[move].additionalEffects[i].moveEffect)
{
case MOVE_EFFECT_ALL_STATS_UP:
if (Random() & 1)
ADJUST_SCORE(2);
break;
default:
break;
}
}
return score; return score;
} }

View File

@ -954,15 +954,17 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s
u32 abilityDef = AI_DATA->abilities[battlerDef]; u32 abilityDef = AI_DATA->abilities[battlerDef];
u8 i; u8 i;
// recoil
if (gBattleMoves[move].recoil > 0 && AI_IsDamagedByRecoil(battlerAtk))
return TRUE;
switch (gBattleMoves[move].effect) switch (gBattleMoves[move].effect)
{ {
case EFFECT_RECHARGE:
case EFFECT_MAKE_IT_RAIN: case EFFECT_MAKE_IT_RAIN:
case EFFECT_MIND_BLOWN: case EFFECT_MIND_BLOWN:
case EFFECT_STEEL_BEAM: case EFFECT_STEEL_BEAM:
return TRUE; return TRUE;
case EFFECT_RECOIL_IF_MISS: case EFFECT_RECOIL_IF_MISS:
case EFFECT_RECOIL:
if (AI_IsDamagedByRecoil(battlerAtk)) if (AI_IsDamagedByRecoil(battlerAtk))
return TRUE; return TRUE;
break; break;
@ -985,6 +987,8 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s
|| (noOfHitsToKo != 1 && abilityDef == ABILITY_CONTRARY && !IsMoldBreakerTypeAbility(abilityAtk))) || (noOfHitsToKo != 1 && abilityDef == ABILITY_CONTRARY && !IsMoldBreakerTypeAbility(abilityAtk)))
return TRUE; return TRUE;
break; break;
case MOVE_EFFECT_RECHARGE:
return gBattleMoves[move].additionalEffects[i].self;
} }
} }
break; break;
@ -1494,7 +1498,6 @@ bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move)
// increased accuracy but don't always hit // increased accuracy but don't always hit
if ((((weather & B_WEATHER_RAIN) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) 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))) || (((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) || (B_MINIMIZE_DMG_ACC >= GEN_6 && (gStatuses3[battlerDef] & STATUS3_MINIMIZED) && gBattleMoves[move].minimizeDoubleDamage)
|| (gBattleMoves[move].accuracy == 0)) || (gBattleMoves[move].accuracy == 0))
{ {
@ -2080,18 +2083,17 @@ bool32 HasHealingEffect(u32 battlerId)
return FALSE; return FALSE;
} }
bool32 IsTrappingMoveEffect(u32 effect) bool32 IsTrappingMove(u32 move)
{ {
switch (effect) switch (gBattleMoves[move].effect)
{ {
case EFFECT_MEAN_LOOK: case EFFECT_MEAN_LOOK:
case EFFECT_TRAP:
case EFFECT_HIT_PREVENT_ESCAPE:
case EFFECT_FAIRY_LOCK: case EFFECT_FAIRY_LOCK:
//case EFFECT_NO_RETREAT: // TODO //case EFFECT_NO_RETREAT: // TODO
return TRUE; return TRUE;
default: default:
return FALSE; return MoveHasMoveEffect(move, MOVE_EFFECT_PREVENT_ESCAPE, FALSE)
|| MoveHasMoveEffect(move, MOVE_EFFECT_WRAP, FALSE);
} }
} }
@ -2102,7 +2104,7 @@ bool32 HasTrappingMoveEffect(u32 battler)
for (i = 0; i < MAX_MON_MOVES; i++) 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; return TRUE;
} }
@ -3666,8 +3668,8 @@ void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score)
if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_STALL && HasMoveEffect(battlerAtk, EFFECT_PROTECT)) if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_STALL && HasMoveEffect(battlerAtk, EFFECT_PROTECT))
ADJUST_SCORE_PTR(1); // stall tactic ADJUST_SCORE_PTR(1); // stall tactic
if (HasMoveEffect(battlerAtk, EFFECT_VENOSHOCK) if ((HasMoveEffect(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS)
|| HasMoveEffect(battlerAtk, EFFECT_HEX) && gBattleMoves[move].argument & STATUS1_PSN_ANY)
|| HasMoveEffect(battlerAtk, EFFECT_VENOM_DRENCH) || HasMoveEffect(battlerAtk, EFFECT_VENOM_DRENCH)
|| AI_DATA->abilities[battlerAtk] == ABILITY_MERCILESS) || AI_DATA->abilities[battlerAtk] == ABILITY_MERCILESS)
ADJUST_SCORE_PTR(2); ADJUST_SCORE_PTR(2);
@ -3691,7 +3693,10 @@ void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score)
ADJUST_SCORE_PTR(2); // burning the target to stay alive is cool ADJUST_SCORE_PTR(2); // burning the target to stay alive is cool
} }
if (HasMoveEffect(battlerAtk, EFFECT_HEX) || HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_HEX)) if ((HasMoveEffect(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS)
&& gBattleMoves[move].argument & STATUS1_BURN)
|| (HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS)
&& gBattleMoves[move].argument & STATUS1_BURN))
ADJUST_SCORE_PTR(1); ADJUST_SCORE_PTR(1);
} }
} }
@ -3708,7 +3713,8 @@ void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score)
u32 defSpeed = AI_DATA->speedStats[battlerDef]; u32 defSpeed = AI_DATA->speedStats[battlerDef];
if ((defSpeed >= atkSpeed && defSpeed / 2 < atkSpeed) // You'll go first after paralyzing foe if ((defSpeed >= atkSpeed && defSpeed / 2 < atkSpeed) // You'll go first after paralyzing foe
|| HasMoveEffect(battlerAtk, EFFECT_HEX) || (HasMoveEffect(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS)
&& gBattleMoves[move].argument & STATUS1_PARALYSIS)
|| HasMoveWithMoveEffect(battlerAtk, MOVE_EFFECT_FLINCH, TRUE) // filter out Fake Out || HasMoveWithMoveEffect(battlerAtk, MOVE_EFFECT_FLINCH, TRUE) // filter out Fake Out
|| gBattleMons[battlerDef].status2 & STATUS2_INFATUATION || gBattleMons[battlerDef].status2 & STATUS2_INFATUATION
|| gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) || gBattleMons[battlerDef].status2 & STATUS2_CONFUSION)
@ -3733,7 +3739,10 @@ void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score)
&& !(HasMoveEffect(battlerDef, EFFECT_SNORE) || HasMoveEffect(battlerDef, EFFECT_SLEEP_TALK))) && !(HasMoveEffect(battlerDef, EFFECT_SNORE) || HasMoveEffect(battlerDef, EFFECT_SLEEP_TALK)))
ADJUST_SCORE_PTR(1); ADJUST_SCORE_PTR(1);
if (HasMoveEffect(battlerAtk, EFFECT_HEX) || HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_HEX)) if ((HasMoveEffect(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS)
&& gBattleMoves[move].argument & STATUS1_SLEEP)
|| (HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS)
&& gBattleMoves[move].argument & STATUS1_SLEEP))
ADJUST_SCORE_PTR(1); ADJUST_SCORE_PTR(1);
} }
@ -3770,7 +3779,10 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score
ADJUST_SCORE_PTR(2); // frostbiting the target to stay alive is cool ADJUST_SCORE_PTR(2); // frostbiting the target to stay alive is cool
} }
if (HasMoveEffect(battlerAtk, EFFECT_HEX) || HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_HEX)) if ((HasMoveEffect(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS)
&& gBattleMoves[move].argument & STATUS1_FROSTBITE)
|| (HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS)
&& gBattleMoves[move].argument & STATUS1_FROSTBITE))
ADJUST_SCORE_PTR(1); ADJUST_SCORE_PTR(1);
} }
} }
@ -3856,3 +3868,12 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef)
return FALSE; return FALSE;
} }
//TODO - track entire opponent party data to determine hazard effectiveness
u32 AI_ShouldSetUpHazards(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef)
{
if (aiData->abilities[battlerDef] == ABILITY_MAGIC_BOUNCE || CountUsablePartyMons(battlerDef) == 0)
return 0;
return 2 * gDisableStructs[battlerAtk].isFirstTurn;
}

View File

@ -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_SLEEP:
case EFFECT_CONFUSE: case EFFECT_CONFUSE:
case EFFECT_DISABLE: case EFFECT_DISABLE:
@ -4063,7 +4062,7 @@ static bool32 IsDomeStatusMoveEffect(u32 effect)
case EFFECT_CURSE: case EFFECT_CURSE:
return TRUE; return TRUE;
default: default:
return FALSE; return MoveHasMoveEffect(move, MOVE_EFFECT_WRAP, FALSE);
} }
} }
@ -4365,7 +4364,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId)
allocatedArray[k] = IsDomeRiskyMoveEffect(gBattleMoves[move].effect) ? 1 : 0; allocatedArray[k] = IsDomeRiskyMoveEffect(gBattleMoves[move].effect) ? 1 : 0;
break; break;
case MOVE_POINTS_STATUS: case MOVE_POINTS_STATUS:
allocatedArray[k] = IsDomeStatusMoveEffect(gBattleMoves[move].effect) ? 1 : 0; allocatedArray[k] = IsDomeStatusMoveEffect(move);
break; break;
case MOVE_POINTS_DMG: case MOVE_POINTS_DMG:
allocatedArray[k] = (gBattleMoves[move].power != 0) ? 1 : 0; allocatedArray[k] = (gBattleMoves[move].power != 0) ? 1 : 0;

View File

@ -971,20 +971,16 @@ static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX /
static const u16 sFinalStrikeOnlyEffects[] = static const u16 sFinalStrikeOnlyEffects[] =
{ {
EFFECT_RELIC_SONG, MOVE_EFFECT_BUG_BITE,
EFFECT_BUG_BITE, MOVE_EFFECT_STEAL_ITEM,
EFFECT_THIEF, MOVE_EFFECT_BURN_UP,
EFFECT_BURN_UP, MOVE_EFFECT_DOUBLE_SHOCK,
EFFECT_DOUBLE_SHOCK, MOVE_EFFECT_SECRET_POWER,
EFFECT_SECRET_POWER, MOVE_EFFECT_SMACK_DOWN,
EFFECT_SMACK_DOWN, MOVE_EFFECT_REMOVE_STATUS,
EFFECT_SPARKLING_ARIA, MOVE_EFFECT_RECOIL_HP_25,
EFFECT_SMELLING_SALTS, MOVE_EFFECT_PREVENT_ESCAPE,
EFFECT_WAKE_UP_SLAP, MOVE_EFFECT_WRAP,
EFFECT_HIT_ESCAPE,
EFFECT_RECOIL_HP_25,
EFFECT_HIT_PREVENT_ESCAPE,
EFFECT_HIT_SWITCH_TARGET,
}; };
static const u16 sNaturePowerMoves[BATTLE_TERRAIN_COUNT] = static const u16 sNaturePowerMoves[BATTLE_TERRAIN_COUNT] =
@ -1602,12 +1598,6 @@ static bool32 AccuracyCalcHelper(u16 move)
} }
} }
if (gBattleMoves[move].effect == EFFECT_VITAL_THROW)
{
JumpIfMoveFailed(7, move);
return TRUE;
}
if (B_MINIMIZE_DMG_ACC >= GEN_6 if (B_MINIMIZE_DMG_ACC >= GEN_6
&& (gStatuses3[gBattlerTarget] & STATUS3_MINIMIZED) && (gStatuses3[gBattlerTarget] & STATUS3_MINIMIZED)
&& gBattleMoves[move].minimizeDoubleDamage) && gBattleMoves[move].minimizeDoubleDamage)
@ -2769,7 +2759,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT
&& gBattleMons[gBattlerTarget].hp != 0 && gBattleMons[gBattlerTarget].hp != 0
&& IsFinalStrikeEffect(gCurrentMove)) && IsFinalStrikeEffect(gBattleScripting.moveEffect))
{ {
gBattlescriptCurrInstr++; gBattlescriptCurrInstr++;
return; return;
@ -5413,14 +5403,12 @@ static void Cmd_moveend(void)
&& IsBattlerAlive(gBattlerAttacker) && IsBattlerAlive(gBattlerAttacker)
&& gBattleScripting.savedDmg != 0) // Some checks may be redundant alongside this one && 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); gBattleMoveDamage = max(1, gBattleScripting.savedDmg * max(1, gBattleMoves[gCurrentMove].recoil) / 100);
BattleScriptPushCursor(); BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil;
effect = TRUE; effect = TRUE;
break;
} }
} }
gBattleScripting.moveendState++; gBattleScripting.moveendState++;
@ -9549,7 +9537,7 @@ static void Cmd_various(void)
{ {
VARIOUS_ARGS(const u8 *failInstr); VARIOUS_ARGS(const u8 *failInstr);
u16 move = gLastPrintedMoves[gBattlerTarget]; 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)) || gBattleMoves[move].instructBanned || gBattleMoves[move].twoTurnMove || IsDynamaxed(gBattlerTarget))
{ {
gBattlescriptCurrInstr = cmd->failInstr; gBattlescriptCurrInstr = cmd->failInstr;

View File

@ -121,13 +121,11 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
// [EFFECT_RAZOR_WIND] = 1, // [EFFECT_RAZOR_WIND] = 1,
[EFFECT_SUPER_FANG] = 5, [EFFECT_SUPER_FANG] = 5,
[EFFECT_DRAGON_RAGE] = 2, [EFFECT_DRAGON_RAGE] = 2,
[EFFECT_TRAP] = 4,
// [EFFECT_HIGH_CRITICAL] = 1, // [EFFECT_HIGH_CRITICAL] = 1,
// [EFFECT_DOUBLE_HIT] = 1, // [EFFECT_DOUBLE_HIT] = 1,
[EFFECT_RECOIL_IF_MISS] = 1, [EFFECT_RECOIL_IF_MISS] = 1,
[EFFECT_MIST] = 5, [EFFECT_MIST] = 5,
[EFFECT_FOCUS_ENERGY] = 1, [EFFECT_FOCUS_ENERGY] = 1,
[EFFECT_RECOIL] = 2,
[EFFECT_CONFUSE] = 4, [EFFECT_CONFUSE] = 4,
[EFFECT_ATTACK_UP_2] = 1, [EFFECT_ATTACK_UP_2] = 1,
[EFFECT_DEFENSE_UP_2] = 1, [EFFECT_DEFENSE_UP_2] = 1,
@ -149,9 +147,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_PARALYZE] = 4, [EFFECT_PARALYZE] = 4,
// [EFFECT_SKY_ATTACK] = 4, // [EFFECT_SKY_ATTACK] = 4,
// [EFFECT_TWINEEDLE] = 1, // [EFFECT_TWINEEDLE] = 1,
[EFFECT_VITAL_THROW] = 1,
[EFFECT_SUBSTITUTE] = 4, [EFFECT_SUBSTITUTE] = 4,
[EFFECT_RECHARGE] = 5,
[EFFECT_RAGE] = 2, [EFFECT_RAGE] = 2,
[EFFECT_MIMIC] = 4, [EFFECT_MIMIC] = 4,
[EFFECT_METRONOME] = 1, [EFFECT_METRONOME] = 1,
@ -175,7 +171,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_HEAL_BELL] = 5, [EFFECT_HEAL_BELL] = 5,
// [EFFECT_QUICK_ATTACK] = 1, // [EFFECT_QUICK_ATTACK] = 1,
[EFFECT_TRIPLE_KICK] = 1, [EFFECT_TRIPLE_KICK] = 1,
[EFFECT_THIEF] = 4,
[EFFECT_MEAN_LOOK] = 5, [EFFECT_MEAN_LOOK] = 5,
[EFFECT_NIGHTMARE] = 3, [EFFECT_NIGHTMARE] = 3,
[EFFECT_MINIMIZE] = 1, [EFFECT_MINIMIZE] = 1,
@ -194,7 +189,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_PRESENT] = 1, [EFFECT_PRESENT] = 1,
[EFFECT_FRUSTRATION] = 1, [EFFECT_FRUSTRATION] = 1,
[EFFECT_SAFEGUARD] = 5, [EFFECT_SAFEGUARD] = 5,
// [EFFECT_THAW_HIT] = 1, Now unused
[EFFECT_MAGNITUDE] = 1, [EFFECT_MAGNITUDE] = 1,
[EFFECT_BATON_PASS] = 7, [EFFECT_BATON_PASS] = 7,
[EFFECT_PURSUIT] = 2, [EFFECT_PURSUIT] = 2,
@ -235,7 +229,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_MEMENTO] = 7, [EFFECT_MEMENTO] = 7,
[EFFECT_FACADE] = 1, [EFFECT_FACADE] = 1,
[EFFECT_FOCUS_PUNCH] = 7, [EFFECT_FOCUS_PUNCH] = 7,
[EFFECT_SMELLING_SALTS] = 1, [EFFECT_DOUBLE_POWER_ON_ARG_STATUS] = 1,
[EFFECT_FOLLOW_ME] = 5, [EFFECT_FOLLOW_ME] = 5,
[EFFECT_NATURE_POWER] = 0, [EFFECT_NATURE_POWER] = 0,
[EFFECT_CHARGE] = 4, [EFFECT_CHARGE] = 4,
@ -260,7 +254,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_GRUDGE] = 1, [EFFECT_GRUDGE] = 1,
[EFFECT_SNATCH] = 1, [EFFECT_SNATCH] = 1,
[EFFECT_LOW_KICK] = 1, [EFFECT_LOW_KICK] = 1,
[EFFECT_SECRET_POWER] = 1,
[EFFECT_TEETER_DANCE] = 6, [EFFECT_TEETER_DANCE] = 6,
// [EFFECT_BLAZE_KICK] = 1, // [EFFECT_BLAZE_KICK] = 1,
[EFFECT_MUD_SPORT] = 4, [EFFECT_MUD_SPORT] = 4,
@ -277,9 +270,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_PLEDGE] = 0, // TODO: Assign points [EFFECT_PLEDGE] = 0, // TODO: Assign points
[EFFECT_FLING] = 0, // TODO: Assign points [EFFECT_FLING] = 0, // TODO: Assign points
[EFFECT_NATURAL_GIFT] = 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_WRING_OUT] = 0, // TODO: Assign points
[EFFECT_HEX] = 0, // TODO: Assign points
[EFFECT_ASSURANCE] = 0, // TODO: Assign points [EFFECT_ASSURANCE] = 0, // TODO: Assign points
[EFFECT_TRUMP_CARD] = 0, // TODO: Assign points [EFFECT_TRUMP_CARD] = 0, // TODO: Assign points
[EFFECT_ACROBATICS] = 0, // TODO: Assign points [EFFECT_ACROBATICS] = 0, // TODO: Assign points
@ -292,7 +283,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_PAYBACK] = 0, // TODO: Assign points [EFFECT_PAYBACK] = 0, // TODO: Assign points
[EFFECT_ROUND] = 0, // TODO: Assign points [EFFECT_ROUND] = 0, // TODO: Assign points
[EFFECT_BRINE] = 0, // TODO: Assign points [EFFECT_BRINE] = 0, // TODO: Assign points
[EFFECT_VENOSHOCK] = 0, // TODO: Assign points
[EFFECT_RETALIATE] = 0, // TODO: Assign points [EFFECT_RETALIATE] = 0, // TODO: Assign points
[EFFECT_BULLDOZE] = 0, // TODO: Assign points [EFFECT_BULLDOZE] = 0, // TODO: Assign points
[EFFECT_FOUL_PLAY] = 0, // TODO: Assign points [EFFECT_FOUL_PLAY] = 0, // TODO: Assign points
@ -356,23 +346,17 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_COPYCAT] = 0, // TODO: Assign points [EFFECT_COPYCAT] = 0, // TODO: Assign points
[EFFECT_DEFOG] = 0, // TODO: Assign points [EFFECT_DEFOG] = 0, // TODO: Assign points
[EFFECT_HIT_ENEMY_HEAL_ALLY] = 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_SYNCHRONOISE] = 0, // TODO: Assign points
[EFFECT_PSYCHO_SHIFT] = 0, // TODO: Assign points [EFFECT_PSYCHO_SHIFT] = 0, // TODO: Assign points
[EFFECT_POWER_TRICK] = 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_AFTER_YOU] = 0, // TODO: Assign points
[EFFECT_BESTOW] = 0, // TODO: Assign points [EFFECT_BESTOW] = 0, // TODO: Assign points
[EFFECT_ROTOTILLER] = 0, // TODO: Assign points [EFFECT_ROTOTILLER] = 0, // TODO: Assign points
[EFFECT_FLOWER_SHIELD] = 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_SPEED_SWAP] = 0, // TODO: Assign points
[EFFECT_DEFENSE_UP2_HIT] = 0, // TODO: Assign points
[EFFECT_REVELATION_DANCE] = 0, // TODO: Assign points [EFFECT_REVELATION_DANCE] = 0, // TODO: Assign points
[EFFECT_AURORA_VEIL] = 0, // TODO: Assign points [EFFECT_AURORA_VEIL] = 0, // TODO: Assign points
[EFFECT_THIRD_TYPE] = 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_ACUPRESSURE] = 0, // TODO: Assign points
[EFFECT_AROMATIC_MIST] = 0, // TODO: Assign points [EFFECT_AROMATIC_MIST] = 0, // TODO: Assign points
[EFFECT_POWDER] = 0, // TODO: Assign points [EFFECT_POWDER] = 0, // TODO: Assign points
@ -381,16 +365,12 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_MAT_BLOCK] = 0, // TODO: Assign points [EFFECT_MAT_BLOCK] = 0, // TODO: Assign points
[EFFECT_STOMPING_TANTRUM] = 0, // TODO: Assign points [EFFECT_STOMPING_TANTRUM] = 0, // TODO: Assign points
[EFFECT_INSTRUCT] = 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_LASER_FOCUS] = 0, // TODO: Assign points
[EFFECT_MAGNETIC_FLUX] = 0, // TODO: Assign points [EFFECT_MAGNETIC_FLUX] = 0, // TODO: Assign points
[EFFECT_GEAR_UP] = 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_STRENGTH_SAP] = 0, // TODO: Assign points
[EFFECT_MIND_BLOWN] = 0, // TODO: Assign points [EFFECT_MIND_BLOWN] = 0, // TODO: Assign points
[EFFECT_PURIFY] = 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_SHORE_UP] = 0, // TODO: Assign points
[EFFECT_GEOMANCY] = 0, // TODO: Assign points [EFFECT_GEOMANCY] = 0, // TODO: Assign points
[EFFECT_FAIRY_LOCK] = 0, // TODO: Assign points [EFFECT_FAIRY_LOCK] = 0, // TODO: Assign points
@ -1129,7 +1109,7 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc
tvPtr->pos[defSide][GetBattlerPosition(gBattlerAttacker) / 2].attackedByMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->pos[defSide][GetBattlerPosition(gBattlerAttacker) / 2].attackedByMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
tvPtr->pos[defSide][GetBattlerPosition(gBattlerAttacker) / 2].attackedByMoveSlot = moveSlot; tvPtr->pos[defSide][GetBattlerPosition(gBattlerAttacker) / 2].attackedByMoveSlot = moveSlot;
tvPtr->side[atkSide].usedMoveSlot = 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); AddPointsBasedOnWeather(weatherFlags, move, moveSlot);
if (disableStructPtr->chargeTimer != 0) if (disableStructPtr->chargeTimer != 0)
AddMovePoints(PTS_ELECTRIC, move, moveSlot, 0); AddMovePoints(PTS_ELECTRIC, move, moveSlot, 0);
@ -1291,7 +1271,26 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3)
switch (caseId) switch (caseId)
{ {
case PTS_MOVE_EFFECT: case PTS_MOVE_EFFECT: //arg1 == moveSlot, arg2 == move
{
u8 baseFromEffect = sPointsArray[caseId][gBattleMoves[arg2].effect];
// various cases add/remove points
if (gBattleMoves[arg2].recoil > 0)
baseFromEffect++; // recoil moves
if (MoveHasMoveEffect(arg2, MOVE_EFFECT_SP_ATK_TWO_DOWN, FALSE)
|| MoveHasMoveEffect(arg2, MOVE_EFFECT_ATK_DEF_DOWN, FALSE))
baseFromEffect += 2; // Overheat etc & Superpower
if (MoveHasMoveEffect(arg2, MOVE_EFFECT_STEAL_ITEM, FALSE))
baseFromEffect += 3;
if (MoveHasMoveEffect(arg2, MOVE_EFFECT_WRAP, FALSE))
baseFromEffect += 3;
if (MoveHasMoveEffect(arg2, MOVE_EFFECT_RECHARGE, FALSE))
baseFromEffect += 4;
movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += baseFromEffect;
break;
}
case PTS_EFFECTIVENESS: case PTS_EFFECTIVENESS:
case PTS_CRITICAL_HIT: case PTS_CRITICAL_HIT:
case PTS_STAT_INCREASE_1: case PTS_STAT_INCREASE_1:

View File

@ -8830,22 +8830,14 @@ static inline u32 CalcMoveBasePower(u32 move, u32 battlerAtk, u32 battlerDef, u3
case EFFECT_NATURAL_GIFT: case EFFECT_NATURAL_GIFT:
basePower = gNaturalGiftTable[ITEM_TO_BERRY(gBattleMons[battlerAtk].item)].power; basePower = gNaturalGiftTable[ITEM_TO_BERRY(gBattleMons[battlerAtk].item)].power;
break; break;
case EFFECT_WAKE_UP_SLAP: case EFFECT_DOUBLE_POWER_ON_ARG_STATUS:
if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP || abilityDef == ABILITY_COMATOSE) // Comatose targets treated as if asleep
basePower *= 2; if ((gBattleMons[battlerDef].status1 | (STATUS1_SLEEP * (abilityDef == ABILITY_COMATOSE))) & gBattleMoves[move].argument)
break;
case EFFECT_SMELLING_SALTS:
if (gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS)
basePower *= 2; basePower *= 2;
break; break;
case EFFECT_WRING_OUT: case EFFECT_WRING_OUT:
basePower = 120 * gBattleMons[battlerDef].hp / gBattleMons[battlerDef].maxHP; basePower = 120 * gBattleMons[battlerDef].hp / gBattleMons[battlerDef].maxHP;
break; break;
case EFFECT_HEX:
case EFFECT_INFERNAL_PARADE:
if (gBattleMons[battlerDef].status1 & STATUS1_ANY || abilityDef == ABILITY_COMATOSE)
basePower *= 2;
break;
case EFFECT_ASSURANCE: case EFFECT_ASSURANCE:
if (gProtectStructs[battlerDef].physicalDmg != 0 || gProtectStructs[battlerDef].specialDmg != 0 || gProtectStructs[battlerDef].confusionSelfDmg) if (gProtectStructs[battlerDef].physicalDmg != 0 || gProtectStructs[battlerDef].specialDmg != 0 || gProtectStructs[battlerDef].confusionSelfDmg)
basePower *= 2; basePower *= 2;
@ -9032,11 +9024,6 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32
if (gBattleMons[battlerDef].hp <= (gBattleMons[battlerDef].maxHP / 2)) if (gBattleMons[battlerDef].hp <= (gBattleMons[battlerDef].maxHP / 2))
modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); modifier = uq4_12_multiply(modifier, UQ_4_12(2.0));
break; 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: case EFFECT_RETALIATE:
if (gSideTimers[atkSide].retaliateTimer == 1) if (gSideTimers[atkSide].retaliateTimer == 1)
modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); modifier = uq4_12_multiply(modifier, UQ_4_12(2.0));

View File

@ -110,7 +110,7 @@ static const u16 sWeatherChangingMoves[] = {
MOVE_SUNNY_DAY, MOVE_SUNNY_DAY,
}; };
// EFFECT_RECHARGE, EFFECT_RECOIL // MOVE_EFFECT_RECHARGE, recoil
static const u16 sPowerfulNormalMoves[] = { static const u16 sPowerfulNormalMoves[] = {
MOVE_HYPER_BEAM, MOVE_HYPER_BEAM,
MOVE_GIGA_IMPACT, MOVE_GIGA_IMPACT,

View File

@ -316,7 +316,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_BIND] = [MOVE_BIND] =
{ {
.effect = EFFECT_TRAP, .effect = EFFECT_HIT,
.power = 15, .power = 15,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 75, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 75,
@ -564,7 +564,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_WRAP] = [MOVE_WRAP] =
{ {
.effect = EFFECT_TRAP, .effect = EFFECT_HIT,
.power = 15, .power = 15,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 85, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 85,
@ -580,7 +580,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_TAKE_DOWN] = [MOVE_TAKE_DOWN] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_HIT,
.power = 90, .power = 90,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 85, .accuracy = 85,
@ -613,7 +613,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_DOUBLE_EDGE] = [MOVE_DOUBLE_EDGE] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_HIT,
.power = 120, .power = 120,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 100, .accuracy = 100,
@ -1043,7 +1043,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_HYPER_BEAM] = [MOVE_HYPER_BEAM] =
{ {
.effect = EFFECT_RECHARGE, .effect = EFFECT_HIT,
.power = 150, .power = 150,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 90, .accuracy = 90,
@ -1090,7 +1090,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
#else #else
.pp = 25, .pp = 25,
#endif #endif
.effect = EFFECT_RECOIL, .effect = EFFECT_HIT,
.power = 80, .power = 80,
.type = TYPE_FIGHTING, .type = TYPE_FIGHTING,
.accuracy = 80, .accuracy = 80,
@ -1363,7 +1363,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_FIRE_SPIN] = [MOVE_FIRE_SPIN] =
{ {
.effect = EFFECT_TRAP, .effect = EFFECT_HIT,
.power = B_UPDATED_MOVE_DATA >= GEN_5 ? 35 : 15, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 35 : 15,
.type = TYPE_FIRE, .type = TYPE_FIRE,
.accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 70, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 70,
@ -2118,7 +2118,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_CLAMP] = [MOVE_CLAMP] =
{ {
.effect = EFFECT_TRAP, .effect = EFFECT_HIT,
.power = 35, .power = 35,
.type = TYPE_WATER, .type = TYPE_WATER,
.accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 75, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 75,
@ -2746,21 +2746,24 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_STRUGGLE] = [MOVE_STRUGGLE] =
{ {
#if B_UPDATED_MOVE_DATA >= GEN_4 #if B_UPDATED_MOVE_DATA >= GEN_4
.accuracy = 0,
.effect = EFFECT_RECOIL_HP_25, .effect = EFFECT_RECOIL_HP_25,
.accuracy = 0,
.mirrorMoveBanned = TRUE,
ADDITIONAL_EFFECTS(
PRIMARY_EFFECT_SELF(MOVE_EFFECT_RECOIL_HP_25)
),
#else #else
.effect = EFFECT_HIT,
.accuracy = 100, .accuracy = 100,
.effect = EFFECT_RECOIL, .recoil = 25,
#endif #endif
.power = 50, .power = 50,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.recoil = 25,
.pp = 1, .pp = 1,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.category = BATTLE_CATEGORY_PHYSICAL, .category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE, .makesContact = TRUE,
.mirrorMoveBanned = B_UPDATED_MOVE_FLAGS >= GEN_4,
.meFirstBanned = TRUE, .meFirstBanned = TRUE,
.mimicBanned = TRUE, .mimicBanned = TRUE,
.metronomeBanned = TRUE, .metronomeBanned = TRUE,
@ -2817,7 +2820,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 40, .power = 40,
.pp = 10, .pp = 10,
#endif #endif
.effect = EFFECT_THIEF, .effect = EFFECT_HIT,
.type = TYPE_DARK, .type = TYPE_DARK,
.accuracy = 100, .accuracy = 100,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
@ -3924,7 +3927,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_VITAL_THROW] = [MOVE_VITAL_THROW] =
{ {
.effect = EFFECT_VITAL_THROW, .effect = EFFECT_HIT,
.power = 70, .power = 70,
.type = TYPE_FIGHTING, .type = TYPE_FIGHTING,
.accuracy = 0, .accuracy = 0,
@ -4219,7 +4222,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_WHIRLPOOL] = [MOVE_WHIRLPOOL] =
{ {
.effect = EFFECT_TRAP, .effect = EFFECT_HIT,
.power = B_UPDATED_MOVE_DATA >= GEN_5 ? 35 : 15, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 35 : 15,
.type = TYPE_WATER, .type = TYPE_WATER,
.accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 70, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 70,
@ -4477,12 +4480,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_SMELLING_SALTS] = [MOVE_SMELLING_SALTS] =
{ {
#if B_UPDATED_MOVE_DATA >= GEN_6 .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS,
.power = 70, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 70 : 60,
#else
.power = 60,
#endif
.effect = EFFECT_SMELLING_SALTS,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 100, .accuracy = 100,
.pp = 10, .pp = 10,
@ -4491,21 +4490,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.category = BATTLE_CATEGORY_PHYSICAL, .category = BATTLE_CATEGORY_PHYSICAL,
.argument = STATUS1_PARALYSIS, .argument = STATUS1_PARALYSIS,
.makesContact = TRUE, .makesContact = TRUE,
ADDITIONAL_EFFECTS(
PRIMARY_EFFECT(MOVE_EFFECT_REMOVE_STATUS)
),
}, },
[MOVE_FOLLOW_ME] = [MOVE_FOLLOW_ME] =
{ {
#if B_UPDATED_MOVE_DATA >= GEN_6
.priority = 2,
#else
.priority = 3,
#endif
.effect = EFFECT_FOLLOW_ME, .effect = EFFECT_FOLLOW_ME,
.power = 0, .power = 0,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 100, .accuracy = 100,
.pp = 20, .pp = 20,
.target = MOVE_TARGET_USER, .target = MOVE_TARGET_USER,
.priority = B_UPDATED_MOVE_DATA >= GEN_6 ? 2 : 3,
.category = BATTLE_CATEGORY_STATUS, .category = BATTLE_CATEGORY_STATUS,
.zMove = { .effect = Z_EFFECT_RESET_STATS }, .zMove = { .effect = Z_EFFECT_RESET_STATS },
.ignoresProtect = TRUE, .ignoresProtect = TRUE,
@ -4764,12 +4762,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_KNOCK_OFF] = [MOVE_KNOCK_OFF] =
{ {
#if B_UPDATED_MOVE_DATA >= GEN_6
.power = 65,
#else
.power = 20,
#endif
.effect = EFFECT_KNOCK_OFF, .effect = EFFECT_KNOCK_OFF,
.power = B_UPDATED_MOVE_DATA >= GEN_6 ? 65 : 20,
.type = TYPE_DARK, .type = TYPE_DARK,
.accuracy = 100, .accuracy = 100,
.pp = 20, .pp = 20,
@ -4892,7 +4886,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_SECRET_POWER] = [MOVE_SECRET_POWER] =
{ {
.effect = EFFECT_SECRET_POWER, .effect = EFFECT_HIT,
.power = 70, .power = 70,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 100, .accuracy = 100,
@ -5176,7 +5170,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_BLAST_BURN] = [MOVE_BLAST_BURN] =
{ {
.effect = EFFECT_RECHARGE, .effect = EFFECT_HIT,
.power = 150, .power = 150,
.type = TYPE_FIRE, .type = TYPE_FIRE,
.accuracy = 90, .accuracy = 90,
@ -5191,7 +5185,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_HYDRO_CANNON] = [MOVE_HYDRO_CANNON] =
{ {
.effect = EFFECT_RECHARGE, .effect = EFFECT_HIT,
.power = 150, .power = 150,
.type = TYPE_WATER, .type = TYPE_WATER,
.accuracy = 90, .accuracy = 90,
@ -5523,7 +5517,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_SAND_TOMB] = [MOVE_SAND_TOMB] =
{ {
.effect = EFFECT_TRAP, .effect = EFFECT_HIT,
.power = B_UPDATED_MOVE_DATA >= GEN_5 ? 35 : 15, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 35 : 15,
.type = TYPE_GROUND, .type = TYPE_GROUND,
.accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 70, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 70,
@ -5683,7 +5677,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_FRENZY_PLANT] = [MOVE_FRENZY_PLANT] =
{ {
.effect = EFFECT_RECHARGE, .effect = EFFECT_HIT,
.power = 150, .power = 150,
.type = TYPE_GRASS, .type = TYPE_GRASS,
.accuracy = 90, .accuracy = 90,
@ -5771,7 +5765,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_COVET] = [MOVE_COVET] =
{ {
.effect = EFFECT_THIEF, .effect = EFFECT_HIT,
.power = B_UPDATED_MOVE_DATA >= GEN_5 ? 60 : 40, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 60 : 40,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 100, .accuracy = 100,
@ -5791,7 +5785,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_VOLT_TACKLE] = [MOVE_VOLT_TACKLE] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_HIT,
.power = 120, .power = 120,
.type = TYPE_ELECTRIC, .type = TYPE_ELECTRIC,
.accuracy = 100, .accuracy = 100,
@ -6023,12 +6017,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_WAKE_UP_SLAP] = [MOVE_WAKE_UP_SLAP] =
{ {
#if B_UPDATED_MOVE_DATA >= GEN_6 .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS,
.power = 70, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 70 : 60,
#else
.power = 60,
#endif
.effect = EFFECT_WAKE_UP_SLAP,
.type = TYPE_FIGHTING, .type = TYPE_FIGHTING,
.accuracy = 100, .accuracy = 100,
.pp = 10, .pp = 10,
@ -6037,6 +6027,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.category = BATTLE_CATEGORY_PHYSICAL, .category = BATTLE_CATEGORY_PHYSICAL,
.argument = STATUS1_SLEEP, .argument = STATUS1_SLEEP,
.makesContact = TRUE, .makesContact = TRUE,
ADDITIONAL_EFFECTS(
PRIMARY_EFFECT(MOVE_EFFECT_REMOVE_STATUS)
),
}, },
[MOVE_HAMMER_ARM] = [MOVE_HAMMER_ARM] =
@ -6112,7 +6105,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_FEINT] = [MOVE_FEINT] =
{ {
.effect = EFFECT_FEINT, .effect = EFFECT_HIT,
.power = B_UPDATED_MOVE_DATA >= GEN_5 ? 30 : 50, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 30 : 50,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 100, .accuracy = 100,
@ -6132,7 +6125,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_PLUCK] = [MOVE_PLUCK] =
{ {
.effect = EFFECT_BUG_BITE, .effect = EFFECT_HIT,
.power = 60, .power = 60,
.type = TYPE_FLYING, .type = TYPE_FLYING,
.accuracy = 100, .accuracy = 100,
@ -6586,7 +6579,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_FLARE_BLITZ] = [MOVE_FLARE_BLITZ] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_HIT,
.power = 120, .power = 120,
.type = TYPE_FIRE, .type = TYPE_FIRE,
.accuracy = 100, .accuracy = 100,
@ -6906,7 +6899,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_BRAVE_BIRD] = [MOVE_BRAVE_BIRD] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_HIT,
.power = 120, .power = 120,
.type = TYPE_FLYING, .type = TYPE_FLYING,
.accuracy = 100, .accuracy = 100,
@ -6953,7 +6946,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_GIGA_IMPACT] = [MOVE_GIGA_IMPACT] =
{ {
.effect = EFFECT_RECHARGE, .effect = EFFECT_HIT,
.power = 150, .power = 150,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 90, .accuracy = 90,
@ -7311,7 +7304,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_ROCK_WRECKER] = [MOVE_ROCK_WRECKER] =
{ {
.effect = EFFECT_RECHARGE, .effect = EFFECT_HIT,
.power = 150, .power = 150,
.type = TYPE_ROCK, .type = TYPE_ROCK,
.accuracy = 90, .accuracy = 90,
@ -7500,7 +7493,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_BUG_BITE] = [MOVE_BUG_BITE] =
{ {
.effect = EFFECT_BUG_BITE, .effect = EFFECT_HIT,
.power = 60, .power = 60,
.type = TYPE_BUG, .type = TYPE_BUG,
.accuracy = 100, .accuracy = 100,
@ -7532,7 +7525,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_WOOD_HAMMER] = [MOVE_WOOD_HAMMER] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_HIT,
.power = 120, .power = 120,
.type = TYPE_GRASS, .type = TYPE_GRASS,
.accuracy = 100, .accuracy = 100,
@ -7605,7 +7598,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_HEAD_SMASH] = [MOVE_HEAD_SMASH] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_HIT,
.power = 150, .power = 150,
.type = TYPE_ROCK, .type = TYPE_ROCK,
.accuracy = 80, .accuracy = 80,
@ -7633,7 +7626,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_ROAR_OF_TIME] = [MOVE_ROAR_OF_TIME] =
{ {
.effect = EFFECT_RECHARGE, .effect = EFFECT_HIT,
.power = 150, .power = 150,
.type = TYPE_DRAGON, .type = TYPE_DRAGON,
.accuracy = 90, .accuracy = 90,
@ -7701,7 +7694,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 120, .power = 120,
.accuracy = 70, .accuracy = 70,
#endif #endif
.effect = EFFECT_TRAP, .effect = EFFECT_HIT,
.type = TYPE_FIRE, .type = TYPE_FIRE,
.pp = 5, .pp = 5,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
@ -7880,7 +7873,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_VENOSHOCK] = [MOVE_VENOSHOCK] =
{ {
.effect = EFFECT_VENOSHOCK, .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS,
.power = 65, .power = 65,
.type = TYPE_POISON, .type = TYPE_POISON,
.accuracy = 100, .accuracy = 100,
@ -7888,6 +7881,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.category = BATTLE_CATEGORY_SPECIAL, .category = BATTLE_CATEGORY_SPECIAL,
.argument = STATUS1_PSN_ANY,
}, },
[MOVE_AUTOTOMIZE] = [MOVE_AUTOTOMIZE] =
@ -8395,18 +8389,15 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_HEX] = [MOVE_HEX] =
{ {
#if B_UPDATED_MOVE_DATA >= GEN_6 .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS,
.power = 65, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 65 : 50,
#else
.power = 50,
#endif
.effect = EFFECT_HEX,
.type = TYPE_GHOST, .type = TYPE_GHOST,
.accuracy = 100, .accuracy = 100,
.pp = 10, .pp = 10,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.category = BATTLE_CATEGORY_SPECIAL, .category = BATTLE_CATEGORY_SPECIAL,
.argument = STATUS1_ANY,
}, },
[MOVE_SKY_DROP] = [MOVE_SKY_DROP] =
@ -8465,7 +8456,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
#else #else
.power = 30, .power = 30,
#endif #endif
.effect = EFFECT_INCINERATE, .effect = EFFECT_HIT,
.type = TYPE_FIRE, .type = TYPE_FIRE,
.accuracy = 100, .accuracy = 100,
.pp = 15, .pp = 15,
@ -8746,7 +8737,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_WILD_CHARGE] = [MOVE_WILD_CHARGE] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_HIT,
.power = 90, .power = 90,
.type = TYPE_ELECTRIC, .type = TYPE_ELECTRIC,
.accuracy = 100, .accuracy = 100,
@ -8984,7 +8975,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_HEAD_CHARGE] = [MOVE_HEAD_CHARGE] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_HIT,
.power = 120, .power = 120,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 100, .accuracy = 100,
@ -9807,7 +9798,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_HYPERSPACE_HOLE] = [MOVE_HYPERSPACE_HOLE] =
{ {
.effect = EFFECT_FEINT, .effect = EFFECT_HIT,
.power = 80, .power = 80,
.type = TYPE_PSYCHIC, .type = TYPE_PSYCHIC,
.accuracy = 0, .accuracy = 0,
@ -9818,6 +9809,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.ignoresProtect = TRUE, .ignoresProtect = TRUE,
.ignoresSubstitute = TRUE, .ignoresSubstitute = TRUE,
.metronomeBanned = TRUE, .metronomeBanned = TRUE,
ADDITIONAL_EFFECTS(
PRIMARY_EFFECT(MOVE_EFFECT_FEINT)
),
}, },
[MOVE_WATER_SHURIKEN] = [MOVE_WATER_SHURIKEN] =
@ -10100,7 +10094,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_INFESTATION] = [MOVE_INFESTATION] =
{ {
.effect = EFFECT_TRAP, .effect = EFFECT_HIT,
.power = 20, .power = 20,
.type = TYPE_BUG, .type = TYPE_BUG,
.accuracy = 100, .accuracy = 100,
@ -10167,7 +10161,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_THOUSAND_WAVES] = [MOVE_THOUSAND_WAVES] =
{ {
.effect = EFFECT_HIT_PREVENT_ESCAPE, .effect = EFFECT_HIT,
.power = 90, .power = 90,
.type = TYPE_GROUND, .type = TYPE_GROUND,
.accuracy = 100, .accuracy = 100,
@ -10197,7 +10191,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_LIGHT_OF_RUIN] = [MOVE_LIGHT_OF_RUIN] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_HIT,
.power = 140, .power = 140,
.type = TYPE_FAIRY, .type = TYPE_FAIRY,
.accuracy = 90, .accuracy = 90,
@ -10327,7 +10321,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_SPIRIT_SHACKLE] = [MOVE_SPIRIT_SHACKLE] =
{ {
.effect = EFFECT_HIT_PREVENT_ESCAPE, .effect = EFFECT_HIT,
.power = 80, .power = 80,
.type = TYPE_GHOST, .type = TYPE_GHOST,
.accuracy = 100, .accuracy = 100,
@ -10357,7 +10351,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_SPARKLING_ARIA] = [MOVE_SPARKLING_ARIA] =
{ {
.effect = EFFECT_SPARKLING_ARIA, .effect = EFFECT_HIT,
.power = 90, .power = 90,
.type = TYPE_WATER, .type = TYPE_WATER,
.accuracy = 100, .accuracy = 100,
@ -10369,6 +10363,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.sheerForceBoost = TRUE, .sheerForceBoost = TRUE,
.ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6,
.soundMove = TRUE, .soundMove = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_REMOVE_STATUS, 100)
),
}, },
[MOVE_ICE_HAMMER] = [MOVE_ICE_HAMMER] =
@ -10529,7 +10526,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_THROAT_CHOP] = [MOVE_THROAT_CHOP] =
{ {
.effect = EFFECT_THROAT_CHOP, .effect = EFFECT_HIT,
.power = 80, .power = 80,
.type = TYPE_DARK, .type = TYPE_DARK,
.accuracy = 100, .accuracy = 100,
@ -10539,6 +10536,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.category = BATTLE_CATEGORY_PHYSICAL, .category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE, .makesContact = TRUE,
.sheerForceBoost = TRUE, .sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_THROAT_CHOP, 100)
),
}, },
[MOVE_POLLEN_PUFF] = [MOVE_POLLEN_PUFF] =
@ -10556,7 +10556,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_ANCHOR_SHOT] = [MOVE_ANCHOR_SHOT] =
{ {
.effect = EFFECT_HIT_PREVENT_ESCAPE, .effect = EFFECT_HIT,
.power = 80, .power = 80,
.type = TYPE_STEEL, .type = TYPE_STEEL,
.accuracy = 100, .accuracy = 100,
@ -10942,7 +10942,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_PRISMATIC_LASER] = [MOVE_PRISMATIC_LASER] =
{ {
.effect = EFFECT_RECHARGE, .effect = EFFECT_HIT,
.power = 160, .power = 160,
.type = TYPE_PSYCHIC, .type = TYPE_PSYCHIC,
.accuracy = 100, .accuracy = 100,
@ -11639,7 +11639,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_SNAP_TRAP] = [MOVE_SNAP_TRAP] =
{ {
.effect = EFFECT_TRAP, .effect = EFFECT_HIT,
.power = 35, .power = 35,
.type = TYPE_GRASS, .type = TYPE_GRASS,
.accuracy = 100, .accuracy = 100,
@ -11893,7 +11893,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_METEOR_ASSAULT] = [MOVE_METEOR_ASSAULT] =
{ {
.effect = EFFECT_RECHARGE, .effect = EFFECT_HIT,
.power = 150, .power = 150,
.type = TYPE_FIGHTING, .type = TYPE_FIGHTING,
.accuracy = 100, .accuracy = 100,
@ -11910,7 +11910,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_ETERNABEAM] = [MOVE_ETERNABEAM] =
{ {
.effect = EFFECT_RECHARGE, .effect = EFFECT_HIT,
.power = 160, .power = 160,
.type = TYPE_DRAGON, .type = TYPE_DRAGON,
.accuracy = 90, .accuracy = 90,
@ -12261,7 +12261,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_THUNDER_CAGE] = [MOVE_THUNDER_CAGE] =
{ {
.effect = EFFECT_TRAP, .effect = EFFECT_HIT,
.power = 80, .power = 80,
.type = TYPE_ELECTRIC, .type = TYPE_ELECTRIC,
.accuracy = 90, .accuracy = 90,
@ -12440,7 +12440,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_STONE_AXE] = [MOVE_STONE_AXE] =
{ {
.effect = EFFECT_HIT_SET_ENTRY_HAZARD, .effect = EFFECT_HIT,
.power = 65, .power = 65,
.type = TYPE_ROCK, .type = TYPE_ROCK,
.accuracy = 90, .accuracy = 90,
@ -12509,7 +12509,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_WAVE_CRASH] = [MOVE_WAVE_CRASH] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_HIT,
.power = B_UPDATED_MOVE_DATA >= GEN_9 ? 120 : 75, .power = B_UPDATED_MOVE_DATA >= GEN_9 ? 120 : 75,
.type = TYPE_WATER, .type = TYPE_WATER,
.accuracy = 100, .accuracy = 100,
@ -12585,19 +12585,16 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_BARB_BARRAGE] = [MOVE_BARB_BARRAGE] =
{ {
.effect = EFFECT_BARB_BARRAGE, .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS,
.power = 60, .power = 60,
.type = TYPE_POISON, .type = TYPE_POISON,
.accuracy = 100, .accuracy = 100,
#if B_UPDATED_MOVE_DATA >= GEN_9 .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 10 : 15,
.pp = 10,
#else
.pp = 15,
#endif
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.category = BATTLE_CATEGORY_PHYSICAL, .category = BATTLE_CATEGORY_PHYSICAL,
.sheerForceBoost = TRUE, .sheerForceBoost = TRUE,
.argument = STATUS1_PSN_ANY,
ADDITIONAL_EFFECTS( ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_POISON, 50) SECONDARY_EFFECT(MOVE_EFFECT_POISON, 50)
), ),
@ -12685,7 +12682,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_INFERNAL_PARADE] = [MOVE_INFERNAL_PARADE] =
{ {
.effect = EFFECT_INFERNAL_PARADE, .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS,
.power = 60, .power = 60,
.type = TYPE_GHOST, .type = TYPE_GHOST,
.accuracy = 100, .accuracy = 100,
@ -12693,6 +12690,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.category = BATTLE_CATEGORY_SPECIAL, .category = BATTLE_CATEGORY_SPECIAL,
.argument = STATUS1_ANY,
.sheerForceBoost = TRUE, .sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS( ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_BURN, 30) SECONDARY_EFFECT(MOVE_EFFECT_BURN, 30)
@ -12701,7 +12699,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_CEASELESS_EDGE] = [MOVE_CEASELESS_EDGE] =
{ {
.effect = EFFECT_HIT_SET_ENTRY_HAZARD, .effect = EFFECT_HIT,
.power = 65, .power = 65,
.type = TYPE_DARK, .type = TYPE_DARK,
.accuracy = 90, .accuracy = 90,

View File

@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Sheer Force boosts power, but removes secondary effects of m
MESSAGE("Wobbuffet flinched!"); MESSAGE("Wobbuffet flinched!");
} }
// Volt Tackle/Flare Blitz edge case: recoil happens, but target isn't statused // 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); HP_BAR(player);
MESSAGE("Tauros is hit with recoil!"); MESSAGE("Tauros is hit with recoil!");

View File

@ -36,7 +36,8 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Smelling Salt")
GIVEN { GIVEN {
ASSUME(B_UPDATED_MOVE_DATA >= GEN_6); 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); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_WOBBUFFET) { HP(60); Status1(status1); } PLAYER(SPECIES_WOBBUFFET) { HP(60); Status1(status1); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_BODY_SLAM, MOVE_SMELLING_SALTS); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_BODY_SLAM, MOVE_SMELLING_SALTS); }
@ -54,10 +55,12 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Wake Up Slap")
PARAMETRIZE { status1 = STATUS1_NONE; expectedMove = MOVE_BODY_SLAM; } PARAMETRIZE { status1 = STATUS1_NONE; expectedMove = MOVE_BODY_SLAM; }
PARAMETRIZE { status1 = STATUS1_SLEEP; expectedMove = MOVE_WAKE_UP_SLAP; } PARAMETRIZE { status1 = STATUS1_SLEEP; expectedMove = MOVE_WAKE_UP_SLAP; }
PARAMETRIZE { status1 = STATUS1_SLEEP; expectedMove = MOVE_WAKE_UP_SLAP; }
GIVEN { GIVEN {
ASSUME(B_UPDATED_MOVE_DATA >= GEN_6); 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); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_MEGANIUM) { HP(35); Status1(status1); } PLAYER(SPECIES_MEGANIUM) { HP(35); Status1(status1); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_BODY_SLAM, MOVE_WAKE_UP_SLAP); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_BODY_SLAM, MOVE_WAKE_UP_SLAP); }

View File

@ -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_THIEF; }
PARAMETRIZE { move = MOVE_COVET; } PARAMETRIZE { move = MOVE_COVET; }
GIVEN { GIVEN {
ASSUME(gBattleMoves[move].effect == EFFECT_THIEF); ASSUME(MoveHasMoveEffect(move, MOVE_EFFECT_STEAL_ITEM, FALSE) == TRUE);
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); }; PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); };
OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET);
} WHEN { } WHEN {

View File

@ -170,7 +170,7 @@ SINGLE_BATTLE_TEST("Red Card does not activate if stolen by a move")
bool32 activate; bool32 activate;
PARAMETRIZE { item = ITEM_NONE; activate = FALSE; } PARAMETRIZE { item = ITEM_NONE; activate = FALSE; }
PARAMETRIZE { item = ITEM_POTION; activate = TRUE; } PARAMETRIZE { item = ITEM_POTION; activate = TRUE; }
ASSUME(gBattleMoves[MOVE_THIEF].effect == EFFECT_THIEF); ASSUME(MoveHasMoveEffect(MOVE_THIEF, MOVE_EFFECT_STEAL_ITEM, FALSE) == TRUE);
GIVEN { GIVEN {
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); }

View File

@ -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 KNOWN_FAILING; // Knock off fails, Thief is fine
GIVEN { GIVEN {
ASSUME(gBattleMoves[MOVE_THIEF].effect == EFFECT_THIEF); ASSUME(MoveHasMoveEffect(MOVE_THIEF, MOVE_EFFECT_STEAL_ITEM, FALSE) == TRUE);
ASSUME(gBattleMoves[MOVE_KNOCK_OFF].effect == EFFECT_KNOCK_OFF); ASSUME(gBattleMoves[MOVE_KNOCK_OFF].effect == EFFECT_KNOCK_OFF);
PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); }
OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET);

View File

@ -3,7 +3,8 @@
ASSUMPTIONS ASSUMPTIONS
{ {
ASSUME(gBattleMoves[MOVE_BARB_BARRAGE].effect == EFFECT_BARB_BARRAGE); ASSUME(gBattleMoves[MOVE_BARB_BARRAGE].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS);
ASSUME(gBattleMoves[MOVE_BARB_BARRAGE].argument == STATUS1_PSN_ANY);
ASSUME(MoveHasMoveEffect(MOVE_BARB_BARRAGE, MOVE_EFFECT_POISON, FALSE) == TRUE); ASSUME(MoveHasMoveEffect(MOVE_BARB_BARRAGE, MOVE_EFFECT_POISON, FALSE) == TRUE);
} }

View File

@ -3,7 +3,8 @@
ASSUMPTIONS 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) SINGLE_BATTLE_TEST("Hex deals double damage to foes with a status", s16 damage)

View File

@ -3,8 +3,8 @@
ASSUMPTIONS ASSUMPTIONS
{ {
ASSUME(gBattleMoves[MOVE_STONE_AXE].effect == EFFECT_HIT_SET_ENTRY_HAZARD); ASSUME(MoveHasMoveEffect(MOVE_STONE_AXE, MOVE_EFFECT_STEALTH_ROCK, FALSE) == TRUE);
ASSUME(gBattleMoves[MOVE_CEASELESS_EDGE].effect == EFFECT_HIT_SET_ENTRY_HAZARD); ASSUME(MoveHasMoveEffect(MOVE_CEASELESS_EDGE, MOVE_EFFECT_SPIKES, FALSE) == TRUE);
} }
SINGLE_BATTLE_TEST("Stone Axe / Ceaseless Edge set up hazards after hitting the target") SINGLE_BATTLE_TEST("Stone Axe / Ceaseless Edge set up hazards after hitting the target")

View File

@ -3,10 +3,11 @@
ASSUMPTIONS 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 { GIVEN {
PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET);

View File

@ -206,10 +206,10 @@ SINGLE_BATTLE_TEST("Recoil damage is not applied if target was protected")
GIVEN { GIVEN {
ASSUME(gBattleMoves[MOVE_VOLT_TACKLE].effect == EFFECT_RECOIL); ASSUME(gBattleMoves[MOVE_VOLT_TACKLE].recoil > 0);
ASSUME(gBattleMoves[MOVE_HEAD_SMASH].effect == EFFECT_RECOIL); ASSUME(gBattleMoves[MOVE_HEAD_SMASH].recoil > 0);
ASSUME(gBattleMoves[MOVE_TAKE_DOWN].effect == EFFECT_RECOIL); ASSUME(gBattleMoves[MOVE_TAKE_DOWN].recoil > 0);
ASSUME(gBattleMoves[MOVE_DOUBLE_EDGE].effect == EFFECT_RECOIL); ASSUME(gBattleMoves[MOVE_DOUBLE_EDGE].recoil > 0);
PLAYER(SPECIES_RAPIDASH); PLAYER(SPECIES_RAPIDASH);
OPPONENT(SPECIES_BEAUTIFLY); OPPONENT(SPECIES_BEAUTIFLY);
} WHEN { } WHEN {

View File

@ -7,7 +7,6 @@ SINGLE_BATTLE_TEST("Take Down deals 25% of recoil damage to the user")
s16 recoilDamage; s16 recoilDamage;
GIVEN { GIVEN {
ASSUME(gBattleMoves[MOVE_TAKE_DOWN].effect == EFFECT_RECOIL);
ASSUME(gBattleMoves[MOVE_TAKE_DOWN].recoil == 25); ASSUME(gBattleMoves[MOVE_TAKE_DOWN].recoil == 25);
PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET);
@ -28,7 +27,6 @@ SINGLE_BATTLE_TEST("Double Edge deals 33% of recoil damage to the user")
s16 recoilDamage; s16 recoilDamage;
GIVEN { GIVEN {
ASSUME(gBattleMoves[MOVE_DOUBLE_EDGE].effect == EFFECT_RECOIL);
ASSUME(gBattleMoves[MOVE_DOUBLE_EDGE].recoil == 33); ASSUME(gBattleMoves[MOVE_DOUBLE_EDGE].recoil == 33);
PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET);
@ -49,7 +47,6 @@ SINGLE_BATTLE_TEST("Head Smash deals 50% of recoil damage to the user")
s16 recoilDamage; s16 recoilDamage;
GIVEN { GIVEN {
ASSUME(gBattleMoves[MOVE_HEAD_SMASH].effect == EFFECT_RECOIL);
ASSUME(gBattleMoves[MOVE_HEAD_SMASH].recoil == 50); ASSUME(gBattleMoves[MOVE_HEAD_SMASH].recoil == 50);
PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET);
OPPONENT(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; s16 recoilDamage;
GIVEN { GIVEN {
ASSUME(gBattleMoves[MOVE_FLARE_BLITZ].effect == EFFECT_RECOIL);
ASSUME(gBattleMoves[MOVE_FLARE_BLITZ].recoil == 33); ASSUME(gBattleMoves[MOVE_FLARE_BLITZ].recoil == 33);
ASSUME(gBattleMoves[MOVE_FLARE_BLITZ].argument == STATUS1_BURN); ASSUME(gBattleMoves[MOVE_FLARE_BLITZ].argument == STATUS1_BURN);
PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET);

View File

@ -3,7 +3,8 @@
ASSUMPTIONS 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) SINGLE_BATTLE_TEST("Venoshock's power doubles if the target is poisoned/badly poisoned", s16 damage)