Battlemove refactored (recoil, crit and Z moves) (#3575)

* Unified EFFECT_RECOIL

Combined EFFECT_RECOIL_25/33/50/33_STATUS into a single EFFECT; added an extra field to BattleMove 'secondaryData' that contains the franction of HP recoil; argument still holds status effect for Flare Blitz/Volt Tackle

* BattleMove struct change

Added critrate, recoil, multihit fields, made zMove into a union of effect/powerOverride for status/non-status moves respectively. Added new recoil field and zMove field to all moves. To-do: crit rate, multihit

* Critrate field added

Moves use a critRate field instead of a flag - obsoletes EFFECT_ALWAYS_CRIT

* Just a little define

Makes clear that critBoost = 3 means ALWAYS CRIT

* Added a proper recoil field

Just to make it unambiguous and flexible - can finally have a move with 69% recoil.

* Fixed AI damage calculation for multi-strike moves

* Fixes + removed unused effects

* Tests fixes

Two to fix: pass when run in isolation but not when the whole group is run, which is annoying...

* Minor fixes

* Minor tweaks

* Fixed move effects

* recoil tests

---------

Co-authored-by: Alex <alexthenotes@gmail.com>
This commit is contained in:
Nephrite 2023-12-20 00:10:07 +09:00 committed by GitHub
parent 74a6b8764c
commit 4a1a6c5625
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 808 additions and 1367 deletions

View File

@ -69,7 +69,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectRecoilIfMiss @ EFFECT_RECOIL_IF_MISS
.4byte BattleScript_EffectMist @ EFFECT_MIST
.4byte BattleScript_EffectFocusEnergy @ EFFECT_FOCUS_ENERGY
.4byte BattleScript_EffectHit @ EFFECT_RECOIL_25
.4byte BattleScript_EffectHit @ EFFECT_RECOIL
.4byte BattleScript_EffectConfuse @ EFFECT_CONFUSE
.4byte BattleScript_EffectAttackUp2 @ EFFECT_ATTACK_UP_2
.4byte BattleScript_EffectDefenseUp2 @ EFFECT_DEFENSE_UP_2
@ -123,7 +123,6 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectSpite @ EFFECT_SPITE
.4byte BattleScript_EffectHit @ EFFECT_FALSE_SWIPE
.4byte BattleScript_EffectHealBell @ EFFECT_HEAL_BELL
.4byte BattleScript_EffectHit @ EFFECT_ALWAYS_CRIT
.4byte BattleScript_EffectTripleKick @ EFFECT_TRIPLE_KICK
.4byte BattleScript_EffectThief @ EFFECT_THIEF
.4byte BattleScript_EffectMeanLook @ EFFECT_MEAN_LOOK
@ -215,7 +214,6 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectSnatch @ EFFECT_SNATCH
.4byte BattleScript_EffectHit @ EFFECT_LOW_KICK
.4byte BattleScript_EffectSecretPower @ EFFECT_SECRET_POWER
.4byte BattleScript_EffectHit @ EFFECT_RECOIL_33
.4byte BattleScript_EffectTeeterDance @ EFFECT_TEETER_DANCE
.4byte BattleScript_EffectHitEscape @ EFFECT_HIT_ESCAPE
.4byte BattleScript_EffectMudSport @ EFFECT_MUD_SPORT
@ -307,9 +305,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectGrowth @ EFFECT_GROWTH
.4byte BattleScript_EffectCloseCombat @ EFFECT_CLOSE_COMBAT
.4byte BattleScript_EffectLastResort @ EFFECT_LAST_RESORT
.4byte BattleScript_EffectHit @ EFFECT_RECOIL_33_STATUS
.4byte BattleScript_EffectFlinchStatus @ EFFECT_FLINCH_STATUS
.4byte BattleScript_EffectHit @ EFFECT_RECOIL_50
.4byte BattleScript_EffectShellSmash @ EFFECT_SHELL_SMASH
.4byte BattleScript_EffectShiftGear @ EFFECT_SHIFT_GEAR
.4byte BattleScript_EffectDefenseUp3 @ EFFECT_DEFENSE_UP_3

View File

@ -764,11 +764,7 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER
#define IS_MOVE_SPECIAL(move)(GetBattleMoveSplit(move) == SPLIT_SPECIAL)
#define IS_MOVE_STATUS(move)(gBattleMoves[move].split == SPLIT_STATUS)
#define IS_EFFECT_RECOIL(effect)(effect == EFFECT_RECOIL_25 \
|| effect == EFFECT_RECOIL_IF_MISS \
|| effect == EFFECT_RECOIL_50 \
|| effect == EFFECT_RECOIL_33 \
|| effect == EFFECT_RECOIL_33_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))

View File

@ -48,7 +48,7 @@
#define EFFECT_RECOIL_IF_MISS 44
#define EFFECT_MIST 45
#define EFFECT_FOCUS_ENERGY 46
#define EFFECT_RECOIL_25 47
#define EFFECT_RECOIL 47
#define EFFECT_CONFUSE 48
#define EFFECT_ATTACK_UP_2 49
#define EFFECT_DEFENSE_UP_2 50
@ -102,325 +102,321 @@
#define EFFECT_SPITE 98
#define EFFECT_FALSE_SWIPE 99
#define EFFECT_HEAL_BELL 100
#define EFFECT_ALWAYS_CRIT 101
#define EFFECT_TRIPLE_KICK 102
#define EFFECT_THIEF 103
#define EFFECT_MEAN_LOOK 104
#define EFFECT_NIGHTMARE 105
#define EFFECT_MINIMIZE 106
#define EFFECT_CURSE 107
#define EFFECT_HEALING_WISH 108
#define EFFECT_PROTECT 109
#define EFFECT_SPIKES 110
#define EFFECT_FORESIGHT 111
#define EFFECT_PERISH_SONG 112
#define EFFECT_SANDSTORM 113
#define EFFECT_ENDURE 114
#define EFFECT_ROLLOUT 115
#define EFFECT_SWAGGER 116
#define EFFECT_FURY_CUTTER 117
#define EFFECT_ATTRACT 118
#define EFFECT_RETURN 119
#define EFFECT_PRESENT 120
#define EFFECT_FRUSTRATION 121
#define EFFECT_SAFEGUARD 122
#define EFFECT_MAGNITUDE 123
#define EFFECT_BATON_PASS 124
#define EFFECT_PURSUIT 125
#define EFFECT_RAPID_SPIN 126
#define EFFECT_SONICBOOM 127
#define EFFECT_CAPTIVATE 128
#define EFFECT_MORNING_SUN 129
#define EFFECT_SYNTHESIS 130
#define EFFECT_MOONLIGHT 131
#define EFFECT_HIDDEN_POWER 132
#define EFFECT_RAIN_DANCE 133
#define EFFECT_SUNNY_DAY 134
#define EFFECT_DEFENSE_UP_HIT 135
#define EFFECT_ATTACK_UP_HIT 136
#define EFFECT_ALL_STATS_UP_HIT 137
#define EFFECT_FELL_STINGER 138
#define EFFECT_BELLY_DRUM 139
#define EFFECT_PSYCH_UP 140
#define EFFECT_MIRROR_COAT 141
#define EFFECT_SKULL_BASH 142
#define EFFECT_EARTHQUAKE 143
#define EFFECT_FUTURE_SIGHT 144
#define EFFECT_GUST 145
#define EFFECT_SOLAR_BEAM 146
#define EFFECT_THUNDER 147
#define EFFECT_TELEPORT 148
#define EFFECT_BEAT_UP 149
#define EFFECT_SEMI_INVULNERABLE 150
#define EFFECT_DEFENSE_CURL 151
#define EFFECT_SOFTBOILED 152
#define EFFECT_FAKE_OUT 153
#define EFFECT_UPROAR 154
#define EFFECT_STOCKPILE 155
#define EFFECT_SPIT_UP 156
#define EFFECT_SWALLOW 157
#define EFFECT_WORRY_SEED 158
#define EFFECT_HAIL 159
#define EFFECT_TORMENT 160
#define EFFECT_FLATTER 161
#define EFFECT_WILL_O_WISP 162
#define EFFECT_MEMENTO 163
#define EFFECT_FACADE 164
#define EFFECT_FOCUS_PUNCH 165
#define EFFECT_SMELLING_SALTS 166
#define EFFECT_FOLLOW_ME 167
#define EFFECT_NATURE_POWER 168
#define EFFECT_CHARGE 169
#define EFFECT_TAUNT 170
#define EFFECT_HELPING_HAND 171
#define EFFECT_TRICK 172
#define EFFECT_ROLE_PLAY 173
#define EFFECT_WISH 174
#define EFFECT_ASSIST 175
#define EFFECT_INGRAIN 176
#define EFFECT_SUPERPOWER 177
#define EFFECT_MAGIC_COAT 178
#define EFFECT_RECYCLE 179
#define EFFECT_REVENGE 180
#define EFFECT_BRICK_BREAK 181
#define EFFECT_YAWN 182
#define EFFECT_KNOCK_OFF 183
#define EFFECT_ENDEAVOR 184
#define EFFECT_ERUPTION 185
#define EFFECT_SKILL_SWAP 186
#define EFFECT_IMPRISON 187
#define EFFECT_REFRESH 188
#define EFFECT_GRUDGE 189
#define EFFECT_SNATCH 190
#define EFFECT_LOW_KICK 191
#define EFFECT_SECRET_POWER 192
#define EFFECT_RECOIL_33 193
#define EFFECT_TEETER_DANCE 194
#define EFFECT_HIT_ESCAPE 195
#define EFFECT_MUD_SPORT 196
#define EFFECT_POISON_FANG 197
#define EFFECT_WEATHER_BALL 198
#define EFFECT_OVERHEAT 199
#define EFFECT_TICKLE 200
#define EFFECT_COSMIC_POWER 201
#define EFFECT_SKY_UPPERCUT 202
#define EFFECT_BULK_UP 203
#define EFFECT_PLACEHOLDER 204
#define EFFECT_WATER_SPORT 205
#define EFFECT_CALM_MIND 206
#define EFFECT_DRAGON_DANCE 207
#define EFFECT_CAMOUFLAGE 208
#define EFFECT_TRIPLE_KICK 101
#define EFFECT_THIEF 102
#define EFFECT_MEAN_LOOK 103
#define EFFECT_NIGHTMARE 104
#define EFFECT_MINIMIZE 105
#define EFFECT_CURSE 106
#define EFFECT_HEALING_WISH 107
#define EFFECT_PROTECT 108
#define EFFECT_SPIKES 109
#define EFFECT_FORESIGHT 110
#define EFFECT_PERISH_SONG 111
#define EFFECT_SANDSTORM 112
#define EFFECT_ENDURE 113
#define EFFECT_ROLLOUT 114
#define EFFECT_SWAGGER 115
#define EFFECT_FURY_CUTTER 116
#define EFFECT_ATTRACT 117
#define EFFECT_RETURN 118
#define EFFECT_PRESENT 119
#define EFFECT_FRUSTRATION 120
#define EFFECT_SAFEGUARD 121
#define EFFECT_MAGNITUDE 122
#define EFFECT_BATON_PASS 123
#define EFFECT_PURSUIT 124
#define EFFECT_RAPID_SPIN 125
#define EFFECT_SONICBOOM 126
#define EFFECT_CAPTIVATE 127
#define EFFECT_MORNING_SUN 128
#define EFFECT_SYNTHESIS 129
#define EFFECT_MOONLIGHT 130
#define EFFECT_HIDDEN_POWER 131
#define EFFECT_RAIN_DANCE 132
#define EFFECT_SUNNY_DAY 133
#define EFFECT_DEFENSE_UP_HIT 134
#define EFFECT_ATTACK_UP_HIT 135
#define EFFECT_ALL_STATS_UP_HIT 136
#define EFFECT_FELL_STINGER 137
#define EFFECT_BELLY_DRUM 138
#define EFFECT_PSYCH_UP 139
#define EFFECT_MIRROR_COAT 140
#define EFFECT_SKULL_BASH 141
#define EFFECT_EARTHQUAKE 142
#define EFFECT_FUTURE_SIGHT 143
#define EFFECT_GUST 144
#define EFFECT_SOLAR_BEAM 145
#define EFFECT_THUNDER 146
#define EFFECT_TELEPORT 147
#define EFFECT_BEAT_UP 148
#define EFFECT_SEMI_INVULNERABLE 149
#define EFFECT_DEFENSE_CURL 150
#define EFFECT_SOFTBOILED 151
#define EFFECT_FAKE_OUT 152
#define EFFECT_UPROAR 153
#define EFFECT_STOCKPILE 154
#define EFFECT_SPIT_UP 155
#define EFFECT_SWALLOW 156
#define EFFECT_WORRY_SEED 157
#define EFFECT_HAIL 158
#define EFFECT_TORMENT 159
#define EFFECT_FLATTER 160
#define EFFECT_WILL_O_WISP 161
#define EFFECT_MEMENTO 162
#define EFFECT_FACADE 163
#define EFFECT_FOCUS_PUNCH 164
#define EFFECT_SMELLING_SALTS 165
#define EFFECT_FOLLOW_ME 166
#define EFFECT_NATURE_POWER 167
#define EFFECT_CHARGE 168
#define EFFECT_TAUNT 169
#define EFFECT_HELPING_HAND 170
#define EFFECT_TRICK 171
#define EFFECT_ROLE_PLAY 172
#define EFFECT_WISH 173
#define EFFECT_ASSIST 174
#define EFFECT_INGRAIN 175
#define EFFECT_SUPERPOWER 176
#define EFFECT_MAGIC_COAT 177
#define EFFECT_RECYCLE 178
#define EFFECT_REVENGE 179
#define EFFECT_BRICK_BREAK 180
#define EFFECT_YAWN 181
#define EFFECT_KNOCK_OFF 182
#define EFFECT_ENDEAVOR 183
#define EFFECT_ERUPTION 184
#define EFFECT_SKILL_SWAP 185
#define EFFECT_IMPRISON 186
#define EFFECT_REFRESH 187
#define EFFECT_GRUDGE 188
#define EFFECT_SNATCH 189
#define EFFECT_LOW_KICK 190
#define EFFECT_SECRET_POWER 191
#define EFFECT_TEETER_DANCE 192
#define EFFECT_HIT_ESCAPE 193
#define EFFECT_MUD_SPORT 194
#define EFFECT_POISON_FANG 195
#define EFFECT_WEATHER_BALL 196
#define EFFECT_OVERHEAT 197
#define EFFECT_TICKLE 198
#define EFFECT_COSMIC_POWER 199
#define EFFECT_SKY_UPPERCUT 200
#define EFFECT_BULK_UP 201
#define EFFECT_PLACEHOLDER 202
#define EFFECT_WATER_SPORT 203
#define EFFECT_CALM_MIND 204
#define EFFECT_DRAGON_DANCE 205
#define EFFECT_CAMOUFLAGE 206
// New move effects
#define EFFECT_PLEDGE 209
#define EFFECT_FLING 210
#define EFFECT_NATURAL_GIFT 211
#define EFFECT_WAKE_UP_SLAP 212
#define EFFECT_WRING_OUT 213
#define EFFECT_HEX 214
#define EFFECT_ASSURANCE 215
#define EFFECT_TRUMP_CARD 216
#define EFFECT_ACROBATICS 217
#define EFFECT_HEAT_CRASH 218
#define EFFECT_PUNISHMENT 219
#define EFFECT_STORED_POWER 220
#define EFFECT_ELECTRO_BALL 221
#define EFFECT_GYRO_BALL 222
#define EFFECT_ECHOED_VOICE 223
#define EFFECT_PAYBACK 224
#define EFFECT_ROUND 225
#define EFFECT_BRINE 226
#define EFFECT_VENOSHOCK 227
#define EFFECT_RETALIATE 228
#define EFFECT_BULLDOZE 229
#define EFFECT_FOUL_PLAY 230
#define EFFECT_PSYSHOCK 231
#define EFFECT_ROOST 232
#define EFFECT_GRAVITY 233
#define EFFECT_MIRACLE_EYE 234
#define EFFECT_TAILWIND 235
#define EFFECT_EMBARGO 236
#define EFFECT_AQUA_RING 237
#define EFFECT_TRICK_ROOM 238
#define EFFECT_WONDER_ROOM 239
#define EFFECT_MAGIC_ROOM 240
#define EFFECT_MAGNET_RISE 241
#define EFFECT_TOXIC_SPIKES 242
#define EFFECT_GASTRO_ACID 243
#define EFFECT_STEALTH_ROCK 244
#define EFFECT_TELEKINESIS 245
#define EFFECT_POWER_SWAP 246
#define EFFECT_GUARD_SWAP 247
#define EFFECT_HEART_SWAP 248
#define EFFECT_POWER_SPLIT 249
#define EFFECT_GUARD_SPLIT 250
#define EFFECT_STICKY_WEB 251
#define EFFECT_METAL_BURST 252
#define EFFECT_LUCKY_CHANT 253
#define EFFECT_SUCKER_PUNCH 254
#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 255
#define EFFECT_SIMPLE_BEAM 256
#define EFFECT_ENTRAINMENT 257
#define EFFECT_HEAL_PULSE 258
#define EFFECT_QUASH 259
#define EFFECT_ION_DELUGE 260
#define EFFECT_FREEZE_DRY 261
#define EFFECT_TOPSY_TURVY 262
#define EFFECT_MISTY_TERRAIN 263
#define EFFECT_GRASSY_TERRAIN 264
#define EFFECT_ELECTRIC_TERRAIN 265
#define EFFECT_PSYCHIC_TERRAIN 266
#define EFFECT_ATTACK_ACCURACY_UP 267
#define EFFECT_ATTACK_SPATK_UP 268
#define EFFECT_HURRICANE 269
#define EFFECT_TWO_TYPED_MOVE 270
#define EFFECT_ME_FIRST 271
#define EFFECT_SPEED_UP_HIT 272
#define EFFECT_QUIVER_DANCE 273
#define EFFECT_COIL 274
#define EFFECT_ELECTRIFY 275
#define EFFECT_REFLECT_TYPE 276
#define EFFECT_SOAK 277
#define EFFECT_GROWTH 278
#define EFFECT_CLOSE_COMBAT 279
#define EFFECT_LAST_RESORT 280
#define EFFECT_RECOIL_33_STATUS 281
#define EFFECT_FLINCH_STATUS 282
#define EFFECT_RECOIL_50 283
#define EFFECT_SHELL_SMASH 284
#define EFFECT_SHIFT_GEAR 285
#define EFFECT_DEFENSE_UP_3 286
#define EFFECT_NOBLE_ROAR 287
#define EFFECT_VENOM_DRENCH 288
#define EFFECT_TOXIC_THREAD 289
#define EFFECT_CLEAR_SMOG 290
#define EFFECT_HIT_SWITCH_TARGET 291
#define EFFECT_FINAL_GAMBIT 292
#define EFFECT_CHANGE_TYPE_ON_ITEM 293
#define EFFECT_AUTOTOMIZE 294
#define EFFECT_COPYCAT 295
#define EFFECT_DEFOG 296
#define EFFECT_HIT_ENEMY_HEAL_ALLY 297
#define EFFECT_SMACK_DOWN 298
#define EFFECT_SYNCHRONOISE 299
#define EFFECT_PSYCHO_SHIFT 300
#define EFFECT_POWER_TRICK 301
#define EFFECT_FLAME_BURST 302
#define EFFECT_AFTER_YOU 303
#define EFFECT_BESTOW 304
#define EFFECT_ROTOTILLER 305
#define EFFECT_FLOWER_SHIELD 306
#define EFFECT_HIT_PREVENT_ESCAPE 307
#define EFFECT_SPEED_SWAP 308
#define EFFECT_DEFENSE_UP2_HIT 309
#define EFFECT_REVELATION_DANCE 310
#define EFFECT_AURORA_VEIL 311
#define EFFECT_THIRD_TYPE 312
#define EFFECT_FEINT 313
#define EFFECT_SPARKLING_ARIA 314
#define EFFECT_ACUPRESSURE 315
#define EFFECT_AROMATIC_MIST 316
#define EFFECT_POWDER 317
#define EFFECT_SP_ATTACK_UP_HIT 318
#define EFFECT_BELCH 319
#define EFFECT_PARTING_SHOT 320
#define EFFECT_SPECTRAL_THIEF 321
#define EFFECT_V_CREATE 322
#define EFFECT_MAT_BLOCK 323
#define EFFECT_STOMPING_TANTRUM 324
#define EFFECT_CORE_ENFORCER 325
#define EFFECT_INSTRUCT 326
#define EFFECT_THROAT_CHOP 327
#define EFFECT_LASER_FOCUS 328
#define EFFECT_MAGNETIC_FLUX 329
#define EFFECT_GEAR_UP 330
#define EFFECT_INCINERATE 331
#define EFFECT_BUG_BITE 332
#define EFFECT_STRENGTH_SAP 333
#define EFFECT_MIND_BLOWN 334
#define EFFECT_PURIFY 335
#define EFFECT_BURN_UP 336
#define EFFECT_SHORE_UP 337
#define EFFECT_GEOMANCY 338
#define EFFECT_FAIRY_LOCK 339
#define EFFECT_ALLY_SWITCH 340
#define EFFECT_RELIC_SONG 341
#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 342
#define EFFECT_BODY_PRESS 343
#define EFFECT_EERIE_SPELL 344
#define EFFECT_JUNGLE_HEALING 345
#define EFFECT_COACHING 346
#define EFFECT_LASH_OUT 347
#define EFFECT_GRASSY_GLIDE 348
#define EFFECT_DYNAMAX_DOUBLE_DMG 349
#define EFFECT_DECORATE 350
#define EFFECT_SNIPE_SHOT 351
#define EFFECT_RECOIL_HP_25 352
#define EFFECT_STUFF_CHEEKS 353
#define EFFECT_GRAV_APPLE 354
#define EFFECT_EVASION_UP_HIT 355
#define EFFECT_GLITZY_GLOW 356
#define EFFECT_BADDY_BAD 357
#define EFFECT_SAPPY_SEED 358
#define EFFECT_FREEZY_FROST 359
#define EFFECT_SPARKLY_SWIRL 360
#define EFFECT_PLASMA_FISTS 361
#define EFFECT_HYPERSPACE_FURY 362
#define EFFECT_AURA_WHEEL 363
#define EFFECT_PHOTON_GEYSER 364
#define EFFECT_SHELL_SIDE_ARM 365
#define EFFECT_TERRAIN_PULSE 366
#define EFFECT_JAW_LOCK 367
#define EFFECT_NO_RETREAT 368
#define EFFECT_TAR_SHOT 369
#define EFFECT_POLTERGEIST 370
#define EFFECT_OCTOLOCK 371
#define EFFECT_CLANGOROUS_SOUL 372
#define EFFECT_BOLT_BEAK 373
#define EFFECT_SKY_DROP 374
#define EFFECT_EXPANDING_FORCE 375
#define EFFECT_METEOR_BEAM 376
#define EFFECT_RISING_VOLTAGE 377
#define EFFECT_BEAK_BLAST 378
#define EFFECT_COURT_CHANGE 379
#define EFFECT_STEEL_BEAM 380
#define EFFECT_EXTREME_EVOBOOST 381
#define EFFECT_HIT_SET_REMOVE_TERRAIN 382 // genesis supernova
#define EFFECT_DARK_VOID 383
#define EFFECT_SLEEP_HIT 384
#define EFFECT_DOUBLE_SHOCK 385
#define EFFECT_SPECIAL_ATTACK_UP_HIT 386
#define EFFECT_VICTORY_DANCE 387
#define EFFECT_TEATIME 388
#define EFFECT_ATTACK_UP_USER_ALLY 389 // Howl 8th Gen
#define EFFECT_SHELL_TRAP 390
#define EFFECT_PSYBLADE 391
#define EFFECT_HYDRO_STEAM 392
#define EFFECT_HIT_SET_ENTRY_HAZARD 393
#define EFFECT_DIRE_CLAW 394
#define EFFECT_BARB_BARRAGE 395
#define EFFECT_REVIVAL_BLESSING 396
#define EFFECT_FROSTBITE_HIT 397
#define EFFECT_SNOWSCAPE 398
#define EFFECT_TRIPLE_ARROWS 399
#define EFFECT_INFERNAL_PARADE 400
#define EFFECT_TAKE_HEART 401
#define EFFECT_AXE_KICK 402
#define EFFECT_COLLISION_COURSE 403
#define EFFECT_SPIN_OUT 404
#define EFFECT_MAKE_IT_RAIN 405
#define EFFECT_CORROSIVE_GAS 406
#define EFFECT_POPULATION_BOMB 407
#define EFFECT_MORTAL_SPIN 408
#define EFFECT_SALT_CURE 409
#define EFFECT_CHILLY_RECEPTION 410
#define EFFECT_MATCHA_GOTCHA 411
#define EFFECT_SYRUP_BOMB 412
#define EFFECT_MAX_MOVE 413
#define EFFECT_GLAIVE_RUSH 414
#define EFFECT_RAGING_BULL 415
#define EFFECT_RAGE_FIST 416
#define EFFECT_PLEDGE 207
#define EFFECT_FLING 208
#define EFFECT_NATURAL_GIFT 209
#define EFFECT_WAKE_UP_SLAP 210
#define EFFECT_WRING_OUT 211
#define EFFECT_HEX 212
#define EFFECT_ASSURANCE 213
#define EFFECT_TRUMP_CARD 214
#define EFFECT_ACROBATICS 215
#define EFFECT_HEAT_CRASH 216
#define EFFECT_PUNISHMENT 217
#define EFFECT_STORED_POWER 218
#define EFFECT_ELECTRO_BALL 219
#define EFFECT_GYRO_BALL 220
#define EFFECT_ECHOED_VOICE 221
#define EFFECT_PAYBACK 222
#define EFFECT_ROUND 223
#define EFFECT_BRINE 224
#define EFFECT_VENOSHOCK 225
#define EFFECT_RETALIATE 226
#define EFFECT_BULLDOZE 227
#define EFFECT_FOUL_PLAY 228
#define EFFECT_PSYSHOCK 229
#define EFFECT_ROOST 230
#define EFFECT_GRAVITY 231
#define EFFECT_MIRACLE_EYE 232
#define EFFECT_TAILWIND 233
#define EFFECT_EMBARGO 234
#define EFFECT_AQUA_RING 235
#define EFFECT_TRICK_ROOM 236
#define EFFECT_WONDER_ROOM 237
#define EFFECT_MAGIC_ROOM 238
#define EFFECT_MAGNET_RISE 239
#define EFFECT_TOXIC_SPIKES 240
#define EFFECT_GASTRO_ACID 241
#define EFFECT_STEALTH_ROCK 242
#define EFFECT_TELEKINESIS 243
#define EFFECT_POWER_SWAP 244
#define EFFECT_GUARD_SWAP 245
#define EFFECT_HEART_SWAP 246
#define EFFECT_POWER_SPLIT 247
#define EFFECT_GUARD_SPLIT 248
#define EFFECT_STICKY_WEB 249
#define EFFECT_METAL_BURST 250
#define EFFECT_LUCKY_CHANT 251
#define EFFECT_SUCKER_PUNCH 252
#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 253
#define EFFECT_SIMPLE_BEAM 254
#define EFFECT_ENTRAINMENT 255
#define EFFECT_HEAL_PULSE 256
#define EFFECT_QUASH 257
#define EFFECT_ION_DELUGE 258
#define EFFECT_FREEZE_DRY 259
#define EFFECT_TOPSY_TURVY 260
#define EFFECT_MISTY_TERRAIN 261
#define EFFECT_GRASSY_TERRAIN 262
#define EFFECT_ELECTRIC_TERRAIN 263
#define EFFECT_PSYCHIC_TERRAIN 264
#define EFFECT_ATTACK_ACCURACY_UP 265
#define EFFECT_ATTACK_SPATK_UP 266
#define EFFECT_HURRICANE 267
#define EFFECT_TWO_TYPED_MOVE 268
#define EFFECT_ME_FIRST 269
#define EFFECT_SPEED_UP_HIT 270
#define EFFECT_QUIVER_DANCE 271
#define EFFECT_COIL 272
#define EFFECT_ELECTRIFY 273
#define EFFECT_REFLECT_TYPE 274
#define EFFECT_SOAK 275
#define EFFECT_GROWTH 276
#define EFFECT_CLOSE_COMBAT 277
#define EFFECT_LAST_RESORT 278
#define EFFECT_FLINCH_STATUS 279
#define EFFECT_SHELL_SMASH 280
#define EFFECT_SHIFT_GEAR 281
#define EFFECT_DEFENSE_UP_3 282
#define EFFECT_NOBLE_ROAR 283
#define EFFECT_VENOM_DRENCH 284
#define EFFECT_TOXIC_THREAD 285
#define EFFECT_CLEAR_SMOG 286
#define EFFECT_HIT_SWITCH_TARGET 287
#define EFFECT_FINAL_GAMBIT 288
#define EFFECT_CHANGE_TYPE_ON_ITEM 289
#define EFFECT_AUTOTOMIZE 290
#define EFFECT_COPYCAT 291
#define EFFECT_DEFOG 292
#define EFFECT_HIT_ENEMY_HEAL_ALLY 293
#define EFFECT_SMACK_DOWN 294
#define EFFECT_SYNCHRONOISE 295
#define EFFECT_PSYCHO_SHIFT 296
#define EFFECT_POWER_TRICK 297
#define EFFECT_FLAME_BURST 298
#define EFFECT_AFTER_YOU 299
#define EFFECT_BESTOW 300
#define EFFECT_ROTOTILLER 301
#define EFFECT_FLOWER_SHIELD 302
#define EFFECT_HIT_PREVENT_ESCAPE 303
#define EFFECT_SPEED_SWAP 304
#define EFFECT_DEFENSE_UP2_HIT 305
#define EFFECT_REVELATION_DANCE 306
#define EFFECT_AURORA_VEIL 307
#define EFFECT_THIRD_TYPE 308
#define EFFECT_FEINT 309
#define EFFECT_SPARKLING_ARIA 310
#define EFFECT_ACUPRESSURE 311
#define EFFECT_AROMATIC_MIST 312
#define EFFECT_POWDER 313
#define EFFECT_SP_ATTACK_UP_HIT 314
#define EFFECT_BELCH 315
#define EFFECT_PARTING_SHOT 316
#define EFFECT_SPECTRAL_THIEF 317
#define EFFECT_V_CREATE 318
#define EFFECT_MAT_BLOCK 319
#define EFFECT_STOMPING_TANTRUM 320
#define EFFECT_CORE_ENFORCER 321
#define EFFECT_INSTRUCT 322
#define EFFECT_THROAT_CHOP 323
#define EFFECT_LASER_FOCUS 324
#define EFFECT_MAGNETIC_FLUX 325
#define EFFECT_GEAR_UP 326
#define EFFECT_INCINERATE 327
#define EFFECT_BUG_BITE 328
#define EFFECT_STRENGTH_SAP 329
#define EFFECT_MIND_BLOWN 330
#define EFFECT_PURIFY 331
#define EFFECT_BURN_UP 332
#define EFFECT_SHORE_UP 333
#define EFFECT_GEOMANCY 334
#define EFFECT_FAIRY_LOCK 335
#define EFFECT_ALLY_SWITCH 336
#define EFFECT_RELIC_SONG 337
#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 338
#define EFFECT_BODY_PRESS 339
#define EFFECT_EERIE_SPELL 340
#define EFFECT_JUNGLE_HEALING 341
#define EFFECT_COACHING 342
#define EFFECT_LASH_OUT 343
#define EFFECT_GRASSY_GLIDE 344
#define EFFECT_DYNAMAX_DOUBLE_DMG 345
#define EFFECT_DECORATE 346
#define EFFECT_SNIPE_SHOT 347
#define EFFECT_RECOIL_HP_25 348
#define EFFECT_STUFF_CHEEKS 349
#define EFFECT_GRAV_APPLE 350
#define EFFECT_EVASION_UP_HIT 351
#define EFFECT_GLITZY_GLOW 352
#define EFFECT_BADDY_BAD 353
#define EFFECT_SAPPY_SEED 354
#define EFFECT_FREEZY_FROST 355
#define EFFECT_SPARKLY_SWIRL 356
#define EFFECT_PLASMA_FISTS 357
#define EFFECT_HYPERSPACE_FURY 358
#define EFFECT_AURA_WHEEL 359
#define EFFECT_PHOTON_GEYSER 360
#define EFFECT_SHELL_SIDE_ARM 361
#define EFFECT_TERRAIN_PULSE 362
#define EFFECT_JAW_LOCK 363
#define EFFECT_NO_RETREAT 364
#define EFFECT_TAR_SHOT 365
#define EFFECT_POLTERGEIST 366
#define EFFECT_OCTOLOCK 367
#define EFFECT_CLANGOROUS_SOUL 368
#define EFFECT_BOLT_BEAK 369
#define EFFECT_SKY_DROP 370
#define EFFECT_EXPANDING_FORCE 371
#define EFFECT_METEOR_BEAM 372
#define EFFECT_RISING_VOLTAGE 373
#define EFFECT_BEAK_BLAST 374
#define EFFECT_COURT_CHANGE 375
#define EFFECT_STEEL_BEAM 376
#define EFFECT_EXTREME_EVOBOOST 377
#define EFFECT_HIT_SET_REMOVE_TERRAIN 378
#define EFFECT_DARK_VOID 379
#define EFFECT_SLEEP_HIT 380
#define EFFECT_DOUBLE_SHOCK 381
#define EFFECT_SPECIAL_ATTACK_UP_HIT 382
#define EFFECT_VICTORY_DANCE 383
#define EFFECT_TEATIME 384
#define EFFECT_ATTACK_UP_USER_ALLY 385
#define EFFECT_SHELL_TRAP 386
#define EFFECT_PSYBLADE 387
#define EFFECT_HYDRO_STEAM 388
#define EFFECT_HIT_SET_ENTRY_HAZARD 389
#define EFFECT_DIRE_CLAW 390
#define EFFECT_BARB_BARRAGE 391
#define EFFECT_REVIVAL_BLESSING 392
#define EFFECT_FROSTBITE_HIT 393
#define EFFECT_SNOWSCAPE 394
#define EFFECT_TRIPLE_ARROWS 395
#define EFFECT_INFERNAL_PARADE 396
#define EFFECT_TAKE_HEART 397
#define EFFECT_AXE_KICK 398
#define EFFECT_COLLISION_COURSE 399
#define EFFECT_SPIN_OUT 400
#define EFFECT_MAKE_IT_RAIN 401
#define EFFECT_CORROSIVE_GAS 402
#define EFFECT_POPULATION_BOMB 403
#define EFFECT_MORTAL_SPIN 404
#define EFFECT_SALT_CURE 405
#define EFFECT_CHILLY_RECEPTION 406
#define EFFECT_MATCHA_GOTCHA 407
#define EFFECT_SYRUP_BOMB 408
#define EFFECT_MAX_MOVE 409
#define EFFECT_GLAIVE_RUSH 410
#define EFFECT_RAGING_BULL 411
#define EFFECT_RAGE_FIST 412
#define NUM_BATTLE_MOVE_EFFECTS 417
#define NUM_BATTLE_MOVE_EFFECTS 413
#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H

View File

@ -230,6 +230,9 @@
#define SPLIT_SPECIAL 0x1
#define SPLIT_STATUS 0x2
// Just for readability
#define ALWAYS_CRIT 3
// Growth rates
#define GROWTH_MEDIUM_FAST 0
#define GROWTH_ERRATIC 1

View File

@ -407,15 +407,22 @@ struct BattleMove
{
u16 effect;
u8 power;
u8 type;
u8 accuracy;
u8 pp;
u8 type:5;
u8 split:3;
u16 accuracy:7;
u16 recoil:7;
u16 critBoost:2;
u8 secondaryEffectChance;
u16 target;
s8 priority;
u8 split;
u16 argument;
u8 zMoveEffect;
u16 target;
u8 pp;
union {
u8 effect;
u8 powerOverride;
} zMove;
// Flags
u32 makesContact:1;
u32 ignoresProtect:1;
@ -423,7 +430,6 @@ struct BattleMove
u32 snatchAffected:1;
u32 mirrorMoveBanned:1;
u32 ignoresKingsRock:1;
u32 highCritRatio:1;
u32 twoTurnMove:1;
u32 punchingMove:1;
u32 sheerForceBoost:1;
@ -461,6 +467,8 @@ struct BattleMove
u32 encoreBanned:1;
u32 parentalBondBanned:1;
u32 skyBattleBanned:1;
u16 argument;
};
#define SPINDA_SPOT_WIDTH 16

View File

@ -1854,29 +1854,10 @@ 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_25:
case EFFECT_RECOIL:
if (AI_IsDamagedByRecoil(battlerAtk))
{
u32 recoilDmg = max(1, aiData->simulatedDmg[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] / 4);
if (!ShouldUseRecoilMove(battlerAtk, battlerDef, recoilDmg, AI_THINKING_STRUCT->movesetIndex))
ADJUST_SCORE(-10);
break;
}
break;
case EFFECT_RECOIL_33:
case EFFECT_RECOIL_33_STATUS:
if (AI_IsDamagedByRecoil(battlerAtk))
{
u32 recoilDmg = max(1, aiData->simulatedDmg[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] / 3);
if (!ShouldUseRecoilMove(battlerAtk, battlerDef, recoilDmg, AI_THINKING_STRUCT->movesetIndex))
ADJUST_SCORE(-10);
break;
}
break;
case EFFECT_RECOIL_50:
if (AI_IsDamagedByRecoil(battlerAtk))
{
u32 recoilDmg = max(1, aiData->simulatedDmg[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] / 2);
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;
@ -2727,21 +2708,6 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
ADJUST_SCORE(1);
}
break;
case EFFECT_ALWAYS_CRIT:
// Ally decided to use Frost Breath on us. we must have Anger Point as our ability
if (aiData->abilities[battlerAtk] == ABILITY_ANGER_POINT)
{
if (AI_WhoStrikesFirst(battlerAtk, battlerAtkPartner, move) == AI_IS_SLOWER) // Partner moving first
{
// discourage raising our attack since it's about to be maxed out
if (IsAttackBoostMoveEffect(effect))
ADJUST_SCORE(-3);
// encourage moves hitting multiple opponents
if (!IS_MOVE_STATUS(move) && (moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)))
ADJUST_SCORE(3);
}
}
break;
// Don't change weather if ally already decided to do so.
case EFFECT_SUNNY_DAY:
case EFFECT_HAIL:
@ -2754,6 +2720,20 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
}
} // check partner move effect
// Adjust for always crit moves
if (gBattleMoves[aiData->partnerMove].critBoost == ALWAYS_CRIT && aiData->abilities[battlerAtk] == ABILITY_ANGER_POINT)
{
if (AI_WhoStrikesFirst(battlerAtk, battlerAtkPartner, move) == AI_IS_SLOWER) // Partner moving first
{
// discourage raising our attack since it's about to be maxed out
if (IsAttackBoostMoveEffect(effect))
ADJUST_SCORE(-3);
// encourage moves hitting multiple opponents
if (!IS_MOVE_STATUS(move) && (moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)))
ADJUST_SCORE(3);
}
}
// consider our move effect relative to partner state
switch (effect)
{
@ -4996,7 +4976,7 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
if (IS_TARGETING_PARTNER(battlerAtk, battlerDef))
return score;
if (gBattleMoves[move].highCritRatio)
if (gBattleMoves[move].critBoost > 0)
ADJUST_SCORE(2);
switch (gBattleMoves[move].effect)

View File

@ -775,7 +775,9 @@ s32 AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectivenes
dmg = 20 * (aiData->abilities[battlerAtk] == ABILITY_PARENTAL_BOND ? 2 : 1);
break;
case EFFECT_MULTI_HIT:
dmg *= (aiData->abilities[battlerAtk] == ABILITY_SKILL_LINK ? 5 : 3);
dmg *= (aiData->abilities[battlerAtk] == ABILITY_SKILL_LINK
&& !(move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)
? 5 : 3);
break;
case EFFECT_ENDEAVOR:
// If target has less HP than user, Endeavor does no damage
@ -807,8 +809,6 @@ s32 AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectivenes
// Handle other multi-strike moves
if (gBattleMoves[move].strikeCount > 1 && gBattleMoves[move].effect != EFFECT_TRIPLE_KICK)
dmg *= gBattleMoves[move].strikeCount;
else if (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)
dmg *= 3;
if (dmg == 0)
dmg = 1;
@ -969,11 +969,8 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s
case EFFECT_MIND_BLOWN:
case EFFECT_STEEL_BEAM:
return TRUE;
case EFFECT_RECOIL_25:
case EFFECT_RECOIL_IF_MISS:
case EFFECT_RECOIL_50:
case EFFECT_RECOIL_33:
case EFFECT_RECOIL_33_STATUS:
case EFFECT_RECOIL:
if (AI_IsDamagedByRecoil(battlerAtk))
return TRUE;
break;
@ -2234,7 +2231,17 @@ bool32 HasSoundMove(u32 battler)
bool32 HasHighCritRatioMove(u32 battler)
{
CHECK_MOVE_FLAG(highCritRatio);
s32 i;
u16 *moves = GetMovesArray(battler);
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && gBattleMoves[moves[i]].critBoost > 0
&& gBattleMoves[moves[i]].critBoost < ALWAYS_CRIT) // don't count always crit moves
return TRUE;
}
return FALSE;
}
bool32 HasMagicCoatAffectedMove(u32 battler)

View File

@ -1892,20 +1892,20 @@ s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec
s32 critChance = 0;
if (gSideStatuses[battlerDef] & SIDE_STATUS_LUCKY_CHANT || gStatuses3[battlerAtk] & STATUS3_CANT_SCORE_A_CRIT
|| abilityDef == ABILITY_BATTLE_ARMOR || abilityDef == ABILITY_SHELL_ARMOR)
|| abilityDef == ABILITY_BATTLE_ARMOR || abilityDef == ABILITY_SHELL_ARMOR)
{
critChance = -1;
}
else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS
|| gBattleMoves[move].effect == EFFECT_ALWAYS_CRIT
|| (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY))
|| gBattleMoves[gCurrentMove].critBoost == ALWAYS_CRIT
|| (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY))
{
critChance = -2;
}
else
{
critChance = 2 * ((gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY) != 0)
+ (gBattleMoves[gCurrentMove].highCritRatio)
+ gBattleMoves[gCurrentMove].critBoost
+ (holdEffectAtk == HOLD_EFFECT_SCOPE_LENS)
+ 2 * (holdEffectAtk == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[battlerAtk].species == SPECIES_CHANSEY)
+ 2 * BENEFITS_FROM_LEEK(battlerAtk, holdEffectAtk)
@ -5349,28 +5349,13 @@ static void Cmd_moveend(void)
{
switch (gBattleMoves[gCurrentMove].effect)
{
case EFFECT_RECOIL_25: // Take Down, 25% recoil
gBattleMoveDamage = max(1, gBattleScripting.savedDmg / 4);
case EFFECT_RECOIL:
gBattleMoveDamage = max(1, gBattleScripting.savedDmg * max(1, gBattleMoves[gCurrentMove].recoil) / 100);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil;
effect = TRUE;
break;
case EFFECT_RECOIL_33: // Double Edge, 33 % recoil
gBattleMoveDamage = max(1, gBattleScripting.savedDmg / 3);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil;
effect = TRUE;
break;
case EFFECT_RECOIL_50: // Head Smash, 50 % recoil
gBattleMoveDamage = max(1, gBattleScripting.savedDmg / 2);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil;
effect = TRUE;
break;
case EFFECT_RECOIL_33_STATUS: // Flare Blitz - can burn, Volt Tackle - can paralyze
gBattleMoveDamage = max(1, gBattleScripting.savedDmg / 3);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoilWithStatus;
if (gBattleMoves[gCurrentMove].argument) // Flare Blitz - can burn, Volt Tackle - can paralyze
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoilWithStatus;
else
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil;
effect = TRUE;
break;
}

View File

@ -134,7 +134,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_RECOIL_IF_MISS] = 1,
[EFFECT_MIST] = 5,
[EFFECT_FOCUS_ENERGY] = 1,
[EFFECT_RECOIL_25] = 2,
[EFFECT_RECOIL] = 2,
[EFFECT_CONFUSE] = 4,
[EFFECT_ATTACK_UP_2] = 1,
[EFFECT_DEFENSE_UP_2] = 1,
@ -280,7 +280,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_SNATCH] = 1,
[EFFECT_LOW_KICK] = 1,
[EFFECT_SECRET_POWER] = 1,
[EFFECT_RECOIL_33] = 2,
[EFFECT_TEETER_DANCE] = 6,
// [EFFECT_BLAZE_KICK] = 1,
[EFFECT_MUD_SPORT] = 4,
@ -368,9 +367,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_GROWTH] = 0, // TODO: Assign points
[EFFECT_CLOSE_COMBAT] = 0, // TODO: Assign points
[EFFECT_LAST_RESORT] = 0, // TODO: Assign points
[EFFECT_RECOIL_33_STATUS] = 0, // TODO: Assign points
[EFFECT_FLINCH_STATUS] = 0, // TODO: Assign points
[EFFECT_RECOIL_50] = 0, // TODO: Assign points
[EFFECT_SHELL_SMASH] = 0, // TODO: Assign points
[EFFECT_SHIFT_GEAR] = 0, // TODO: Assign points
[EFFECT_DEFENSE_UP_3] = 0, // TODO: Assign points

View File

@ -3777,7 +3777,7 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType)
gBattleScripting.battler = gBattlerAttacker;
if (gBattleStruct->zmove.activeSplit == SPLIT_STATUS)
{
gBattleStruct->zmove.effect = gBattleMoves[gBattleStruct->zmove.baseMoves[gBattlerAttacker]].zMoveEffect;
gBattleStruct->zmove.effect = gBattleMoves[gBattleStruct->zmove.baseMoves[gBattlerAttacker]].zMove.effect;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ZMoveActivateStatus;
}

View File

@ -406,7 +406,7 @@ bool32 MoveSelectionDisplayZMove(u16 zmove, u32 battler)
if (IS_MOVE_STATUS(move))
{
u8 zEffect = gBattleMoves[move].zMoveEffect;
u8 zEffect = gBattleMoves[move].zMove.effect;
gDisplayedStringBattle[0] = EOS;
@ -692,38 +692,30 @@ u16 GetZMovePower(u16 move)
if (gBattleMoves[move].effect == EFFECT_OHKO)
return 180;
switch (move)
if (gBattleMoves[move].zMove.powerOverride > 0)
return gBattleMoves[move].zMove.powerOverride;
else
{
case MOVE_MEGA_DRAIN: return 120;
case MOVE_CORE_ENFORCER: return 140;
case MOVE_WEATHER_BALL: return 160;
case MOVE_HEX: return 160;
case MOVE_FLYING_PRESS: return 170;
case MOVE_GEAR_GRIND: return 180;
case MOVE_V_CREATE: return 220;
default:
{
if (gBattleMoves[move].power >= 140)
return 200;
else if (gBattleMoves[move].power >= 130)
return 195;
else if (gBattleMoves[move].power >= 120)
return 190;
else if (gBattleMoves[move].power >= 110)
return 185;
else if (gBattleMoves[move].power >= 100)
return 180;
else if (gBattleMoves[move].power >= 90)
return 175;
else if (gBattleMoves[move].power >= 80)
return 160;
else if (gBattleMoves[move].power >= 70)
return 140;
else if (gBattleMoves[move].power >= 60)
return 120;
else
return 100;
}
if (gBattleMoves[move].power >= 140)
return 200;
else if (gBattleMoves[move].power >= 130)
return 195;
else if (gBattleMoves[move].power >= 120)
return 190;
else if (gBattleMoves[move].power >= 110)
return 185;
else if (gBattleMoves[move].power >= 100)
return 180;
else if (gBattleMoves[move].power >= 90)
return 175;
else if (gBattleMoves[move].power >= 80)
return 160;
else if (gBattleMoves[move].power >= 70)
return 140;
else if (gBattleMoves[move].power >= 60)
return 120;
else
return 100;
}
}

View File

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

File diff suppressed because it is too large Load Diff

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_33_STATUS)
if (gBattleMoves[move].effect == EFFECT_RECOIL)
{
HP_BAR(player);
MESSAGE("Tauros is hit with recoil!");

View File

@ -148,11 +148,11 @@ SINGLE_BATTLE_TEST("Focus Energy increases the user's critical hit ratio by two
}
}
SINGLE_BATTLE_TEST("Flag highCritRatio increases the critical hit ratio by one stage")
SINGLE_BATTLE_TEST("High crit rate increases the critical hit ratio by one stage")
{
PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT);
GIVEN {
ASSUME(gBattleMoves[MOVE_SLASH].highCritRatio == TRUE);
ASSUME(gBattleMoves[MOVE_SLASH].critBoost == 1);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -192,10 +192,10 @@ SINGLE_BATTLE_TEST("Scope Lens increases the critical hit ratio by one stage")
}
}
SINGLE_BATTLE_TEST("Flag highCritRatio, Super Luck and Scope Lens cause the move to result in a critical hit")
SINGLE_BATTLE_TEST("High crit rate, Super Luck and Scope Lens cause the move to result in a critical hit")
{
GIVEN {
ASSUME(gBattleMoves[MOVE_SLASH].highCritRatio == TRUE);
ASSUME(gBattleMoves[MOVE_SLASH].critBoost == 1);
ASSUME(gItems[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS);
PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); };
OPPONENT(SPECIES_WOBBUFFET);

View File

@ -51,7 +51,7 @@ SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by two s
{
PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT);
GIVEN {
ASSUME(gBattleMoves[MOVE_TACKLE].highCritRatio == FALSE);
ASSUME(gBattleMoves[MOVE_TACKLE].critBoost == 0);
ASSUME(B_CRIT_CHANCE >= GEN_6);
PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_LANSAT_BERRY); }
OPPONENT(SPECIES_WOBBUFFET);

View File

@ -99,7 +99,7 @@ SINGLE_BATTLE_TEST("Critical hits occur at a 1/24 rate")
SINGLE_BATTLE_TEST("Slash's critical hits occur at a 1/8 rate")
{
ASSUME(B_CRIT_CHANCE >= GEN_7);
ASSUME(gBattleMoves[MOVE_SLASH].highCritRatio);
ASSUME(gBattleMoves[MOVE_SLASH].critBoost == 1);
PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT);
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_33_STATUS);
ASSUME(gBattleMoves[MOVE_HEAD_SMASH].effect == EFFECT_RECOIL_50);
ASSUME(gBattleMoves[MOVE_TAKE_DOWN].effect == EFFECT_RECOIL_25);
ASSUME(gBattleMoves[MOVE_DOUBLE_EDGE].effect == EFFECT_RECOIL_33);
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);
PLAYER(SPECIES_RAPIDASH);
OPPONENT(SPECIES_BEAUTIFLY);
} WHEN {

View File

@ -0,0 +1,89 @@
#include "global.h"
#include "test/battle.h"
SINGLE_BATTLE_TEST("Take Down deals 25% of recoil damage to the user")
{
s16 directDamage;
s16 recoilDamage;
GIVEN {
ASSUME(gBattleMoves[MOVE_TAKE_DOWN].effect == EFFECT_RECOIL);
ASSUME(gBattleMoves[MOVE_TAKE_DOWN].recoil == 25);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_TAKE_DOWN); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_TAKE_DOWN, player);
HP_BAR(opponent, captureDamage: &directDamage);
HP_BAR(player, captureDamage: &recoilDamage);
} THEN {
EXPECT_MUL_EQ(directDamage, UQ_4_12(0.25), recoilDamage);
}
}
SINGLE_BATTLE_TEST("Double Edge deals 33% of recoil damage to the user")
{
s16 directDamage;
s16 recoilDamage;
GIVEN {
ASSUME(gBattleMoves[MOVE_DOUBLE_EDGE].effect == EFFECT_RECOIL);
ASSUME(gBattleMoves[MOVE_DOUBLE_EDGE].recoil == 33);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_DOUBLE_EDGE); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_EDGE, player);
HP_BAR(opponent, captureDamage: &directDamage);
HP_BAR(player, captureDamage: &recoilDamage);
} THEN {
EXPECT_MUL_EQ(directDamage, UQ_4_12(0.33), recoilDamage);
}
}
SINGLE_BATTLE_TEST("Head Smash deals 50% of recoil damage to the user")
{
s16 directDamage;
s16 recoilDamage;
GIVEN {
ASSUME(gBattleMoves[MOVE_HEAD_SMASH].effect == EFFECT_RECOIL);
ASSUME(gBattleMoves[MOVE_HEAD_SMASH].recoil == 50);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_HEAD_SMASH); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAD_SMASH, player);
HP_BAR(opponent, captureDamage: &directDamage);
HP_BAR(player, captureDamage: &recoilDamage);
} THEN {
EXPECT_MUL_EQ(directDamage, UQ_4_12(0.50), recoilDamage);
}
}
SINGLE_BATTLE_TEST("Flare Blitz deals 33% of recoil damage to the user and can burn target")
{
s16 directDamage;
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);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_FLARE_BLITZ); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_FLARE_BLITZ, player);
HP_BAR(opponent, captureDamage: &directDamage);
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponent);
STATUS_ICON(opponent, burn: TRUE);
HP_BAR(player, captureDamage: &recoilDamage);
} THEN {
EXPECT_MUL_EQ(directDamage, UQ_4_12(0.33), recoilDamage);
}
}

View File

@ -46,7 +46,7 @@ SINGLE_BATTLE_TEST("Triple Arrows makes the foe flinch 30% of the time")
SINGLE_BATTLE_TEST("Triple Arrows lands a critical hit")
{
ASSUME(B_CRIT_CHANCE >= GEN_7);
ASSUME(gBattleMoves[MOVE_TRIPLE_ARROWS].highCritRatio == TRUE);
ASSUME(gBattleMoves[MOVE_TRIPLE_ARROWS].critBoost == 1);
PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT);
GIVEN {
PLAYER(SPECIES_WOBBUFFET);

View File

@ -50,6 +50,7 @@ SINGLE_BATTLE_TEST("Surging Strikes hits 3 times with each hit being a critical
GIVEN {
ASSUME(gBattleMoves[MOVE_SURGING_STRIKES].strikeCount == 3);
ASSUME(gBattleMoves[MOVE_SURGING_STRIKES].critBoost == ALWAYS_CRIT);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {