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

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_STATUS(move)(gBattleMoves[move].category == BATTLE_CATEGORY_STATUS)
#define IS_EFFECT_RECOIL(effect)(effect == EFFECT_RECOIL || effect == EFFECT_RECOIL_IF_MISS)
#define IS_MOVE_RECOIL(move)(IS_EFFECT_RECOIL(gBattleMoves[move].effect))
#define IS_MOVE_RECOIL(move)(gBattleMoves[move].recoil > 0 || gBattleMoves[move].effect == EFFECT_RECOIL_IF_MISS)
#define BATTLER_MAX_HP(battlerId)(gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP)
#define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0) || (gBattleStruct->enduredDamage & gBitTable[gBattlerTarget]))

View File

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

View File

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

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Sheer Force boosts power, but removes secondary effects of m
MESSAGE("Wobbuffet flinched!");
}
// Volt Tackle/Flare Blitz edge case: recoil happens, but target isn't statused
if (gBattleMoves[move].effect == EFFECT_RECOIL)
if (gBattleMoves[move].recoil > 0)
{
HP_BAR(player);
MESSAGE("Tauros is hit with recoil!");

View File

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

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

View File

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

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

View File

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

View File

@ -3,7 +3,8 @@
ASSUMPTIONS
{
ASSUME(gBattleMoves[MOVE_HEX].effect == EFFECT_HEX);
ASSUME(gBattleMoves[MOVE_HEX].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS);
ASSUME(gBattleMoves[MOVE_HEX].argument == STATUS1_ANY);
}
SINGLE_BATTLE_TEST("Hex deals double damage to foes with a status", s16 damage)

View File

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

View File

@ -3,10 +3,11 @@
ASSUMPTIONS
{
ASSUME(gBattleMoves[MOVE_INFERNAL_PARADE].effect == EFFECT_INFERNAL_PARADE);
ASSUME(gBattleMoves[MOVE_INFERNAL_PARADE].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS);
ASSUME(gBattleMoves[MOVE_INFERNAL_PARADE].argument == STATUS1_ANY);
}
SINGLE_BATTLE_TEST("Infernal Parade inflicts poison")
SINGLE_BATTLE_TEST("Infernal Parade inflicts burn")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);

View File

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

View File

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

View File

@ -3,7 +3,8 @@
ASSUMPTIONS
{
ASSUME(gBattleMoves[MOVE_VENOSHOCK].effect == EFFECT_VENOSHOCK);
ASSUME(gBattleMoves[MOVE_VENOSHOCK].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS);
ASSUME(gBattleMoves[MOVE_VENOSHOCK].argument == STATUS1_PSN_ANY);
}
SINGLE_BATTLE_TEST("Venoshock's power doubles if the target is poisoned/badly poisoned", s16 damage)