From 18577ce5985906f4947d3ffe9385cae045613abf Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 10 Sep 2023 16:57:19 +0200 Subject: [PATCH] Fix Scale Shot bug and use Canceller Multihit Moves (#3290) --- data/battle_scripts_1.s | 58 +-- include/constants/battle_move_effects.h | 563 ++++++++++++------------ src/battle_script_commands.c | 13 +- src/battle_tv.c | 1 - src/data/battle_moves.h | 3 +- test/battle/move_effect/multi_hit.c | 181 ++++++++ 6 files changed, 471 insertions(+), 348 deletions(-) create mode 100644 test/battle/move_effect/multi_hit.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e7fb0149c..9ef768530 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -145,7 +145,6 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectPresent @ EFFECT_PRESENT .4byte BattleScript_EffectHit @ EFFECT_FRUSTRATION .4byte BattleScript_EffectSafeguard @ EFFECT_SAFEGUARD - .4byte BattleScript_EffectHit @ EFFECT_UNUSED_125 .4byte BattleScript_EffectMagnitude @ EFFECT_MAGNITUDE .4byte BattleScript_EffectBatonPass @ EFFECT_BATON_PASS .4byte BattleScript_EffectHit @ EFFECT_PURSUIT @@ -406,7 +405,6 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_BOLT_BEAK .4byte BattleScript_EffectSkyDrop @ EFFECT_SKY_DROP .4byte BattleScript_EffectHit @ EFFECT_EXPANDING_FORCE - .4byte BattleScript_EffectScaleShot @ EFFECT_SCALE_SHOT .4byte BattleScript_EffectMeteorBeam @ EFFECT_METEOR_BEAM .4byte BattleScript_EffectHit @ EFFECT_RISING_VOLTAGE .4byte BattleScript_EffectHit @ EFFECT_BEAK_BLAST @@ -723,60 +721,6 @@ BattleScript_FirstChargingTurnMeteorBeam:: seteffectsecondary return -BattleScript_EffectScaleShot:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - setmultihitcounter 0x0 - initmultihitstring - sethword sMULTIHIT_EFFECT, 0x0 -BattleScript_ScaleShotLoop:: - jumpifhasnohp BS_ATTACKER, BattleScript_ScaleShotEnd - jumpifhasnohp BS_TARGET, BattleScript_ScaleShotPrintStrings - jumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_ScaleShotDoMultiHit - jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_ScaleShotPrintStrings -BattleScript_ScaleShotDoMultiHit:: - movevaluescleanup - copyhword sMOVE_EFFECT, sMULTIHIT_EFFECT - critcalc - damagecalc - jumpifmovehadnoeffect BattleScript_ScaleShotMultiHitNoMoreHits - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - multihitresultmessage - printstring STRINGID_EMPTYSTRING3 - waitmessage 1 - addbyte sMULTIHIT_STRING + 4, 0x1 - moveendto MOVEEND_NEXT_TARGET - jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_FOE_ENDURED, BattleScript_ScaleShotPrintStrings - decrementmultihit BattleScript_ScaleShotLoop - goto BattleScript_ScaleShotPrintStrings -BattleScript_ScaleShotMultiHitNoMoreHits:: - pause B_WAIT_TIME_SHORT -BattleScript_ScaleShotPrintStrings:: - resultmessage - waitmessage B_WAIT_TIME_LONG - jumpifmovehadnoeffect BattleScript_ScaleShotEnd - copyarray gBattleTextBuff1, sMULTIHIT_STRING, 0x6 - printstring STRINGID_HITXTIMES - waitmessage B_WAIT_TIME_LONG -BattleScript_ScaleShotEnd:: - setmoveeffect MOVE_EFFECT_SCALE_SHOT | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - seteffectwithchance - tryfaintmon BS_TARGET - moveendcase MOVEEND_SYNCHRONIZE_TARGET - moveendfrom MOVEEND_STATUS_IMMUNITY_ABILITIES - end - BattleScript_EffectSkyDrop: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_SkyDropTurn2 attackcanceler @@ -881,7 +825,7 @@ BattleScript_FlingEnd: tryfaintmon BS_TARGET trysymbiosis goto BattleScript_MoveEnd - + BattleScript_FlingFailConsumeItem:: removeitem BS_ATTACKER goto BattleScript_FailedFromAtkString diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 4d8330498..300bb9d2e 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -124,290 +124,289 @@ #define EFFECT_PRESENT 120 #define EFFECT_FRUSTRATION 121 #define EFFECT_SAFEGUARD 122 -#define EFFECT_UNUSED_125 123 -#define EFFECT_MAGNITUDE 124 -#define EFFECT_BATON_PASS 125 -#define EFFECT_PURSUIT 126 -#define EFFECT_RAPID_SPIN 127 -#define EFFECT_SONICBOOM 128 -#define EFFECT_CAPTIVATE 129 -#define EFFECT_MORNING_SUN 130 -#define EFFECT_SYNTHESIS 131 -#define EFFECT_MOONLIGHT 132 -#define EFFECT_HIDDEN_POWER 133 -#define EFFECT_RAIN_DANCE 134 -#define EFFECT_SUNNY_DAY 135 -#define EFFECT_DEFENSE_UP_HIT 136 -#define EFFECT_ATTACK_UP_HIT 137 -#define EFFECT_ALL_STATS_UP_HIT 138 -#define EFFECT_FELL_STINGER 139 -#define EFFECT_BELLY_DRUM 140 -#define EFFECT_PSYCH_UP 141 -#define EFFECT_MIRROR_COAT 142 -#define EFFECT_SKULL_BASH 143 -#define EFFECT_TWISTER 144 -#define EFFECT_EARTHQUAKE 145 -#define EFFECT_FUTURE_SIGHT 146 -#define EFFECT_GUST 147 -#define EFFECT_FLINCH_MINIMIZE_HIT 148 -#define EFFECT_SOLAR_BEAM 149 -#define EFFECT_THUNDER 150 -#define EFFECT_TELEPORT 151 -#define EFFECT_BEAT_UP 152 -#define EFFECT_SEMI_INVULNERABLE 153 -#define EFFECT_DEFENSE_CURL 154 -#define EFFECT_SOFTBOILED 155 -#define EFFECT_FAKE_OUT 156 -#define EFFECT_UPROAR 157 -#define EFFECT_STOCKPILE 158 -#define EFFECT_SPIT_UP 159 -#define EFFECT_SWALLOW 160 -#define EFFECT_WORRY_SEED 161 -#define EFFECT_HAIL 162 -#define EFFECT_TORMENT 163 -#define EFFECT_FLATTER 164 -#define EFFECT_WILL_O_WISP 165 -#define EFFECT_MEMENTO 166 -#define EFFECT_FACADE 167 -#define EFFECT_FOCUS_PUNCH 168 -#define EFFECT_SMELLINGSALT 169 -#define EFFECT_FOLLOW_ME 170 -#define EFFECT_NATURE_POWER 171 -#define EFFECT_CHARGE 172 -#define EFFECT_TAUNT 173 -#define EFFECT_HELPING_HAND 174 -#define EFFECT_TRICK 175 -#define EFFECT_ROLE_PLAY 176 -#define EFFECT_WISH 177 -#define EFFECT_ASSIST 178 -#define EFFECT_INGRAIN 179 -#define EFFECT_SUPERPOWER 180 -#define EFFECT_MAGIC_COAT 181 -#define EFFECT_RECYCLE 182 -#define EFFECT_REVENGE 183 -#define EFFECT_BRICK_BREAK 184 -#define EFFECT_YAWN 185 -#define EFFECT_KNOCK_OFF 186 -#define EFFECT_ENDEAVOR 187 -#define EFFECT_ERUPTION 188 -#define EFFECT_SKILL_SWAP 189 -#define EFFECT_IMPRISON 190 -#define EFFECT_REFRESH 191 -#define EFFECT_GRUDGE 192 -#define EFFECT_SNATCH 193 -#define EFFECT_LOW_KICK 194 -#define EFFECT_SECRET_POWER 195 -#define EFFECT_RECOIL_33 196 -#define EFFECT_TEETER_DANCE 197 -#define EFFECT_HIT_ESCAPE 198 -#define EFFECT_MUD_SPORT 199 -#define EFFECT_POISON_FANG 200 -#define EFFECT_WEATHER_BALL 201 -#define EFFECT_OVERHEAT 202 -#define EFFECT_TICKLE 203 -#define EFFECT_COSMIC_POWER 204 -#define EFFECT_SKY_UPPERCUT 205 -#define EFFECT_BULK_UP 206 -#define EFFECT_PLACEHOLDER 207 -#define EFFECT_WATER_SPORT 208 -#define EFFECT_CALM_MIND 209 -#define EFFECT_DRAGON_DANCE 210 -#define EFFECT_CAMOUFLAGE 211 + +#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_TWISTER 143 +#define EFFECT_EARTHQUAKE 144 +#define EFFECT_FUTURE_SIGHT 145 +#define EFFECT_GUST 146 +#define EFFECT_FLINCH_MINIMIZE_HIT 147 +#define EFFECT_SOLAR_BEAM 148 +#define EFFECT_THUNDER 149 +#define EFFECT_TELEPORT 150 +#define EFFECT_BEAT_UP 151 +#define EFFECT_SEMI_INVULNERABLE 152 +#define EFFECT_DEFENSE_CURL 153 +#define EFFECT_SOFTBOILED 154 +#define EFFECT_FAKE_OUT 155 +#define EFFECT_UPROAR 156 +#define EFFECT_STOCKPILE 157 +#define EFFECT_SPIT_UP 158 +#define EFFECT_SWALLOW 159 +#define EFFECT_WORRY_SEED 160 +#define EFFECT_HAIL 161 +#define EFFECT_TORMENT 162 +#define EFFECT_FLATTER 163 +#define EFFECT_WILL_O_WISP 164 +#define EFFECT_MEMENTO 165 +#define EFFECT_FACADE 166 +#define EFFECT_FOCUS_PUNCH 167 +#define EFFECT_SMELLINGSALT 168 +#define EFFECT_FOLLOW_ME 169 +#define EFFECT_NATURE_POWER 170 +#define EFFECT_CHARGE 171 +#define EFFECT_TAUNT 172 +#define EFFECT_HELPING_HAND 173 +#define EFFECT_TRICK 174 +#define EFFECT_ROLE_PLAY 175 +#define EFFECT_WISH 176 +#define EFFECT_ASSIST 177 +#define EFFECT_INGRAIN 178 +#define EFFECT_SUPERPOWER 179 +#define EFFECT_MAGIC_COAT 180 +#define EFFECT_RECYCLE 181 +#define EFFECT_REVENGE 182 +#define EFFECT_BRICK_BREAK 183 +#define EFFECT_YAWN 184 +#define EFFECT_KNOCK_OFF 185 +#define EFFECT_ENDEAVOR 186 +#define EFFECT_ERUPTION 187 +#define EFFECT_SKILL_SWAP 188 +#define EFFECT_IMPRISON 189 +#define EFFECT_REFRESH 190 +#define EFFECT_GRUDGE 191 +#define EFFECT_SNATCH 192 +#define EFFECT_LOW_KICK 193 +#define EFFECT_SECRET_POWER 194 +#define EFFECT_RECOIL_33 195 +#define EFFECT_TEETER_DANCE 196 +#define EFFECT_HIT_ESCAPE 197 +#define EFFECT_MUD_SPORT 198 +#define EFFECT_POISON_FANG 199 +#define EFFECT_WEATHER_BALL 200 +#define EFFECT_OVERHEAT 201 +#define EFFECT_TICKLE 202 +#define EFFECT_COSMIC_POWER 203 +#define EFFECT_SKY_UPPERCUT 204 +#define EFFECT_BULK_UP 205 +#define EFFECT_PLACEHOLDER 206 +#define EFFECT_WATER_SPORT 207 +#define EFFECT_CALM_MIND 208 +#define EFFECT_DRAGON_DANCE 209 +#define EFFECT_CAMOUFLAGE 210 // New move effects -#define EFFECT_PLEDGE 212 -#define EFFECT_FLING 213 -#define EFFECT_NATURAL_GIFT 214 -#define EFFECT_WAKE_UP_SLAP 215 -#define EFFECT_WRING_OUT 216 -#define EFFECT_HEX 217 -#define EFFECT_ASSURANCE 218 -#define EFFECT_TRUMP_CARD 219 -#define EFFECT_ACROBATICS 220 -#define EFFECT_HEAT_CRASH 221 -#define EFFECT_PUNISHMENT 222 -#define EFFECT_STORED_POWER 223 -#define EFFECT_ELECTRO_BALL 224 -#define EFFECT_GYRO_BALL 225 -#define EFFECT_ECHOED_VOICE 226 -#define EFFECT_PAYBACK 227 -#define EFFECT_ROUND 228 -#define EFFECT_BRINE 229 -#define EFFECT_VENOSHOCK 230 -#define EFFECT_RETALIATE 231 -#define EFFECT_BULLDOZE 232 -#define EFFECT_FOUL_PLAY 233 -#define EFFECT_PSYSHOCK 234 -#define EFFECT_ROOST 235 -#define EFFECT_GRAVITY 236 -#define EFFECT_MIRACLE_EYE 237 -#define EFFECT_TAILWIND 238 -#define EFFECT_EMBARGO 239 -#define EFFECT_AQUA_RING 240 -#define EFFECT_TRICK_ROOM 241 -#define EFFECT_WONDER_ROOM 242 -#define EFFECT_MAGIC_ROOM 243 -#define EFFECT_MAGNET_RISE 244 -#define EFFECT_TOXIC_SPIKES 245 -#define EFFECT_GASTRO_ACID 246 -#define EFFECT_STEALTH_ROCK 247 -#define EFFECT_TELEKINESIS 248 -#define EFFECT_POWER_SWAP 249 -#define EFFECT_GUARD_SWAP 250 -#define EFFECT_HEART_SWAP 251 -#define EFFECT_POWER_SPLIT 252 -#define EFFECT_GUARD_SPLIT 253 -#define EFFECT_STICKY_WEB 254 -#define EFFECT_METAL_BURST 255 -#define EFFECT_LUCKY_CHANT 256 -#define EFFECT_SUCKER_PUNCH 257 -#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 258 -#define EFFECT_SIMPLE_BEAM 259 -#define EFFECT_ENTRAINMENT 260 -#define EFFECT_HEAL_PULSE 261 -#define EFFECT_QUASH 262 -#define EFFECT_ION_DELUGE 263 -#define EFFECT_FREEZE_DRY 264 -#define EFFECT_TOPSY_TURVY 265 -#define EFFECT_MISTY_TERRAIN 266 -#define EFFECT_GRASSY_TERRAIN 267 -#define EFFECT_ELECTRIC_TERRAIN 268 -#define EFFECT_PSYCHIC_TERRAIN 269 -#define EFFECT_ATTACK_ACCURACY_UP 270 -#define EFFECT_ATTACK_SPATK_UP 271 -#define EFFECT_HURRICANE 272 -#define EFFECT_TWO_TYPED_MOVE 273 -#define EFFECT_ME_FIRST 274 -#define EFFECT_SPEED_UP_HIT 275 -#define EFFECT_QUIVER_DANCE 276 -#define EFFECT_COIL 277 -#define EFFECT_ELECTRIFY 278 -#define EFFECT_REFLECT_TYPE 279 -#define EFFECT_SOAK 280 -#define EFFECT_GROWTH 281 -#define EFFECT_CLOSE_COMBAT 282 -#define EFFECT_LAST_RESORT 283 -#define EFFECT_RECOIL_33_STATUS 284 -#define EFFECT_FLINCH_STATUS 285 -#define EFFECT_RECOIL_50 286 -#define EFFECT_SHELL_SMASH 287 -#define EFFECT_SHIFT_GEAR 288 -#define EFFECT_DEFENSE_UP_3 289 -#define EFFECT_NOBLE_ROAR 290 -#define EFFECT_VENOM_DRENCH 291 -#define EFFECT_TOXIC_THREAD 292 -#define EFFECT_CLEAR_SMOG 293 -#define EFFECT_HIT_SWITCH_TARGET 294 -#define EFFECT_FINAL_GAMBIT 295 -#define EFFECT_CHANGE_TYPE_ON_ITEM 296 -#define EFFECT_AUTOTOMIZE 297 -#define EFFECT_COPYCAT 298 -#define EFFECT_DEFOG 299 -#define EFFECT_HIT_ENEMY_HEAL_ALLY 300 -#define EFFECT_SMACK_DOWN 301 -#define EFFECT_SYNCHRONOISE 302 -#define EFFECT_PSYCHO_SHIFT 303 -#define EFFECT_POWER_TRICK 304 -#define EFFECT_FLAME_BURST 305 -#define EFFECT_AFTER_YOU 306 -#define EFFECT_BESTOW 307 -#define EFFECT_ROTOTILLER 308 -#define EFFECT_FLOWER_SHIELD 309 -#define EFFECT_HIT_PREVENT_ESCAPE 310 -#define EFFECT_SPEED_SWAP 311 -#define EFFECT_DEFENSE_UP2_HIT 312 -#define EFFECT_REVELATION_DANCE 313 -#define EFFECT_AURORA_VEIL 314 -#define EFFECT_THIRD_TYPE 315 -#define EFFECT_FEINT 316 -#define EFFECT_SPARKLING_ARIA 317 -#define EFFECT_ACUPRESSURE 318 -#define EFFECT_AROMATIC_MIST 319 -#define EFFECT_POWDER 320 -#define EFFECT_SP_ATTACK_UP_HIT 321 -#define EFFECT_BELCH 322 -#define EFFECT_PARTING_SHOT 323 -#define EFFECT_SPECTRAL_THIEF 324 -#define EFFECT_V_CREATE 325 -#define EFFECT_MAT_BLOCK 326 -#define EFFECT_STOMPING_TANTRUM 327 -#define EFFECT_CORE_ENFORCER 328 -#define EFFECT_INSTRUCT 329 -#define EFFECT_THROAT_CHOP 330 -#define EFFECT_LASER_FOCUS 331 -#define EFFECT_MAGNETIC_FLUX 332 -#define EFFECT_GEAR_UP 333 -#define EFFECT_INCINERATE 334 -#define EFFECT_BUG_BITE 335 -#define EFFECT_STRENGTH_SAP 336 -#define EFFECT_MIND_BLOWN 337 -#define EFFECT_PURIFY 338 -#define EFFECT_BURN_UP 339 -#define EFFECT_SHORE_UP 340 -#define EFFECT_GEOMANCY 341 -#define EFFECT_FAIRY_LOCK 342 -#define EFFECT_ALLY_SWITCH 343 -#define EFFECT_RELIC_SONG 344 -#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 345 -#define EFFECT_BODY_PRESS 346 -#define EFFECT_EERIE_SPELL 347 -#define EFFECT_JUNGLE_HEALING 348 -#define EFFECT_COACHING 349 -#define EFFECT_LASH_OUT 350 -#define EFFECT_GRASSY_GLIDE 351 -#define EFFECT_REMOVE_TERRAIN 352 -#define EFFECT_DYNAMAX_DOUBLE_DMG 353 -#define EFFECT_DECORATE 354 -#define EFFECT_SNIPE_SHOT 355 -#define EFFECT_RECOIL_HP_25 356 -#define EFFECT_STUFF_CHEEKS 357 -#define EFFECT_GRAV_APPLE 358 -#define EFFECT_EVASION_UP_HIT 359 -#define EFFECT_GLITZY_GLOW 360 -#define EFFECT_BADDY_BAD 361 -#define EFFECT_SAPPY_SEED 362 -#define EFFECT_FREEZY_FROST 363 -#define EFFECT_SPARKLY_SWIRL 364 -#define EFFECT_PLASMA_FISTS 365 -#define EFFECT_HYPERSPACE_FURY 366 -#define EFFECT_AURA_WHEEL 367 -#define EFFECT_PHOTON_GEYSER 368 -#define EFFECT_SHELL_SIDE_ARM 369 -#define EFFECT_TERRAIN_PULSE 370 -#define EFFECT_JAW_LOCK 371 -#define EFFECT_NO_RETREAT 372 -#define EFFECT_TAR_SHOT 373 -#define EFFECT_POLTERGEIST 374 -#define EFFECT_OCTOLOCK 375 -#define EFFECT_CLANGOROUS_SOUL 376 -#define EFFECT_BOLT_BEAK 377 -#define EFFECT_SKY_DROP 378 -#define EFFECT_EXPANDING_FORCE 379 -#define EFFECT_SCALE_SHOT 380 -#define EFFECT_METEOR_BEAM 381 -#define EFFECT_RISING_VOLTAGE 382 -#define EFFECT_BEAK_BLAST 383 -#define EFFECT_COURT_CHANGE 384 -#define EFFECT_STEEL_BEAM 385 -#define EFFECT_EXTREME_EVOBOOST 386 -#define EFFECT_HIT_SET_REMOVE_TERRAIN 387 // genesis supernova -#define EFFECT_DARK_VOID 388 -#define EFFECT_SLEEP_HIT 389 -#define EFFECT_DOUBLE_SHOCK 390 -#define EFFECT_SPECIAL_ATTACK_UP_HIT 391 -#define EFFECT_VICTORY_DANCE 392 -#define EFFECT_TEATIME 393 -#define EFFECT_ATTACK_UP_USER_ALLY 394 // Howl 8th Gen -#define EFFECT_SHELL_TRAP 395 -#define EFFECT_PSYBLADE 396 -#define EFFECT_HYDRO_STEAM 397 -#define EFFECT_HIT_SET_ENTRY_HAZARD 398 -#define EFFECT_DIRE_CLAW 399 -#define EFFECT_BARB_BARRAGE 400 -#define EFFECT_REVIVAL_BLESSING 401 -#define EFFECT_FROSTBITE_HIT 402 -#define EFFECT_SNOWSCAPE 403 +#define EFFECT_PLEDGE 211 +#define EFFECT_FLING 212 +#define EFFECT_NATURAL_GIFT 213 +#define EFFECT_WAKE_UP_SLAP 214 +#define EFFECT_WRING_OUT 215 +#define EFFECT_HEX 216 +#define EFFECT_ASSURANCE 217 +#define EFFECT_TRUMP_CARD 218 +#define EFFECT_ACROBATICS 219 +#define EFFECT_HEAT_CRASH 220 +#define EFFECT_PUNISHMENT 221 +#define EFFECT_STORED_POWER 222 +#define EFFECT_ELECTRO_BALL 223 +#define EFFECT_GYRO_BALL 224 +#define EFFECT_ECHOED_VOICE 225 +#define EFFECT_PAYBACK 226 +#define EFFECT_ROUND 227 +#define EFFECT_BRINE 228 +#define EFFECT_VENOSHOCK 229 +#define EFFECT_RETALIATE 230 +#define EFFECT_BULLDOZE 231 +#define EFFECT_FOUL_PLAY 232 +#define EFFECT_PSYSHOCK 233 +#define EFFECT_ROOST 234 +#define EFFECT_GRAVITY 235 +#define EFFECT_MIRACLE_EYE 236 +#define EFFECT_TAILWIND 237 +#define EFFECT_EMBARGO 238 +#define EFFECT_AQUA_RING 239 +#define EFFECT_TRICK_ROOM 240 +#define EFFECT_WONDER_ROOM 241 +#define EFFECT_MAGIC_ROOM 242 +#define EFFECT_MAGNET_RISE 243 +#define EFFECT_TOXIC_SPIKES 244 +#define EFFECT_GASTRO_ACID 245 +#define EFFECT_STEALTH_ROCK 246 +#define EFFECT_TELEKINESIS 247 +#define EFFECT_POWER_SWAP 248 +#define EFFECT_GUARD_SWAP 249 +#define EFFECT_HEART_SWAP 250 +#define EFFECT_POWER_SPLIT 251 +#define EFFECT_GUARD_SPLIT 252 +#define EFFECT_STICKY_WEB 253 +#define EFFECT_METAL_BURST 254 +#define EFFECT_LUCKY_CHANT 255 +#define EFFECT_SUCKER_PUNCH 256 +#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 257 +#define EFFECT_SIMPLE_BEAM 258 +#define EFFECT_ENTRAINMENT 259 +#define EFFECT_HEAL_PULSE 260 +#define EFFECT_QUASH 261 +#define EFFECT_ION_DELUGE 262 +#define EFFECT_FREEZE_DRY 263 +#define EFFECT_TOPSY_TURVY 264 +#define EFFECT_MISTY_TERRAIN 265 +#define EFFECT_GRASSY_TERRAIN 266 +#define EFFECT_ELECTRIC_TERRAIN 267 +#define EFFECT_PSYCHIC_TERRAIN 268 +#define EFFECT_ATTACK_ACCURACY_UP 269 +#define EFFECT_ATTACK_SPATK_UP 270 +#define EFFECT_HURRICANE 271 +#define EFFECT_TWO_TYPED_MOVE 272 +#define EFFECT_ME_FIRST 273 +#define EFFECT_SPEED_UP_HIT 274 +#define EFFECT_QUIVER_DANCE 275 +#define EFFECT_COIL 276 +#define EFFECT_ELECTRIFY 277 +#define EFFECT_REFLECT_TYPE 278 +#define EFFECT_SOAK 279 +#define EFFECT_GROWTH 280 +#define EFFECT_CLOSE_COMBAT 281 +#define EFFECT_LAST_RESORT 282 +#define EFFECT_RECOIL_33_STATUS 283 +#define EFFECT_FLINCH_STATUS 284 +#define EFFECT_RECOIL_50 285 +#define EFFECT_SHELL_SMASH 286 +#define EFFECT_SHIFT_GEAR 287 +#define EFFECT_DEFENSE_UP_3 288 +#define EFFECT_NOBLE_ROAR 289 +#define EFFECT_VENOM_DRENCH 290 +#define EFFECT_TOXIC_THREAD 291 +#define EFFECT_CLEAR_SMOG 292 +#define EFFECT_HIT_SWITCH_TARGET 293 +#define EFFECT_FINAL_GAMBIT 294 +#define EFFECT_CHANGE_TYPE_ON_ITEM 295 +#define EFFECT_AUTOTOMIZE 296 +#define EFFECT_COPYCAT 297 +#define EFFECT_DEFOG 298 +#define EFFECT_HIT_ENEMY_HEAL_ALLY 299 +#define EFFECT_SMACK_DOWN 300 +#define EFFECT_SYNCHRONOISE 301 +#define EFFECT_PSYCHO_SHIFT 302 +#define EFFECT_POWER_TRICK 303 +#define EFFECT_FLAME_BURST 304 +#define EFFECT_AFTER_YOU 305 +#define EFFECT_BESTOW 306 +#define EFFECT_ROTOTILLER 307 +#define EFFECT_FLOWER_SHIELD 308 +#define EFFECT_HIT_PREVENT_ESCAPE 309 +#define EFFECT_SPEED_SWAP 310 +#define EFFECT_DEFENSE_UP2_HIT 311 +#define EFFECT_REVELATION_DANCE 312 +#define EFFECT_AURORA_VEIL 313 +#define EFFECT_THIRD_TYPE 314 +#define EFFECT_FEINT 315 +#define EFFECT_SPARKLING_ARIA 316 +#define EFFECT_ACUPRESSURE 317 +#define EFFECT_AROMATIC_MIST 318 +#define EFFECT_POWDER 319 +#define EFFECT_SP_ATTACK_UP_HIT 320 +#define EFFECT_BELCH 321 +#define EFFECT_PARTING_SHOT 322 +#define EFFECT_SPECTRAL_THIEF 323 +#define EFFECT_V_CREATE 324 +#define EFFECT_MAT_BLOCK 325 +#define EFFECT_STOMPING_TANTRUM 326 +#define EFFECT_CORE_ENFORCER 327 +#define EFFECT_INSTRUCT 328 +#define EFFECT_THROAT_CHOP 329 +#define EFFECT_LASER_FOCUS 330 +#define EFFECT_MAGNETIC_FLUX 331 +#define EFFECT_GEAR_UP 332 +#define EFFECT_INCINERATE 333 +#define EFFECT_BUG_BITE 334 +#define EFFECT_STRENGTH_SAP 335 +#define EFFECT_MIND_BLOWN 336 +#define EFFECT_PURIFY 337 +#define EFFECT_BURN_UP 338 +#define EFFECT_SHORE_UP 339 +#define EFFECT_GEOMANCY 340 +#define EFFECT_FAIRY_LOCK 341 +#define EFFECT_ALLY_SWITCH 342 +#define EFFECT_RELIC_SONG 343 +#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 344 +#define EFFECT_BODY_PRESS 345 +#define EFFECT_EERIE_SPELL 346 +#define EFFECT_JUNGLE_HEALING 347 +#define EFFECT_COACHING 348 +#define EFFECT_LASH_OUT 349 +#define EFFECT_GRASSY_GLIDE 350 +#define EFFECT_REMOVE_TERRAIN 351 +#define EFFECT_DYNAMAX_DOUBLE_DMG 352 +#define EFFECT_DECORATE 353 +#define EFFECT_SNIPE_SHOT 354 +#define EFFECT_RECOIL_HP_25 355 +#define EFFECT_STUFF_CHEEKS 356 +#define EFFECT_GRAV_APPLE 357 +#define EFFECT_EVASION_UP_HIT 358 +#define EFFECT_GLITZY_GLOW 359 +#define EFFECT_BADDY_BAD 360 +#define EFFECT_SAPPY_SEED 361 +#define EFFECT_FREEZY_FROST 362 +#define EFFECT_SPARKLY_SWIRL 363 +#define EFFECT_PLASMA_FISTS 364 +#define EFFECT_HYPERSPACE_FURY 365 +#define EFFECT_AURA_WHEEL 366 +#define EFFECT_PHOTON_GEYSER 367 +#define EFFECT_SHELL_SIDE_ARM 368 +#define EFFECT_TERRAIN_PULSE 369 +#define EFFECT_JAW_LOCK 370 +#define EFFECT_NO_RETREAT 371 +#define EFFECT_TAR_SHOT 372 +#define EFFECT_POLTERGEIST 373 +#define EFFECT_OCTOLOCK 374 +#define EFFECT_CLANGOROUS_SOUL 375 +#define EFFECT_BOLT_BEAK 376 +#define EFFECT_SKY_DROP 377 +#define EFFECT_EXPANDING_FORCE 378 +#define EFFECT_METEOR_BEAM 379 +#define EFFECT_RISING_VOLTAGE 380 +#define EFFECT_BEAK_BLAST 381 +#define EFFECT_COURT_CHANGE 382 +#define EFFECT_STEEL_BEAM 383 +#define EFFECT_EXTREME_EVOBOOST 384 +#define EFFECT_HIT_SET_REMOVE_TERRAIN 385 // genesis supernova +#define EFFECT_DARK_VOID 386 +#define EFFECT_SLEEP_HIT 387 +#define EFFECT_DOUBLE_SHOCK 388 +#define EFFECT_SPECIAL_ATTACK_UP_HIT 389 +#define EFFECT_VICTORY_DANCE 390 +#define EFFECT_TEATIME 391 +#define EFFECT_ATTACK_UP_USER_ALLY 392 // Howl 8th Gen +#define EFFECT_SHELL_TRAP 393 +#define EFFECT_PSYBLADE 394 +#define EFFECT_HYDRO_STEAM 395 +#define EFFECT_HIT_SET_ENTRY_HAZARD 396 +#define EFFECT_DIRE_CLAW 397 +#define EFFECT_BARB_BARRAGE 398 +#define EFFECT_REVIVAL_BLESSING 399 +#define EFFECT_FROSTBITE_HIT 400 +#define EFFECT_SNOWSCAPE 401 -#define NUM_BATTLE_MOVE_EFFECTS 404 +#define NUM_BATTLE_MOVE_EFFECTS 402 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 83ac411a1..1049acde8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3864,13 +3864,6 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; gBattleMons[gBattlerAttacker].status2 |= STATUS2_ESCAPE_PREVENTION; break; - case MOVE_EFFECT_SCALE_SHOT: - if (!NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefDownSpeedUp; - } - break; case MOVE_EFFECT_BURN_UP: // This seems unnecessary but is done to make it work properly with Parental Bond BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -6095,6 +6088,12 @@ static void Cmd_moveend(void) gBattleScripting.multihitString[4]++; if (--gMultiHitCounter == 0) { + if (gBattleMoves[gCurrentMove].argument == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefDownSpeedUp; + } + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; effect = TRUE; diff --git a/src/battle_tv.c b/src/battle_tv.c index 7379b72e4..ba33e0f08 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -469,7 +469,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_BOLT_BEAK] = 0, // TODO: Assign points [EFFECT_SKY_DROP] = 0, // TODO: Assign points [EFFECT_EXPANDING_FORCE] = 0, // TODO: Assign points - [EFFECT_SCALE_SHOT] = 0, // TODO: Assign points [EFFECT_METEOR_BEAM] = 0, // TODO: Assign points [EFFECT_RISING_VOLTAGE] = 0, // TODO: Assign points [EFFECT_BEAK_BLAST] = 0, // TODO: Assign points diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 940dec57d..e2791b78d 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -12038,7 +12038,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = [MOVE_SCALE_SHOT] = { - .effect = EFFECT_SCALE_SHOT, + .effect = EFFECT_MULTI_HIT, .power = 25, .type = TYPE_DRAGON, .accuracy = 90, @@ -12049,6 +12049,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, + .argument = MOVE_EFFECT_SCALE_SHOT, }, [MOVE_METEOR_BEAM] = diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c new file mode 100644 index 000000000..1aded8dd3 --- /dev/null +++ b/test/battle/move_effect/multi_hit.c @@ -0,0 +1,181 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_BULLET_SEED].effect == EFFECT_MULTI_HIT); +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit the maximum amount with Skill Link") +{ + PASSES_RANDOMLY(100, 100, RNG_HITS); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SKILL_LINK); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 5 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit twice 35 Percent of the time") +{ + PASSES_RANDOMLY(35, 100, RNG_HITS); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 2 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit thrice 35 Percent of the time") +{ + PASSES_RANDOMLY(35, 100, RNG_HITS); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 3 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit four times 35 Percent of the time") +{ + PASSES_RANDOMLY(15, 100, RNG_HITS); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 4 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit four times 35 Percent of the time") +{ + PASSES_RANDOMLY(15, 100, RNG_HITS); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 5 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit at least four times with Loaded Dice") +{ + PASSES_RANDOMLY(50, 100, RNG_LOADED_DICE); + + GIVEN { + ASSUME(gItems[ITEM_LOADED_DICE].holdEffect == HOLD_EFFECT_LOADED_DICE); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LOADED_DICE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 4 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Multi hit Moves hit five times 50 Percent of the time with Loaded Dice") +{ + PASSES_RANDOMLY(50, 100, RNG_LOADED_DICE); + + GIVEN { + ASSUME(gItems[ITEM_LOADED_DICE].holdEffect == HOLD_EFFECT_LOADED_DICE); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LOADED_DICE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + MESSAGE("Hit 5 time(s)!"); + } +} + +SINGLE_BATTLE_TEST("Scale Shot decreses defense and increases speed after final hit") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCALE_SHOT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + MESSAGE("Hit 5 time(s)!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Defense fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Speed rose!"); + } +} + +SINGLE_BATTLE_TEST("Endure does not prevent multiply hits and stat changes accure at the end of the turn") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); + ASSUME(gBattleMoves[MOVE_ENDURE].effect == EFFECT_ENDURE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + } WHEN { + TURN { MOVE(opponent, MOVE_ENDURE); MOVE(player, MOVE_SCALE_SHOT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDURE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + MESSAGE("Hit 5 time(s)!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Defense fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Speed rose!"); + } +}