From e09423fadf046a50d672d194a6cf27b1ac7a67c4 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Wed, 27 Nov 2024 19:49:03 +0000 Subject: [PATCH 01/36] Document battle_anim_normal.c --- asm/macros/battle_anim_script.inc | 98 +++- data/battle_anim_scripts.s | 858 +++++++++++++++--------------- include/battle_anim_internal.h | 18 + include/constants/battle_anim.h | 2 + src/battle_anim_normal.c | 383 +++++++------ 5 files changed, 776 insertions(+), 583 deletions(-) create mode 100644 include/battle_anim_internal.h diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index 67632e9885..7abf5b8d28 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -10,7 +10,7 @@ .2byte \tag .endm -.macro createsprite template:req, anim_battler:req, subpriority_offset:req, argv:vararg + .macro createsprite template:req, anim_battler:req, subpriority_offset:req, argv:vararg .byte 0x02 .4byte \template .if \anim_battler == ANIM_TARGET @@ -283,3 +283,99 @@ .macro jumpretfalse ptr:req jumpreteq FALSE, \ptr .endm + +@ createsprite wrappers +@ The arguments are based on the CMD_ARGS of the callback associated with the template. + + .macro simple_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector:req, delay:req, initial_blend_y:req, target_blend_y:req, color:req + createsprite gSimplePaletteBlendSpriteTemplate, \unused_anim_battler, \unused_subpriority_offset, \selector, \delay, \initial_blend_y, \target_blend_y, \color + .endm + + .macro complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector:req, delay:req, num_blends:req, color1:req, blend_y1:req, color2:req, blend_y2:req + createsprite gComplexPaletteBlendSpriteTemplate, \unused_anim_battler, \unused_subpriority_offset, \selector, \delay, \num_blends, \color1, \blend_y1, \color2, \blend_y2 + .endm + + .macro shake_mon_or_platform unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, velocity:req, shake_timer:req, shake_duration:req, type:req, battler_selector + .if \type == SHAKE_MON_X || \type == SHAKE_MON_Y + .ifb \battler_selector + .error "battler_selector required for SHAKE_MON_X or SHAKE_MON_Y" + .endif + .else + .ifnb \battler_selector + .warning "unused battler_selector in shake_mon_or_platform" + .endif + .endif + .ifb \battler_selector + createsprite gShakeMonOrPlatformSpriteTemplate, \unused_anim_battler, \unused_subpriority_offset, \velocity, \shake_timer, \shake_duration, \type + .else + createsprite gShakeMonOrPlatformSpriteTemplate, \unused_anim_battler, \unused_subpriority_offset, \velocity, \shake_timer, \shake_duration, \type, \battler_selector + .endif + .endm + + .macro create_confusion_duck_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, wave_offset:req, wave_period:req, duration:req + createsprite gConfusionDuckSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \wave_offset, \wave_period, \duration + .endm + + .macro create_basic_hitsplat_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, relative_to:req, animation:req + createsprite gBasicHitSplatSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \relative_to, \animation + .endm + + .macro create_persist_hitsplat_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, relative_to:req, animation:req, duration:req + createsprite gPersistHitSplatSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \relative_to, \animation, \duration + .endm + + .macro create_handle_invert_hitsplat_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, relative_to:req, animation:req + createsprite gHandleInvertHitSplatSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \relative_to, \animation + .endm + + .macro create_random_pos_hitsplat_sprite anim_battler:req, subpriority_offset:req, relative_to:req, animation + .ifnb \animation + createsprite gRandomPosHitSplatSpriteTemplate, \anim_battler, \subpriority_offset, \relative_to, \animation + .else + createsprite gRandomPosHitSplatSpriteTemplate, \anim_battler, \subpriority_offset, \relative_to, -1 + .endif + .endm + + .macro create_mon_edge_hitsplat_sprite anim_battler:req, subpriority_offset:req, relative_to:req, x:req, y:req, animation:req + createsprite gMonEdgeHitSplatSpriteTemplate, \anim_battler, \subpriority_offset, \relative_to, \x, \y, \animation + .endm + + .macro create_cross_impact_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, relative_to:req, duration:req + createsprite gCrossImpactSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \relative_to, \duration + .endm + + .macro create_flashing_hitsplat_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, relative_to:req, animation:req + createsprite gFlashingHitSplatSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \relative_to, \animation + .endm + +@ createvisualtask wrappers +@ The arguments are based on the CMD_ARGS of the task. + + .macro blend_color_cycle priority=2, selector:req, delay:req, num_blends:req, initial_blend_y:req, target_blend_y:req, color:req + createvisualtask AnimTask_BlendColorCycle, \priority, \selector, \delay, \num_blends, \initial_blend_y, \target_blend_y, \color + .endm + + .macro blend_color_cycleexclude priority=2, unk0:req, delay:req, num_blends:req, initial_blend_y:req, target_blend_y:req, color:req + createvisualtask AnimTask_BlendColorCycleExclude, \priority, \unk0, \delay, \num_blends, \initial_blend_y, \target_blend_y, \color + .endm + + .macro blend_color_cyclebytag priority=2, tag:req, delay:req, num_blends:req, initial_blend_y:req, target_blend_y:req, color:req + createvisualtask AnimTask_BlendColorCycleByTag, \priority, \tag, \delay, \num_blends, \initial_blend_y, \target_blend_y, \color + .endm + + .macro flash_anim_tag_with_color priority=2, tag:req, delay:req, num_blends:req, color1:req, blend_y1:req, color2:req, blend_y2:req + createvisualtask AnimTask_FlashAnimTagWithColor, \priority, \tag, \delay, \num_blends, \color1, \blend_y1, \color2, \blend_y2 + .endm + + .macro invert_screen_color priority=2, scenery:req, attacker:req, target:req + @ NOTE: These generate 0x000 or 0x101 to match, but the code checks for '& 0x100'. + createvisualtask AnimTask_InvertScreenColor, \priority, (\scenery << 8) | \scenery, (\attacker << 8) | \attacker, (\target << 8) | \target + .endm + + .macro tint_palettes priority=2, scenery:req, attacker:req, target:req, duration:req, color:req + createvisualtask AnimTask_TintPalettes, \priority, \scenery << 8, \attacker << 8, \target << 8, \duration, \color & 0x1F, (\color >> 5) & 0x1F, (\color >> 10) & 0x1F + .endm + + .macro shake_battle_platforms priority=2, x_offset:req, y_offset:req, shakes:req, delay:req + createvisualtask AnimTask_ShakeBattlePlatforms, \priority, \x_offset, \y_offset, \shakes, \delay + .endm diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 489bffb207..e06960e9c1 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -428,7 +428,7 @@ Move_POUND: monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -448,10 +448,10 @@ DoubleSlapContinue: blendoff end DoubleSlapLeft: - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-8, y=0, relative_to=ANIM_TARGET, animation=2 goto DoubleSlapContinue DoubleSlapRight: - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=8, y=0, relative_to=ANIM_TARGET, animation=2 goto DoubleSlapContinue Move_POISON_POWDER: @@ -566,13 +566,13 @@ Move_STRENGTH: createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_TARGET, 18, 6, 2, 4 delay 4 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 16, 12, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=16, y=12, relative_to=ANIM_TARGET, animation=1 delay 4 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, -12, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=-16, y=-12, relative_to=ANIM_TARGET, animation=1 delay 4 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 3, 4, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=3, y=4, relative_to=ANIM_TARGET, animation=1 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 waitforvisualfinish @@ -586,7 +586,7 @@ Move_TACKLE: setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish @@ -604,7 +604,7 @@ Move_BODY_SLAM: delay 11 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 4, x=-10, y=0, relative_to=ANIM_TARGET, animation=0 loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 10, 2 delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3 @@ -711,17 +711,17 @@ Move_PIN_MISSILE: createsprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 8, 8, 20, -40 delay 4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -8, -8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=-8, y=-8, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 delay 9 createsprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 0, 0, 20, -32 delay 4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=8, y=8, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 delay 14 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -740,17 +740,17 @@ Move_ICICLE_SPEAR: createsprite gIcicleSpearSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 8, 8, 20, -40 delay 4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -8, -8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=-8, y=-8, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 delay 9 createsprite gIcicleSpearSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 0, 0, 20, -32 delay 4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=8, y=8, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 delay 14 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -763,8 +763,8 @@ Move_TAKE_DOWN: setalpha 12, 8 createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 delay 35 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 10, RGB_BLACK, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=10, color2=RGB_BLACK, blend_y2=0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 4, x=-10, y=0, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, 0, 0, 4 @@ -783,26 +783,26 @@ Move_TAKE_DOWN: Move_DOUBLE_EDGE: loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_ATTACKER, delay=4, num_blends=2, color1=RGB_WHITE, blend_y1=10, color2=RGB_BLACK, blend_y2=0 waitforvisualfinish delay 10 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE + simple_palette_blend selector=F_PAL_BG, delay=0, initial_blend_y=16, target_blend_y=16, color=RGB_WHITE createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 delay 3 waitforvisualfinish playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_TARGET, 4, x=-10, y=0, relative_to=ANIM_TARGET, animation=0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=16, target_blend_y=0, color=RGB_WHITE waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 @@ -823,7 +823,7 @@ Move_POISON_STING: playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 20, 0, -8, 0, 20 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 5, 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET waitforvisualfinish @@ -844,10 +844,10 @@ Move_TWINEEDLE: createsprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 20, 12, 10, 12, 20 delay 20 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 5, 1 - createsprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -4, 1, 3 + create_handle_invert_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=-4, relative_to=ANIM_TARGET, animation=3 loopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 5, 2 delay 1 - createsprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 10, 12, 1, 3 + create_handle_invert_hitsplat_sprite ANIM_ATTACKER, 3, x=10, y=12, relative_to=ANIM_TARGET, animation=3 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -941,17 +941,17 @@ Move_MEGA_PUNCH: loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_TARGET delay 2 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 0, 16, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=0, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK setalpha 12, 8 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gMegaPunchKickSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 50 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_WHITE delay 50 call SetImpactBackground - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_WHITE - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=8, color2=RGB_BLACK, blend_y2=0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET @@ -984,7 +984,7 @@ Move_MEGA_KICK: loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_TARGET delay 2 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 0, 16, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=0, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK setalpha 12, 8 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gMegaPunchKickSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 50 @@ -992,10 +992,10 @@ Move_MEGA_KICK: delay 50 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET call SetImpactBackground - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_WHITE - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=8, color2=RGB_BLACK, blend_y2=0 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -1018,11 +1018,11 @@ CometPunchContinue: blendoff end CometPunchLeft: - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, -8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-8, y=-8, relative_to=ANIM_TARGET, animation=2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -8, 0, 8, 1, 0 goto CometPunchContinue CometPunchRight: - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, -8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=8, y=-8, relative_to=ANIM_TARGET, animation=2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 8, 0, 8, 1, 0 goto CometPunchContinue @@ -1047,7 +1047,7 @@ SonicBoomProjectile: delay 4 return SonicBoomHit: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 delay 4 return @@ -1154,23 +1154,23 @@ BeatUpContinue: blendoff end BeatUpLeft: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -20, -20, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=-20, y=-20, relative_to=ANIM_TARGET, animation=2 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, -20, -12, 8, 1, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 8, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=8, y=0, relative_to=ANIM_TARGET, animation=2 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 8, 8, 8, 1, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET goto BeatUpContinue BeatUpRight: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 12, -20, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=12, y=-20, relative_to=ANIM_TARGET, animation=2 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 12, -12, 8, 1, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -12, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=-12, y=0, relative_to=ANIM_TARGET, animation=2 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, -12, 8, 8, 1, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET @@ -1184,7 +1184,7 @@ Move_STOMP: playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gStompFootSpriteTemplate, ANIM_ATTACKER, 3, 0, -32, 15 delay 19 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, -8, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=-8, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 9, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish @@ -1247,10 +1247,10 @@ Move_REVERSAL: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 3, RGB_WHITE, 8, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=3, color1=RGB_WHITE, blend_y1=8, color2=RGB_BLACK, blend_y2=0 waitforvisualfinish delay 30 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 2, 0, 10, RGB_WHITE + blend_color_cycle priority=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=2, initial_blend_y=0, target_blend_y=10, color=RGB_WHITE delay 10 playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER createsprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 0 @@ -1264,9 +1264,9 @@ Move_REVERSAL: createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 8 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_WHITE, 8, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=1, color1=RGB_WHITE, blend_y1=8, color2=RGB_BLACK, blend_y2=0 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 10, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 8, 1, 0 end @@ -1288,12 +1288,12 @@ PursuitContinue: end PursuitNormal: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 6, 1, 0 goto PursuitContinue PursuitOnSwitchout: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 6, 1, 0 goto PursuitContinue @@ -1311,9 +1311,9 @@ Move_SPIKE_CANNON: createsprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 0, 0, 20 createsprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 8, 8, 20 waitforvisualfinish - createsprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -8, -8, 1, 2 - createsprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 2 - createsprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 8, 1, 2 + create_handle_invert_hitsplat_sprite ANIM_ATTACKER, 3, x=-8, y=-8, relative_to=ANIM_TARGET, animation=2 + create_handle_invert_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 + create_handle_invert_hitsplat_sprite ANIM_ATTACKER, 3, x=8, y=8, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 7, 1 loopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 5, 3 waitforvisualfinish @@ -1329,7 +1329,7 @@ Move_SWORDS_DANCE: createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 16, 6, 1, 4 createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 delay 22 - createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0 + flash_anim_tag_with_color tag=ANIM_TAG_SWORD, delay=2, num_blends=2, color1=RGB(18, 31, 31), blend_y1=16, color2=RGB_BLACK, blend_y2=0 waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -1339,7 +1339,7 @@ Move_SWORDS_DANCE: Move_PSYCH_UP: loadspritegfx ANIM_TAG_SPIRAL monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_BlendColorCycleExclude, 2, 1, 2, 6, 1, 11, RGB_BLACK + blend_color_cycleexclude unk0=1, delay=2, num_blends=6, initial_blend_y=1, target_blend_y=11, color=RGB_BLACK setalpha 12, 8 loopsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 5, 10 createsprite gPsychUpSpiralSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, 0 @@ -1363,7 +1363,7 @@ Move_DIZZY_PUNCH: setalpha 12, 8 call DizzyPunchLunge createsprite gFistFootSpriteTemplate, ANIM_TARGET, 5, 16, 8, 20, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 16, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 4, x=16, y=0, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, 160, -32 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, -256, -40 @@ -1374,7 +1374,7 @@ Move_DIZZY_PUNCH: delay 10 call DizzyPunchLunge createsprite gFistFootSpriteTemplate, ANIM_TARGET, 5, -16, -8, 20, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -16, -16, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 4, x=-16, y=-16, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, 160, -32 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, -256, -40 @@ -1446,13 +1446,13 @@ FuryCutterRight: createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 1 goto FuryCutterContinue FuryCutterMedium: - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB(9, 8, 10), 4, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=1, color1=RGB(9, 8, 10), blend_y1=4, color2=RGB_BLACK, blend_y2=0 goto FuryCutterContinue2 FuryCutterStrong: - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 3, RGB(9, 8, 10), 4, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=3, color1=RGB(9, 8, 10), blend_y1=4, color2=RGB_BLACK, blend_y2=0 goto FuryCutterContinue2 FuryCutterStrongest: - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 3, RGB(9, 8, 10), 4, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=3, color1=RGB(9, 8, 10), blend_y1=4, color2=RGB_BLACK, blend_y2=0 goto FuryCutterContinue2 Move_SELF_DESTRUCT: @@ -1497,7 +1497,7 @@ Move_SLAM: createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 delay 3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -12, 10, 0, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 delay 3 @@ -1623,7 +1623,7 @@ RisingWaterHitEffect: Move_EXPLOSION: loadspritegfx ANIM_TAG_EXPLOSION - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 8, 9, RGB(26, 8, 8), 8, RGB_BLACK, 8 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG, delay=8, num_blends=9, color1=RGB(26, 8, 8), blend_y1=8, color2=RGB_BLACK, blend_y2=8 createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_LEFT, 8, 0, 40, 1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_RIGHT, 8, 0, 40, 1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_LEFT, 8, 0, 40, 1 @@ -1678,7 +1678,7 @@ Move_PROTECT: Move_DETECT: loadspritegfx ANIM_TAG_SPARKLE_4 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 9, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=9, color=RGB_BLACK waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 9, RGB_WHITE delay 18 @@ -1686,7 +1686,7 @@ Move_DETECT: createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 13, 20, -20 waitforvisualfinish delay 10 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 9, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=9, target_blend_y=0, color=RGB_BLACK createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_WHITE waitforvisualfinish end @@ -1722,22 +1722,22 @@ Frustration_Strongest: createvisualtask AnimTask_SwayMon, 5, 0, 16, 6144, 8, ANIM_ATTACKER delay 5 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 30, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=24, y=8, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=-24, y=-16, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=8, y=4, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=-16, y=19, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=18, y=-18, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 9, 0, RGB_RED @@ -1755,15 +1755,15 @@ Frustration_Strong: createvisualtask AnimTask_StrongFrustrationGrowAndShrink, 5 delay 7 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 8, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=8, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 6, 1 delay 14 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 12, -6, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=12, y=-6, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 6, 1 delay 14 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -12, -6, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=-12, y=-6, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 6, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 9, 0, RGB_RED @@ -1776,13 +1776,13 @@ Frustration_Medium: createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 4, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=10, y=4, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -4, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-10, y=-4, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 goto Frustration_Continue Frustration_Weak: @@ -1792,7 +1792,7 @@ Frustration_Weak: createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 10, 2 delay 12 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1 goto Frustration_Continue @@ -1808,7 +1808,7 @@ Move_SAFEGUARD: createsprite gGuardRingSpriteTemplate, ANIM_ATTACKER, 2 waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATK_SIDE, 0, 2, 0, 10, RGB_WHITE + blend_color_cycle priority=2, selector=F_PAL_ATK_SIDE, delay=0, num_blends=2, initial_blend_y=0, target_blend_y=10, color=RGB_WHITE waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff @@ -1847,7 +1847,7 @@ Move_VICE_GRIP: createsprite gViceGripSpriteTemplate, ANIM_ATTACKER, 2, 0 createsprite gViceGripSpriteTemplate, ANIM_ATTACKER, 2, 1 delay 9 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 1, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 5, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -1869,8 +1869,8 @@ Move_GUILLOTINE: createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 23, 1 delay 46 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 8, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=8, color2=RGB_BLACK, blend_y2=0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -1889,7 +1889,7 @@ Move_PAY_DAY: createsprite gCoinThrowSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 1152 waitforvisualfinish playsewithpan SE_M_PAY_DAY, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 1, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createsprite gFallingCoinSpriteTemplate, ANIM_ATTACKER, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1 waitforvisualfinish @@ -1900,7 +1900,7 @@ Move_PAY_DAY: Move_OUTRAGE: loadspritegfx ANIM_TAG_SMALL_EMBER loopsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER, 8, 3 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 2, 5, 3, 8, RGB(14, 13, 0) + blend_color_cycle priority=2, selector=F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, delay=2, num_blends=5, initial_blend_y=3, target_blend_y=8, color=RGB(14, 13, 0) createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 5, 4 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 0, 3 @@ -1946,25 +1946,25 @@ Move_SPARK: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_SPARK_2 delay 0 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 5, 5, RGB(31, 31, 22) + blend_color_cycle priority=2, selector=F_PAL_BG | F_PAL_ATTACKER, delay=-31, num_blends=1, initial_blend_y=5, target_blend_y=5, color=RGB(31, 31, 22) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, ANIM_ATTACKER, 1, 0 delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, ANIM_ATTACKER, 1, 1 delay 0 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 0, 0, RGB(31, 31, 22) + blend_color_cycle priority=2, selector=F_PAL_BG | F_PAL_ATTACKER, delay=-31, num_blends=1, initial_blend_y=0, target_blend_y=0, color=RGB(31, 31, 22) delay 10 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 5, 5, RGB(31, 31, 22) + blend_color_cycle priority=2, selector=F_PAL_BG | F_PAL_ATTACKER, delay=-31, num_blends=1, initial_blend_y=5, target_blend_y=5, color=RGB(31, 31, 22) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 24, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 24, 42, 11, ANIM_ATTACKER, 1, 1 delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 24, 165, 10, ANIM_ATTACKER, 1, 1 delay 0 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 0, 0, RGB(31, 31, 22) + blend_color_cycle priority=2, selector=F_PAL_BG | F_PAL_ATTACKER, delay=-31, num_blends=1, initial_blend_y=0, target_blend_y=0, color=RGB(31, 31, 22) delay 20 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 7, 7, RGB(31, 31, 22) + blend_color_cycle priority=2, selector=F_PAL_BG | F_PAL_ATTACKER, delay=-31, num_blends=1, initial_blend_y=7, target_blend_y=7, color=RGB(31, 31, 22) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 0, 20, 0, 0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 64, 20, 1, 0 @@ -1976,14 +1976,14 @@ Move_SPARK: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 224, 20, 2, 0 delay 4 waitforvisualfinish - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 0, 0, RGB(31, 31, 22) + blend_color_cycle priority=2, selector=F_PAL_BG | F_PAL_ATTACKER, delay=-31, num_blends=1, initial_blend_y=0, target_blend_y=0, color=RGB(31, 31, 22) createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 4 playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, -31, 2, 0, 6, RGB(31, 31, 22) + blend_color_cycle priority=2, selector=F_PAL_TARGET, delay=-31, num_blends=2, initial_blend_y=0, target_blend_y=6, color=RGB(31, 31, 22) call ElectricityEffect waitforvisualfinish end @@ -2014,7 +2014,7 @@ Move_ATTRACT: createsprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 112, 256, 90 createsprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 200, 272, 90 delay 75 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 10, RGB(31, 25, 27) + blend_color_cycle priority=2, selector=F_PAL_TARGET, delay=4, num_blends=4, initial_blend_y=0, target_blend_y=10, color=RGB(31, 25, 27) end Move_GROWTH: @@ -2024,7 +2024,7 @@ Move_GROWTH: waitforvisualfinish end GrowthEffect: - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB_WHITE + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=0, num_blends=2, initial_blend_y=0, target_blend_y=8, color=RGB_WHITE playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaleMonAndRestore, 5, -3, -3, 16, ANIM_ATTACKER, 0 return @@ -2054,7 +2054,7 @@ Move_CONFUSE_RAY: fadetobg BG_GHOST waitbgfadein createvisualtask SoundTask_AdjustPanningVar, 2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0 - createvisualtask AnimTask_BlendColorCycleByTag, 2, ANIM_TAG_YELLOW_BALL, 0, 6, 0, 14, RGB(31, 10, 0) + blend_color_cyclebytag tag=ANIM_TAG_YELLOW_BALL, delay=0, num_blends=6, initial_blend_y=0, target_blend_y=14, color=RGB(31, 10, 0) createsprite gConfuseRayBallBounceSpriteTemplate, ANIM_TARGET, 2, 28, 0, 288 waitforvisualfinish setalpha 8, 8 @@ -2084,12 +2084,12 @@ Move_MEAN_LOOK: loadspritegfx ANIM_TAG_EYE monbg ANIM_DEF_PARTNER playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 16, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK loopsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET, 15, 4 waitplaysewithpan SE_M_LEER, SOUND_PAN_TARGET, 85 createsprite gMeanLookEyeSpriteTemplate, ANIM_ATTACKER, 2 delay 120 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=16, target_blend_y=0, color=RGB_BLACK delay 30 clearmonbg ANIM_DEF_PARTNER waitforvisualfinish @@ -2097,7 +2097,7 @@ Move_MEAN_LOOK: Move_ROCK_THROW: loadspritegfx ANIM_TAG_ROCKS - createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_TARGET, 2, 6, 1, 15, 1 + shake_mon_or_platform unused_anim_battler=ANIM_TARGET, velocity=6, shake_timer=1, shake_duration=15, type=SHAKE_BG_Y createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 0, 1, 0, 0 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 6 @@ -2119,7 +2119,7 @@ Move_ROCK_THROW: Move_ROCK_SLIDE: loadspritegfx ANIM_TAG_ROCKS monbg ANIM_DEF_PARTNER - createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, 7, 1, 11, 1 + shake_mon_or_platform velocity=7, shake_timer=1, shake_duration=11, type=SHAKE_BG_Y createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -5, 1, -5, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 @@ -2177,7 +2177,7 @@ Move_THIEF: createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 6 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 8, 1 waitforvisualfinish delay 20 @@ -2328,7 +2328,7 @@ Move_CONVERSION: createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 24, 24 delay 20 playsewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_CONVERSION, 1, 1, RGB(31, 31, 13), 12, 0, 0 + flash_anim_tag_with_color tag=ANIM_TAG_CONVERSION, delay=1, num_blends=1, color1=RGB(31, 31, 13), blend_y1=12, color2=RGB_BLACK, blend_y2=0 delay 6 createvisualtask AnimTask_ConversionAlphaBlend, 5 waitforvisualfinish @@ -2396,7 +2396,7 @@ Move_ROLLING_KICK: createsprite gSlidingKickSpriteTemplate, ANIM_ATTACKER, 2, -24, 0, 48, 10, 160, 0 delay 5 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-8, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 8 @@ -2415,7 +2415,7 @@ Move_HEADBUTT: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 4, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish end @@ -2433,7 +2433,7 @@ Move_HORN_ATTACK: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 4, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET waitforvisualfinish end @@ -2451,14 +2451,14 @@ FuryAttackContinue: FuryAttackRight: createsprite gHornHitSpriteTemplate, ANIM_TARGET, 4, 8, 8, 10 waitforvisualfinish - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET goto FuryAttackContinue FuryAttackLeft: createsprite gHornHitSpriteTemplate, ANIM_TARGET, 4, -8, -8, 10 waitforvisualfinish - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET goto FuryAttackContinue @@ -2482,37 +2482,37 @@ HornDrillContinue: playse SE_BANG createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 40, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 40, 1 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 3 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 2, ANIM_TARGET, 3 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=0, y=2, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -4, 3, ANIM_TARGET, 3 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=-4, y=3, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -8, -5, ANIM_TARGET, 3 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=-8, y=-5, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 4, -12, ANIM_TARGET, 3 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=4, y=-12, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 16, 0, ANIM_TARGET, 3 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=16, y=0, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 5, 18, ANIM_TARGET, 3 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=5, y=18, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -17, 12, ANIM_TARGET, 2 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=-17, y=12, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -21, -15, ANIM_TARGET, 2 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=-21, y=-15, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, -27, ANIM_TARGET, 2 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=8, y=-27, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 0, ANIM_TARGET, 2 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=32, y=0, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 @@ -2589,7 +2589,7 @@ Move_LOW_KICK: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 createsprite gSlidingKickSpriteTemplate, ANIM_TARGET, 2, -24, 28, 40, 8, 160, 0 delay 4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=-8, y=8, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 6, 384, ANIM_TARGET, 2 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish @@ -2601,9 +2601,9 @@ Move_EARTHQUAKE: createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 10, 50 playsewithpan SE_M_EARTHQUAKE, 0 delay 10 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=14, color2=RGB_WHITE, blend_y2=14 delay 16 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=14, color2=RGB_WHITE, blend_y2=14 end Move_FISSURE: @@ -2614,11 +2614,11 @@ Move_FISSURE: delay 8 call FissureDirtPlumeFar delay 15 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=14, color2=RGB_WHITE, blend_y2=14 delay 15 call FissureDirtPlumeClose delay 15 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=14, color2=RGB_WHITE, blend_y2=14 delay 15 call FissureDirtPlumeFar delay 50 @@ -2683,7 +2683,7 @@ DigUnleash: delay 1 createvisualtask AnimTask_DigUpMovement, 2, TRUE delay 16 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-8, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_ATTACKER clearmonbg ANIM_ATTACKER @@ -2737,7 +2737,7 @@ Move_QUICK_ATTACK: playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER delay 4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 4, x=0, y=0, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_ATK_PARTNER @@ -2759,7 +2759,7 @@ Move_RAGE: waitforvisualfinish createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6 delay 4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, TRUE, 1, 10, 1, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish @@ -2846,10 +2846,10 @@ SkullBashAttack: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER waitforvisualfinish playse SE_BANG - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=14, color2=RGB_WHITE, blend_y2=14 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 40, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 40, 1 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 0 + create_flashing_hitsplat_sprite ANIM_TARGET, 4, x=0, y=0, relative_to=ANIM_TARGET, animation=0 loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 8, 3 waitforvisualfinish createvisualtask AnimTask_SkullBashPosition, 2, 1 @@ -2909,7 +2909,7 @@ Move_BARRAGE: createvisualtask AnimTask_BarrageBall, 3 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER delay 24 - createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, 8, 1, 40, 1 + shake_mon_or_platform velocity=8, shake_timer=1, shake_duration=40, type=SHAKE_BG_Y createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 0, 4, 20, 1 createvisualtask AnimTask_ShakeMon, 3, ANIM_DEF_PARTNER, 0, 4, 20, 1 loopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 8, 2 @@ -3025,7 +3025,7 @@ Move_SUPER_FANG: createsprite gSuperFangSpriteTemplate, ANIM_TARGET, 2 playsewithpan SE_M_BITE, SOUND_PAN_TARGET delay 8 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB(31, 2, 2), 14, RGB_WHITE, 14 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG, delay=3, num_blends=1, color1=RGB(31, 2, 2), blend_y1=14, color2=RGB_WHITE, blend_y2=14 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 7, 12, 1 waitforvisualfinish blendoff @@ -3052,7 +3052,7 @@ Move_STRUGGLE: createsprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 2 loopsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER, 12, 4 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish @@ -3100,7 +3100,7 @@ Move_FLAIL: createvisualtask AnimTask_FlailMovement, 2, ANIM_ATTACKER loopsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER, 8, 2 waitforvisualfinish - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 + create_random_pos_hitsplat_sprite ANIM_TARGET, 3, relative_to=ANIM_TARGET, animation=3 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 30, 1, 0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish @@ -3113,7 +3113,7 @@ Move_SPITE: playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER waitbgfadein monbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 6, 0, 8, RGB_WHITE + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=2, num_blends=6, initial_blend_y=0, target_blend_y=8, color=RGB_WHITE createvisualtask AnimTask_SpiteTargetShadow, 2 loopsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET, 20, 3 waitforvisualfinish @@ -3138,7 +3138,7 @@ MachPunchContinue: createvisualtask AnimTask_AttackerPunchWithTrace, 2, RGB(8, 9, 28), 10 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 @@ -3198,7 +3198,7 @@ Move_ENDURE: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect delay 8 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=11, color=RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect delay 8 @@ -3242,7 +3242,7 @@ Move_ROLLOUT: createvisualtask AnimTask_Rollout, 2 waitforvisualfinish createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 30, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 4, x=0, y=0, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -3272,7 +3272,7 @@ Move_FALSE_SWIPE: delay 2 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 3 + create_basic_hitsplat_sprite ANIM_TARGET, 4, x=0, y=0, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET end @@ -3332,9 +3332,9 @@ MagnitudeIntense: createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 0, 50 loopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 8, 10 delay 10 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=14, color2=RGB_WHITE, blend_y2=14 delay 16 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=14, color2=RGB_WHITE, blend_y2=14 goto MagnitudeEnd Move_RAPID_SPIN: @@ -3345,7 +3345,7 @@ Move_RAPID_SPIN: createvisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 0 loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 10, 1, 0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET waitforvisualfinish @@ -3361,7 +3361,7 @@ Move_MOONLIGHT: loadspritegfx ANIM_TAG_GREEN_SPARKLE loadspritegfx ANIM_TAG_BLUE_STAR setalpha 0, 16 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 16, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK waitforvisualfinish createsprite gMoonSpriteTemplate, ANIM_ATTACKER, 2, 120, 56 createvisualtask AnimTask_AlphaFadeIn, 3, 0, 16, 16, 0, 1 @@ -3404,13 +3404,13 @@ ExtremeSpeedContinue: createvisualtask AnimTask_ExtremeSpeedImpact, 2 delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gMonEdgeHitSplatSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, -12, 3 + create_mon_edge_hitsplat_sprite ANIM_TARGET, 2, relative_to=ANIM_TARGET, x=0, y=-12, animation=3 delay 10 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gMonEdgeHitSplatSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, 3 + create_mon_edge_hitsplat_sprite ANIM_TARGET, 2, relative_to=ANIM_TARGET, x=0, y=12, animation=3 delay 10 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - createsprite gMonEdgeHitSplatSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 0, 3 + create_mon_edge_hitsplat_sprite ANIM_TARGET, 2, relative_to=ANIM_TARGET, x=0, y=0, animation=3 waitforvisualfinish createvisualtask AnimTask_SpeedDust, 2 delay 10 @@ -3567,7 +3567,7 @@ Move_CHARGE: loadspritegfx ANIM_TAG_ELECTRICITY monbg ANIM_ATTACKER setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=4, color=RGB_BLACK waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER @@ -3591,7 +3591,7 @@ Move_CHARGE: createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, -16, -16 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 4, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=4, initial_blend_y=4, target_blend_y=0, color=RGB_BLACK clearmonbg ANIM_ATTACKER blendoff end @@ -3660,7 +3660,7 @@ Move_SUPERPOWER: createsprite gSuperpowerOrbSpriteTemplate, ANIM_TARGET, 2, ANIM_ATTACKER playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER delay 20 - createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, 180, 1 + shake_mon_or_platform velocity=4, shake_timer=1, shake_duration=180, type=SHAKE_BG_Y createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_EARTHQUAKE, 0 delay 40 createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 200, 96, 1, 120 @@ -3712,22 +3712,22 @@ BrickBreakNormal: createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 8 delay 4 delay 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -18, -18, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=-18, y=-18, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET delay 20 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 8 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, 18, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=18, y=18, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET delay 20 createvisualtask AnimTask_WindUpLunge, 2, ANIM_ATTACKER, -24, 0, 24, 10, 24, 3 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 6, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=6, color=RGB_BLACK delay 37 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 10, 1, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 6, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=6, target_blend_y=0, color=RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET end @@ -3738,18 +3738,18 @@ BrickBreakShatteredWall: delay 4 createsprite gBrickBreakWallSpriteTemplate, ANIM_ATTACKER, 3, ANIM_TARGET, 0, 0, 90, 10 delay 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -18, -18, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=-18, y=-18, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET delay 20 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 8 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, 18, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=18, y=18, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET delay 20 createvisualtask AnimTask_WindUpLunge, 2, ANIM_ATTACKER, -24, 0, 24, 10, 24, 3 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 6, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=6, color=RGB_BLACK delay 37 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 10, 1, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish @@ -3759,7 +3759,7 @@ BrickBreakShatteredWall: createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 3, 8, 12 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 6, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=6, target_blend_y=0, color=RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET end @@ -3788,17 +3788,17 @@ Move_ENDEAVOR: createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(31, 21, 0), 12, 1, 2 delay 6 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 12, -12, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=12, y=-12, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 24 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -12, 12, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=-12, y=12, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET end Move_ERUPTION: loadspritegfx ANIM_TAG_WARM_ROCK - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 2, 0, 4, RGB_RED + simple_palette_blend selector=F_PAL_BG | F_PAL_BATTLERS, delay=2, initial_blend_y=0, target_blend_y=4, color=RGB_RED waitforvisualfinish createvisualtask AnimTask_EruptionLaunchRocks, 2 waitplaysewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER, 60 @@ -3818,7 +3818,7 @@ Move_ERUPTION: createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 8, 60 loopsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET, 16, 12 delay 80 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 40, F_PAL_BG | F_PAL_BATTLERS, 4, 4, 0, RGB_RED + simple_palette_blend unused_subpriority_offset=40, selector=F_PAL_BG | F_PAL_BATTLERS, delay=4, initial_blend_y=4, target_blend_y=0, color=RGB_RED end Move_SKILL_SWAP: @@ -3891,13 +3891,13 @@ Move_TAIL_GLOW: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT monbg ANIM_ATTACKER setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=4, color=RGB_BLACK waitforvisualfinish createsprite gTailGlowOrbSpriteTemplate, ANIM_ATTACKER, 66, ANIM_ATTACKER delay 18 loopsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER, 16, 6 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 4, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=4, initial_blend_y=4, target_blend_y=0, color=RGB_BLACK clearmonbg ANIM_ATTACKER blendoff delay 1 @@ -3920,22 +3920,22 @@ Move_LUSTER_PURGE: waitforvisualfinish createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(0, 0, 23) waitforvisualfinish - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + create_random_pos_hitsplat_sprite ANIM_TARGET, 3, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + create_random_pos_hitsplat_sprite ANIM_TARGET, 3, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + create_random_pos_hitsplat_sprite ANIM_TARGET, 3, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + create_random_pos_hitsplat_sprite ANIM_TARGET, 3, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + create_random_pos_hitsplat_sprite ANIM_TARGET, 3, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + create_random_pos_hitsplat_sprite ANIM_TARGET, 3, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA @@ -3955,7 +3955,7 @@ Move_MIST_BALL: waitforvisualfinish playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 10, 0 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 1, 1, RGB(23, 16, 31), 16, RGB_WHITE, 16 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=0, selector=F_PAL_BG, delay=1, num_blends=1, color1=RGB(23, 16, 31), blend_y1=16, color2=RGB_WHITE, blend_y2=16 delay 0 playsewithpan SE_M_HAZE, 0 createvisualtask AnimTask_MistBallFog, 5 @@ -4085,7 +4085,7 @@ Move_NEEDLE_ARM: createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 16, 16, 16 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 0, -24, 10 @@ -4133,7 +4133,7 @@ Move_AROMATHERAPY: loadspritegfx ANIM_TAG_FLOWER loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_SPARKLE_2 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 0, 0, 7, RGB(13, 31, 12) + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_BG, delay=0, initial_blend_y=0, target_blend_y=7, color=RGB(13, 31, 12) delay 1 monbg ANIM_ATTACKER delay 1 @@ -4151,7 +4151,7 @@ Move_AROMATHERAPY: waitforvisualfinish clearmonbg ANIM_ATTACKER delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 0, 7, 0, RGB(13, 31, 12) + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_BG, delay=0, initial_blend_y=7, target_blend_y=0, color=RGB(13, 31, 12) delay 1 playsewithpan SE_M_STAT_INCREASE, SOUND_PAN_ATTACKER createvisualtask AnimTask_StatusClearedEffect, 2, 1 @@ -4162,7 +4162,7 @@ Move_AROMATHERAPY: createsprite gSparklingStarsSpriteTemplate, ANIM_ATTACKER, 16, 12, -5, 0, 0, 32, 60, 1 waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_ANIM_1, 3, 10, 0, RGB(13, 31, 12) + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_ANIM_1, delay=3, initial_blend_y=10, target_blend_y=0, color=RGB(13, 31, 12) createsprite gBlendThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 16, 0, 0, 0, 1 waitforvisualfinish end @@ -4223,13 +4223,13 @@ Move_ODOR_SLEUTH: waitforvisualfinish clearmonbg ANIM_TARGET delay 1 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_WHITEALPHA, 16, RGB_WHITEALPHA, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG, delay=3, num_blends=1, color1=RGB_WHITEALPHA, blend_y1=16, color2=RGB_WHITEALPHA, blend_y2=0 playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER end Move_GRASS_WHISTLE: loadspritegfx ANIM_TAG_MUSIC_NOTES - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB(18, 31, 12) + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=4, color=RGB(18, 31, 12) waitforvisualfinish createvisualtask AnimTask_MusicNotesRainbowBlend, 2 waitforvisualfinish @@ -4260,19 +4260,19 @@ Move_GRASS_WHISTLE: delay 4 waitforvisualfinish createvisualtask AnimTask_MusicNotesClearRainbowBlend, 2 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 4, 0, RGB(18, 31, 12) + simple_palette_blend selector=F_PAL_BG, delay=4, initial_blend_y=4, target_blend_y=0, color=RGB(18, 31, 12) waitforvisualfinish end Move_TICKLE: loadspritegfx ANIM_TAG_EYE_SPARKLE - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 0, 16, RGB_BLACK + simple_palette_blend selector=F_PAL_ATTACKER, delay=0, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK waitforvisualfinish createsprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, -16, -8 createsprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, 16, -8 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 16, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_ATTACKER, delay=0, initial_blend_y=16, target_blend_y=0, color=RGB_BLACK waitforvisualfinish delay 20 createvisualtask AnimTask_SwayMon, 3, 0, 6, 1280, 3, ANIM_ATTACKER @@ -4309,7 +4309,7 @@ Move_SHADOW_PUNCH: createvisualtask AnimTask_AttackerPunchWithTrace, 2, RGB_BLACK, 13 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 @@ -4351,7 +4351,7 @@ Move_AERIAL_ACE: playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 10, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=10, color2=RGB_BLACK, blend_y2=0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET @@ -4361,7 +4361,7 @@ Move_AERIAL_ACE: Move_IRON_DEFENSE: loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER, 28, 2 createvisualtask AnimTask_MetallicShine, 5, 0, 0, RGB_BLACK - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 8, 2, RGB_WHITEALPHA, 14, RGB_WHITEALPHA, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG, delay=8, num_blends=2, color1=RGB_WHITEALPHA, blend_y1=14, color2=RGB_WHITEALPHA, blend_y2=0 waitforvisualfinish end @@ -4509,7 +4509,7 @@ Move_LEAF_BLADE: setalpha 12, 8 delay 12 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 18, 1 - createsprite gCrossImpactSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 36 + create_cross_impact_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, duration=36 playsewithpan SE_M_LEER, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET @@ -4547,7 +4547,7 @@ Move_SHOCK_WAVE: loadspritegfx ANIM_TAG_LIGHTNING monbg ANIM_ATTACKER setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=4, color=RGB_BLACK waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 20, 0, 2 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER @@ -4629,7 +4629,7 @@ Move_MIND_READER: createsprite gWhiteHaloSpriteTemplate, ANIM_ATTACKER, 5 delay 40 playsewithpan SE_M_LEER, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG, 1, 2, 0, 10, RGB_BLACK + blend_color_cycle priority=2, selector=F_PAL_BG, delay=1, num_blends=2, initial_blend_y=0, target_blend_y=10, color=RGB_BLACK call MindReaderEyeSpikeEffect waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -4665,7 +4665,7 @@ Move_ICE_PUNCH: loadspritegfx ANIM_TAG_ICE_CRYSTALS loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=0, target_blend_y=7, color=RGB_BLACK createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(12, 26, 31) delay 20 playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET @@ -4680,7 +4680,7 @@ Move_ICE_PUNCH: createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 224 delay 17 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 4, 0, -10, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -10, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=-10, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 3, 1 @@ -4690,7 +4690,7 @@ Move_ICE_PUNCH: delay 5 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(12, 26, 31) waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 7, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=0, initial_blend_y=7, target_blend_y=0, color=RGB_BLACK waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -4712,7 +4712,7 @@ Move_CONFUSION: call SetPsychicBackground setalpha 8, 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB_WHITE + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=0, num_blends=2, initial_blend_y=0, target_blend_y=8, color=RGB_WHITE waitforvisualfinish playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 @@ -4729,7 +4729,7 @@ Move_PSYCHIC: call SetPsychicBackground setalpha 8, 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB(31, 23, 0) + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=0, num_blends=2, initial_blend_y=0, target_blend_y=8, color=RGB(31, 23, 0) waitforvisualfinish loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 10, 3 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 15, 1 @@ -4754,7 +4754,7 @@ FutureSight: call SetPsychicBackground setalpha 8, 8 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB_WHITE + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=0, num_blends=2, initial_blend_y=0, target_blend_y=8, color=RGB_WHITE createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_ATTACKER, 1 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER @@ -4767,9 +4767,9 @@ Move_THUNDER: waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, -256, 0, 1, -1 waitbgfadein - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 16, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK delay 16 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, -36 @@ -4786,7 +4786,7 @@ Move_THUNDER: createsprite gLightningSpriteTemplate, ANIM_TARGET, 6, -16, 16 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET delay 5 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 24, -32 delay 1 @@ -4794,9 +4794,9 @@ Move_THUNDER: delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 24, 16 delay 30 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 5 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -32 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET @@ -4805,13 +4805,13 @@ Move_THUNDER: delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 10 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 createvisualtask AnimTask_ShakeTargetInPattern, 2, 30, 3, TRUE, 0 delay 2 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_TARGET, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK + simple_palette_blend unused_anim_battler=ANIM_TARGET, selector=F_PAL_BG, delay=2, initial_blend_y=16, target_blend_y=0, color=RGB_BLACK waitforvisualfinish restorebg waitbgfadeout @@ -4825,13 +4825,13 @@ Move_THUNDER_PUNCH: loadspritegfx ANIM_TAG_LIGHTNING monbg ANIM_TARGET setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 16, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 delay 1 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48 delay 1 @@ -4840,12 +4840,12 @@ Move_THUNDER_PUNCH: createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, 16 delay 1 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=16, target_blend_y=0, color=RGB_BLACK delay 20 waitforvisualfinish clearmonbg ANIM_TARGET @@ -4868,12 +4868,12 @@ Move_SACRED_FIRE: delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 20, 10, 50, 5, 1, 1 delay 1 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 50, 5, 0, 1 delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -20, 10, 50, 5, -1, 1 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 waitforvisualfinish playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET @@ -4885,10 +4885,10 @@ Move_SACRED_FIRE: playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createsprite gLargeFlameSpriteTemplate, ANIM_TARGET, 2, 16, 0, 80, 16, 0, 1 delay 1 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 waitforvisualfinish - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 0 @@ -5011,7 +5011,7 @@ SnoreEffect: playsewithpan SE_M_SNORE, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 7, ANIM_ATTACKER, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 7, 1 - createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, 14, 0, 0 + shake_mon_or_platform velocity=6, shake_timer=1, shake_duration=14, type=SHAKE_BG_X, battler_selector=SHAKE_MON_ATTACKER createsprite gSnoreZSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -42, -38, 24, 0, 0 createsprite gSnoreZSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, -42, 24, 0, 0 createsprite gSnoreZSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 42, -38, 24, 0, 0 @@ -5135,7 +5135,7 @@ Move_SMOG: call SmogCloud delay 120 loopsewithpan SE_M_TOXIC, SOUND_PAN_TARGET, 18, 2 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(26, 0, 26) + blend_color_cycle priority=2, selector=F_PAL_TARGET, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(26, 0, 26) delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 15, 1 waitforvisualfinish @@ -5165,7 +5165,7 @@ Move_FAINT_ATTACK: monbg ANIM_TARGET delay 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 9, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -5289,7 +5289,7 @@ Move_BITE: createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 delay 10 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 7, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -5308,14 +5308,14 @@ Move_CRUNCH: createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, -32, -32, 1, 819, 819, 10 createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 32, 32, 5, -819, -819, 10 delay 10 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-8, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 waitforvisualfinish playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 32, -32, 7, -819, 819, 10 createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, -32, 32, 3, 819, -819, 10 delay 10 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=8, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 waitforvisualfinish clearmonbg ANIM_TARGET @@ -5334,7 +5334,7 @@ Move_CLAMP: createsprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 2, 819, 0, 10 createsprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 6, -819, 0, 10 delay 10 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -5347,7 +5347,7 @@ Move_ICE_BEAM: splitbgprio ANIM_TARGET setalpha 12, 8 loadspritegfx ANIM_TAG_ICE_CRYSTALS - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=0, target_blend_y=7, color=RGB_BLACK waitforvisualfinish createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_BUBBLE_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 4, 4, 0, 10 createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, 12, 0, 12, 20 @@ -5356,7 +5356,7 @@ Move_ICE_BEAM: call IceBeamCreateCrystals call IceBeamCreateCrystals call IceBeamCreateCrystals - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, -31, 0, 7, RGB(0, 20, 31) + simple_palette_blend selector=F_PAL_TARGET, delay=-31, initial_blend_y=0, target_blend_y=7, color=RGB(0, 20, 31) createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 25, 1 call IceBeamCreateCrystals call IceBeamCreateCrystals @@ -5372,9 +5372,9 @@ Move_ICE_BEAM: waitforvisualfinish delay 20 call IceCrystalEffectShort - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, 5, 7, 0, RGB(0, 20, 31) + simple_palette_blend selector=F_PAL_TARGET, delay=5, initial_blend_y=7, target_blend_y=0, color=RGB(0, 20, 31) waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 7, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=0, initial_blend_y=7, target_blend_y=0, color=RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -5437,7 +5437,7 @@ SolarBeamEnd: SolarBeamSetUp: monbg ANIM_ATK_PARTNER setalpha 12, 8 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 1, 4, 0, 11, RGB(31, 31, 11) + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=1, num_blends=4, initial_blend_y=0, target_blend_y=11, color=RGB(31, 31, 11) playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call SolarBeamAbsorbEffect waitforvisualfinish @@ -5572,7 +5572,7 @@ BlizzardAgainstPlayer: Move_POWDER_SNOW: loadspritegfx ANIM_TAG_ICE_CRYSTALS monbg ANIM_DEF_PARTNER - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 1, 0, 3, RGB_BLACK + simple_palette_blend selector=F_PAL_BG | F_PAL_BATTLERS, delay=1, initial_blend_y=0, target_blend_y=3, color=RGB_BLACK waitforvisualfinish panse SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 call PowderSnowSnowballs @@ -5584,7 +5584,7 @@ Move_POWDER_SNOW: waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 20 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 1, 3, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG | F_PAL_BATTLERS, delay=1, initial_blend_y=3, target_blend_y=0, color=RGB_BLACK end PowderSnowSnowballs: createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0, 56, 4, 4, 1 @@ -5665,7 +5665,7 @@ Move_SIGNAL_BEAM: call SignalBeamOrbs call SignalBeamOrbs createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 25, 1 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, 8, 5, RGB_RED, 8, RGB(1, 30, 0), 8 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_TARGET, delay=8, num_blends=5, color1=RGB_RED, blend_y1=8, color2=RGB(1, 30, 0), blend_y2=8 call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs @@ -5698,10 +5698,10 @@ Move_ABSORB: monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 4, RGB(13, 31, 12) + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=0, target_blend_y=4, color=RGB(13, 31, 12) waitforvisualfinish playsewithpan SE_M_ABSORB, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 delay 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 waitforvisualfinish @@ -5711,7 +5711,7 @@ Move_ABSORB: delay 15 call HealingEffect waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 4, 0, RGB(13, 31, 12) + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=4, target_blend_y=0, color=RGB(13, 31, 12) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -5751,10 +5751,10 @@ Move_MEGA_DRAIN: monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 8, RGB(13, 31, 12) + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=0, target_blend_y=8, color=RGB(13, 31, 12) waitforvisualfinish playsewithpan SE_M_ABSORB, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=1 delay 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 waitforvisualfinish @@ -5764,7 +5764,7 @@ Move_MEGA_DRAIN: delay 15 call HealingEffect waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 8, 0, RGB(13, 31, 12) + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=8, target_blend_y=0, color=RGB(13, 31, 12) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -5812,10 +5812,10 @@ Move_GIGA_DRAIN: monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 12, RGB(13, 31, 12) + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=0, target_blend_y=12, color=RGB(13, 31, 12) waitforvisualfinish playsewithpan SE_M_ABSORB, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0 delay 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 waitforvisualfinish @@ -5825,7 +5825,7 @@ Move_GIGA_DRAIN: delay 15 call HealingEffect waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 12, 0, RGB(13, 31, 12) + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=12, target_blend_y=0, color=RGB(13, 31, 12) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -5886,19 +5886,19 @@ Move_LEECH_LIFE: delay 1 createsprite gLeechLifeNeedleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 12 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_ABSORB, SOUND_PAN_TARGET delay 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=0, target_blend_y=7, color=RGB_BLACK waitforvisualfinish call AbsorbEffect waitforvisualfinish delay 15 call HealingEffect waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 7, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=7, target_blend_y=0, color=RGB_BLACK waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -5906,7 +5906,7 @@ Move_LEECH_LIFE: Move_SYNTHESIS: loadspritegfx ANIM_TAG_SPARKLE_2 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 16, RGB(27, 31, 18) + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=16, color=RGB(27, 31, 18) playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call GrantingStarsEffect waitforvisualfinish @@ -5948,7 +5948,7 @@ Move_SLUDGE: createsprite gSludgeProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 0 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 2, 0, 12, RGB(30, 0, 31) + blend_color_cycle priority=2, selector=F_PAL_TARGET, delay=1, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(30, 0, 31) call PoisonBubblesEffect waitforvisualfinish end @@ -5966,7 +5966,7 @@ Move_SLUDGE_BOMB: call SludgeBombProjectile call SludgeBombProjectile createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 3, 0, 15, 1 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 2, 0, 12, RGB(30, 0, 31) + blend_color_cycle priority=2, selector=F_PAL_TARGET, delay=1, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(30, 0, 31) createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 27, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -27, 44, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 39, -28, 20 @@ -6010,7 +6010,7 @@ Move_ACID: delay 15 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_DEF_PARTNER, 2, 0, 10, 1 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_DEF_SIDE, 2, 2, 0, 12, RGB(30, 0, 31) + blend_color_cycle priority=2, selector=F_PAL_DEF_SIDE, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(30, 0, 31) createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -22, 0, 15, 55 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET delay 10 @@ -6039,7 +6039,7 @@ Move_BONEMERANG: createsprite gBonemerangSpriteTemplate, ANIM_ATTACKER, 2 delay 20 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 5, 1 delay 17 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER @@ -6058,9 +6058,9 @@ Move_BONE_CLUB: playsewithpan SE_M_BONEMERANG, SOUND_PAN_TARGET createsprite gSpinningBoneSpriteTemplate, ANIM_ATTACKER, 2, -42, -25, 0, 0, 15 delay 12 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 5, 1, RGB_BLACK, 10, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, delay=5, num_blends=1, color1=RGB_BLACK, blend_y1=10, color2=RGB_BLACK, blend_y2=0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -6075,7 +6075,7 @@ Move_BONE_RUSH: playsewithpan SE_M_BONEMERANG, SOUND_PAN_TARGET createsprite gSpinningBoneSpriteTemplate, ANIM_ATTACKER, 2, -42, -25, 0, 0, 15 delay 12 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 5, 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET waitforvisualfinish @@ -6120,11 +6120,11 @@ MegahornContinue: createsprite gMegahornHornSpriteTemplate, ANIM_ATTACKER, 3, -42, 25, 0, 0, 6 delay 4 playsewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, 4, 1, 4 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, -4, 1, 12, 1 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, delay=5, num_blends=1, color1=RGB_WHITE, blend_y1=10, color2=RGB_BLACK, blend_y2=0 delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 11 delay 3 @@ -6154,7 +6154,7 @@ Move_GUST: createvisualtask AnimTask_AnimateGustTornadoPalette, 5, 1, 70 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 1, 0, 7, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_GUST2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -6175,8 +6175,8 @@ Move_WING_ATTACK: delay 24 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 9 delay 17 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 16, 0, ANIM_TARGET, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=16, y=0, relative_to=ANIM_TARGET, animation=1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-16, y=0, relative_to=ANIM_TARGET, animation=1 loopsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET, 5, 2 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 11 @@ -6189,7 +6189,7 @@ Move_PECK: loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createvisualtask AnimTask_RotateMonToSideAndRestore, 2, 3, -768, ANIM_TARGET, 2 - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -12, 0, ANIM_TARGET, 3 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=-12, y=0, relative_to=ANIM_TARGET, animation=3 waitforvisualfinish end @@ -6207,7 +6207,7 @@ Move_AEROBLAST: call AeroblastBeam call AeroblastBeam waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -6266,7 +6266,7 @@ Move_CRABHAMMER: createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB(13, 21, 31), 10, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=1, color1=RGB(13, 21, 31), blend_y1=10, color2=RGB_BLACK, blend_y2=0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -24, 0, 0, 4 waitforvisualfinish delay 8 @@ -6362,14 +6362,14 @@ Move_WHIRLPOOL: splitbgprio ANIM_TARGET setalpha 12, 8 delay 0 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 7, RGB(0, 13, 23) + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_TARGET, delay=2, initial_blend_y=0, target_blend_y=7, color=RGB(0, 13, 23) playsewithpan SE_M_WHIRLPOOL, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 50, 1 call WhirlpoolEffect call WhirlpoolEffect call WhirlpoolEffect delay 12 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 7, 0, RGB(0, 13, 23) + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_TARGET, delay=2, initial_blend_y=7, target_blend_y=0, color=RGB(0, 13, 23) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -6408,7 +6408,7 @@ FlyUnleash: playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createsprite gFlyBallAttackSpriteTemplate, ANIM_ATTACKER, 2, 20 delay 20 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish @@ -6435,7 +6435,7 @@ BounceUnleash: createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 delay 7 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -6452,7 +6452,7 @@ Move_KARATE_CHOP: createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, 0, 0, 10, 1, 3, 0 waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -6469,8 +6469,8 @@ Move_CROSS_CHOP: createsprite gCrossChopHandSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1 delay 40 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_WHITE, 10, RGB_BLACK, 10 - createsprite gCrossImpactSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 20 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=1, color1=RGB_WHITE, blend_y1=10, color2=RGB_BLACK, blend_y2=10 + create_cross_impact_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, duration=20 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 9, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -6487,7 +6487,7 @@ Move_JUMP_KICK: createsprite gJumpKickSpriteTemplate, ANIM_ATTACKER, 2, -16, 8, 0, 0, 10, ANIM_TARGET, 1, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 1, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 7, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish @@ -6508,7 +6508,7 @@ Move_HI_JUMP_KICK: createsprite gJumpKickSpriteTemplate, ANIM_ATTACKER, 2, -16, 8, 0, 0, 10, ANIM_TARGET, 1, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3 delay 3 @@ -6551,19 +6551,19 @@ TripleKickContinue: TripleKickLeft: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, -16, -8, 20, 1, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -16, -16, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=-16, y=-16, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 goto TripleKickContinue TripleKickRight: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 8, 8, 20, 1, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=8, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 goto TripleKickContinue TripleKickCenter: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 20, 1, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, -8, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=-8, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 goto TripleKickContinue @@ -6577,7 +6577,7 @@ Move_DYNAMIC_PUNCH: setalpha 12, 8 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 20, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 7, 1 delay 1 waitsound @@ -6611,18 +6611,18 @@ Move_COUNTER: waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 delay 4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -15, 18, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-15, y=18, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 25, 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -15, 18, 8, 1, 0 delay 3 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, -4, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=-4, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 0, -4, 8, 1, 0 delay 3 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 15, 9, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=15, y=9, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 15, 9, 8, 1, 0 @@ -6642,7 +6642,7 @@ Move_VITAL_THROW: waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -24, 0, 0, 4 @@ -6663,7 +6663,7 @@ Move_ROCK_SMASH: monbg ANIM_DEF_PARTNER setalpha 12, 8 delay 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 8, 1, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 @@ -6708,11 +6708,11 @@ Move_SUBMISSION: end SubmissionHit: - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -12, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=-12, relative_to=ANIM_TARGET, animation=1 delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -12, 8, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=-12, y=8, relative_to=ANIM_TARGET, animation=1 delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 12, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=12, y=0, relative_to=ANIM_TARGET, animation=1 delay 8 return @@ -6813,7 +6813,7 @@ Move_PETAL_DANCE: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 5 delay 3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 6, 0, 8, 1 waitforvisualfinish delay 8 @@ -6871,7 +6871,7 @@ Move_ANCIENT_POWER: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 - createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, 10, 1 + shake_mon_or_platform velocity=4, shake_timer=1, shake_duration=10, type=SHAKE_BG_Y createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 20, 32, -48, 50, 2 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, -38, 25, 5 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 32, 32, -28, 40, 3 @@ -6890,7 +6890,7 @@ Move_ANCIENT_POWER: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 0, 0, 4 delay 3 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 @@ -6929,7 +6929,7 @@ Move_MIST: call MistCloud call MistCloud delay 32 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATK_SIDE, 8, 2, 0, 14, RGB_WHITE + blend_color_cycle priority=2, selector=F_PAL_ATK_SIDE, delay=8, num_blends=2, initial_blend_y=0, target_blend_y=14, color=RGB_WHITE waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff @@ -6964,7 +6964,7 @@ Move_FIRE_PUNCH: playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET waitforvisualfinish createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 call FireSpreadEffect delay 4 @@ -7099,7 +7099,7 @@ Move_POISON_GAS: createsprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0 delay 40 loopsewithpan SE_M_MIST, SOUND_PAN_TARGET, 28, 6 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 6, 2, 0, 12, RGB(26, 0, 26) + blend_color_cycle priority=2, selector=F_PAL_TARGET, delay=6, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(26, 0, 26) waitforvisualfinish blendoff clearmonbg ANIM_DEF_PARTNER @@ -7133,7 +7133,7 @@ Move_PSYBEAM: call PsybeamRings call PsybeamRings createvisualtask AnimTask_SwayMon, 5, 0, 6, 2048, 4, ANIM_TARGET - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(31, 18, 31) + blend_color_cycle priority=2, selector=F_PAL_TARGET, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(31, 18, 31) call PsybeamRings call PsybeamRings call PsybeamRings @@ -7158,7 +7158,7 @@ Move_HYPNOSIS: call HypnosisRings call HypnosisRings call HypnosisRings - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(31, 18, 31) + blend_color_cycle priority=2, selector=F_PAL_TARGET, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(31, 18, 31) waitforvisualfinish delay 1 call UnsetPsychicBackground @@ -7178,7 +7178,7 @@ Move_PSYWAVE: createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_TELEPORT, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 9, 0, 10 call PsywaveRings call PsywaveRings - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 4, 0, 12, RGB(31, 18, 31) + blend_color_cycle priority=2, selector=F_PAL_TARGET, delay=1, num_blends=4, initial_blend_y=0, target_blend_y=12, color=RGB(31, 18, 31) call PsywaveRings call PsywaveRings call PsywaveRings @@ -7232,8 +7232,8 @@ Move_STEEL_WING: delay 24 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 9 delay 17 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 16, 0, ANIM_TARGET, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=16, y=0, relative_to=ANIM_TARGET, animation=1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-16, y=0, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 11 @@ -7251,7 +7251,7 @@ Move_IRON_TAIL: setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish @@ -7271,7 +7271,7 @@ Move_POISON_TAIL: setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish @@ -7292,14 +7292,14 @@ Move_METAL_CLAW: playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0 - createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, -4, 1, 10, 3, 1 + shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET delay 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, -10, 1 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, 10, 1 - createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, -4, 1, 10, 3, 1 + shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET waitforvisualfinish end @@ -7314,7 +7314,7 @@ Move_NIGHT_SHADE: createvisualtask AnimTask_NightShadeClone, 5, 85 delay 70 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 0, 2, 0, 13, RGB_BLACK + blend_color_cycle priority=2, selector=F_PAL_TARGET, delay=0, num_blends=2, initial_blend_y=0, target_blend_y=13, color=RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER delay 1 @@ -7376,7 +7376,7 @@ Move_FOCUS_ENERGY: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect delay 8 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_WHITE + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=11, color=RGB_WHITE createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect delay 8 @@ -7389,7 +7389,7 @@ Move_BIDE: end BideSetUp: loopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER, 9, 2 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=11, color=RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 waitforvisualfinish end @@ -7407,13 +7407,13 @@ BideUnleash: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 12, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 16, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 18, -8, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 1, x=18, y=-8, relative_to=ANIM_TARGET, animation=1 delay 5 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, -18, 8, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 1, x=-18, y=8, relative_to=ANIM_TARGET, animation=1 delay 5 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, -8, -5, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 1, x=-8, y=-5, relative_to=ANIM_TARGET, animation=1 waitforvisualfinish delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 @@ -7429,7 +7429,7 @@ Move_STRING_SHOT: loadspritegfx ANIM_TAG_WEB_THREAD monbg ANIM_DEF_PARTNER delay 0 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 0, 9, RGB_BLACK + simple_palette_blend unused_subpriority_offset=5, selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=9, color=RGB_BLACK waitforvisualfinish loopsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER, 9, 6 call StringShotThread @@ -7461,7 +7461,7 @@ Move_STRING_SHOT: clearmonbg ANIM_DEF_PARTNER delay 1 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 9, 0, RGB_BLACK + simple_palette_blend unused_subpriority_offset=5, selector=F_PAL_BG, delay=2, initial_blend_y=9, target_blend_y=0, color=RGB_BLACK end StringShotThread: @@ -7474,7 +7474,7 @@ Move_SPIDER_WEB: loadspritegfx ANIM_TAG_WEB_THREAD monbg ANIM_DEF_PARTNER delay 0 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 0, 9, RGB_BLACK + simple_palette_blend unused_subpriority_offset=5, selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=9, color=RGB_BLACK waitforvisualfinish splitbgprio ANIM_TARGET loopsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER, 9, 6 @@ -7498,7 +7498,7 @@ Move_SPIDER_WEB: waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 9, 0, RGB_BLACK + simple_palette_blend unused_subpriority_offset=5, selector=F_PAL_BG, delay=2, initial_blend_y=9, target_blend_y=0, color=RGB_BLACK end SpiderWebThread: @@ -7566,7 +7566,7 @@ Move_RECOVER: monbg ANIM_ATK_PARTNER setalpha 12, 8 loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 13, 3 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 6, 0, 11, RGB(31, 31, 11) + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=0, num_blends=6, initial_blend_y=0, target_blend_y=11, color=RGB(31, 31, 11) call RecoverAbsorbEffect call RecoverAbsorbEffect call RecoverAbsorbEffect @@ -7608,7 +7608,7 @@ Move_MIMIC: setarg 7, 0xFFFF waitforvisualfinish playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 11, RGB_WHITE + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=0, num_blends=2, initial_blend_y=0, target_blend_y=11, color=RGB_WHITE waitforvisualfinish clearmonbg_static ANIM_DEF_PARTNER blendoff @@ -7655,7 +7655,7 @@ CurseGhost: createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 14, 1 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 16, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=16, target_blend_y=0, color=RGB_BLACK waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -7673,7 +7673,7 @@ CurseStats: CurseStats1: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_DrawFallingWhiteLinesOnAttacker, 5 - createvisualtask AnimTask_BlendColorCycle, 5, F_PAL_ATTACKER, 4, 2, 0, 10, RGB_RED + blend_color_cycle priority=5, selector=F_PAL_ATTACKER, delay=4, num_blends=2, initial_blend_y=0, target_blend_y=10, color=RGB_RED return Move_SOFT_BOILED: @@ -7688,7 +7688,7 @@ Move_SOFT_BOILED: delay 120 delay 7 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_ATTACKER - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 10, 0, RGB(12, 24, 30) + simple_palette_blend selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, initial_blend_y=10, target_blend_y=0, color=RGB(12, 24, 30) createsprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 31, 16, 0, 1 delay 8 createsprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 31, 16, 0, 1 @@ -7759,12 +7759,12 @@ Move_FAKE_OUT: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createvisualtask AnimTask_StretchTargetUp, 3 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 16, 0, RGB_WHITE + simple_palette_blend selector=F_PAL_BG, delay=3, initial_blend_y=16, target_blend_y=0, color=RGB_WHITE end Move_SCARY_FACE: loadspritegfx ANIM_TAG_EYE_SPARKLE - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_DEF_PARTNER, 3, 0, 16, RGB_BLACK + simple_palette_blend selector=F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_DEF_PARTNER, delay=3, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER waitforvisualfinish delay 10 @@ -7776,7 +7776,7 @@ Move_SCARY_FACE: waitforvisualfinish createvisualtask AnimTask_ShakeTargetInPattern, 3, 20, 1, FALSE playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_DEF_PARTNER, 3, 16, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_DEF_PARTNER, delay=3, initial_blend_y=16, target_blend_y=0, color=RGB_BLACK waitforvisualfinish end @@ -7920,7 +7920,7 @@ PresentHeal: Move_BATON_PASS: loadspritegfx ANIM_TAG_POKEBALL playsewithpan SE_M_BATON_PASS, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_BATTLERS, 1, 2, 0, 11, RGB(31, 22, 30) + blend_color_cycle priority=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=1, num_blends=2, initial_blend_y=0, target_blend_y=11, color=RGB(31, 22, 30) createsprite gBatonPassPokeballSpriteTemplate, ANIM_ATTACKER, 2 end @@ -7946,13 +7946,13 @@ Move_PERISH_SONG: delay 20 panse SE_M_PERISH_SONG, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 delay 80 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 16, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=3, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_PLAYER_LEFT, FALSE createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_PLAYER_RIGHT, FALSE createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_OPPONENT_LEFT, FALSE createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_OPPONENT_RIGHT, FALSE delay 100 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 16, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=3, initial_blend_y=16, target_blend_y=0, color=RGB_BLACK createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_PLAYER_LEFT, TRUE createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_PLAYER_RIGHT, TRUE createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_OPPONENT_LEFT, TRUE @@ -8027,7 +8027,7 @@ Move_TRI_ATTACK: delay 20 createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 5, 6, 0, 7 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 16, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK delay 16 loadspritegfx ANIM_TAG_FIRE createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 0 @@ -8049,7 +8049,7 @@ Move_TRI_ATTACK: createvisualtask AnimTask_ShakeTargetInPattern, 2, 20, 3, TRUE, 1 waitforvisualfinish loadspritegfx ANIM_TAG_LIGHTNING - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48 delay 1 @@ -8059,11 +8059,11 @@ Move_TRI_ATTACK: delay 20 createvisualtask AnimTask_ShakeTargetInPattern, 2, 20, 3, TRUE, 0 delay 2 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE waitforvisualfinish loadspritegfx ANIM_TAG_ICE_CRYSTALS call IceCrystalEffectShort - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=16, target_blend_y=0, color=RGB_BLACK waitforvisualfinish end @@ -8149,7 +8149,7 @@ Move_TRICK: Move_WISH: loadspritegfx ANIM_TAG_GOLD_STARS loadspritegfx ANIM_TAG_SPARKLE_2 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 10, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=3, initial_blend_y=0, target_blend_y=10, color=RGB_BLACK waitforvisualfinish panse_adjustall SE_M_REFLECT, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, -3, 0 createsprite gWishStarSpriteTemplate, ANIM_ATTACKER, 40 @@ -8158,19 +8158,19 @@ Move_WISH: loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 16, 3 call GrantingStarsEffect waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 10, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=3, initial_blend_y=10, target_blend_y=0, color=RGB_BLACK waitforvisualfinish end Move_STOCKPILE: loadspritegfx ANIM_TAG_GRAY_ORB playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 8, 1, 0, 12, RGB_WHITE + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=8, num_blends=1, initial_blend_y=0, target_blend_y=12, color=RGB_WHITE createvisualtask AnimTask_StockpileDeformMon, 5 call StockpileAbsorb call StockpileAbsorb waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 12, 0, RGB_WHITE + simple_palette_blend selector=F_PAL_ATTACKER, delay=0, initial_blend_y=12, target_blend_y=0, color=RGB_WHITE end StockpileAbsorb: createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 55, 55, 13 @@ -8215,10 +8215,10 @@ SpitUpContinue: delay 5 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 8, 1, 0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -12, 10, ANIM_TARGET, 1 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=-12, y=10, relative_to=ANIM_TARGET, animation=1 delay 5 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 12, -10, ANIM_TARGET, 1 + create_flashing_hitsplat_sprite ANIM_TARGET, 3, x=12, y=-10, relative_to=ANIM_TARGET, animation=1 waitforvisualfinish end SpitUpStrong: @@ -8324,7 +8324,7 @@ Move_SWEET_SCENT: call SweetScentEffect createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 55, 0 setpan SOUND_PAN_TARGET - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_DEF_SIDE, 1, 5, 5, 13, RGB(31, 21, 21) + blend_color_cycle priority=2, selector=F_PAL_DEF_SIDE, delay=1, num_blends=5, initial_blend_y=5, target_blend_y=13, color=RGB(31, 21, 21) call SweetScentEffect waitforvisualfinish end @@ -8355,7 +8355,7 @@ SweetScentEffect: Move_HYPER_BEAM: loadspritegfx ANIM_TAG_ORBS - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 0, 16, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=4, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK waitforvisualfinish delay 10 playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_ATTACKER @@ -8364,7 +8364,7 @@ Move_HYPER_BEAM: delay 30 createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 15, 0, 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 - createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB_RED, 16, 0, 0 + flash_anim_tag_with_color tag=ANIM_TAG_ORBS, delay=1, num_blends=12, color1=RGB_RED, blend_y1=16, color2=RGB_BLACK, blend_y2=0 call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs @@ -8395,7 +8395,7 @@ Move_HYPER_BEAM: call HyperBeamOrbs createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(25, 25, 25) waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 16, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=4, initial_blend_y=16, target_blend_y=0, color=RGB_BLACK end HyperBeamOrbs: createsprite gHyperBeamOrbSpriteTemplate, ANIM_TARGET, 2 @@ -8451,7 +8451,7 @@ CreateFlatterConfetti: Move_ROLE_PLAY: monbg ANIM_ATK_PARTNER createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB_WHITE - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 10, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=10, color=RGB_BLACK waitforvisualfinish playsewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_DETECT, SOUND_PAN_ATTACKER, 30 @@ -8460,7 +8460,7 @@ Move_ROLE_PLAY: clearmonbg ANIM_ATK_PARTNER createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 16, 0, RGB_WHITE delay 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 10, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=10, target_blend_y=0, color=RGB_BLACK end Move_REFRESH: @@ -8473,7 +8473,7 @@ Move_REFRESH: call GrantingStarsEffect waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 10, 0, RGB(12, 24, 30) + simple_palette_blend selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, initial_blend_y=10, target_blend_y=0, color=RGB(12, 24, 30) createsprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0 end @@ -8488,10 +8488,10 @@ Move_BLAZE_KICK: createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_WHITE delay 30 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 14, 1 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_WHITE - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=1, color1=RGB_BLACK, blend_y1=8, color2=RGB_BLACK, blend_y2=0 call FireSpreadEffect waitforvisualfinish clearmonbg ANIM_TARGET @@ -8510,25 +8510,25 @@ Move_HYPER_VOICE: end HyperVoiceEffect: - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 8, 0, RGB_YELLOW + simple_palette_blend selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, initial_blend_y=8, target_blend_y=0, color=RGB_YELLOW createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 5, ANIM_ATTACKER, 0 createsprite gHyperVoiceRingSpriteTemplate, ANIM_ATTACKER, 0, 45, 0, 0, 0, 0, 0, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 6, 1 - createvisualtask AnimTask_ShakeBattlePlatforms, 2, 1, 0, 6, 1 + shake_battle_platforms x_offset=1, y_offset=0, shakes=6, delay=1 createvisualtask SoundTask_WaitForCry, 5 return Move_SAND_TOMB: loadspritegfx ANIM_TAG_MUD_SAND - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 7, RGB(19, 17, 0) + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_TARGET, delay=2, initial_blend_y=0, target_blend_y=7, color=RGB(19, 17, 0) createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 43, 1 playsewithpan SE_M_SAND_TOMB, SOUND_PAN_TARGET call SandTombSwirlingDirt call SandTombSwirlingDirt call SandTombSwirlingDirt delay 22 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 7, 0, RGB(19, 17, 0) + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_TARGET, delay=2, initial_blend_y=7, target_blend_y=0, color=RGB(19, 17, 0) waitforvisualfinish end @@ -8586,10 +8586,10 @@ ArmThrustContinue: blendoff end ArmThrustRight: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 8, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=8, y=0, relative_to=ANIM_TARGET, animation=2 goto ArmThrustContinue ArmThrustLeft: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=-8, y=0, relative_to=ANIM_TARGET, animation=2 goto ArmThrustContinue Move_MUDDY_WATER: @@ -8637,7 +8637,7 @@ Move_DRAGON_CLAW: createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0 - createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, -4, 1, 10, 3, 1 + shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 480, 20, 16, -46, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 576, 20, 8, 42, ANIM_ATTACKER @@ -8650,7 +8650,7 @@ Move_DRAGON_CLAW: createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, -10, 1 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, 10, 1 - createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, -4, 1, 10, 3, 1 + shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 464, 30, 15, -50, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 528, 30, 13, 50, ANIM_ATTACKER @@ -8731,7 +8731,7 @@ Move_METEOR_MASH: createsprite gMeteorMashStarSpriteTemplate, ANIM_TARGET, 3, -80, -64, 40, 32, 30 delay 20 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 5, 0, 20, 1 waitforvisualfinish delay 10 @@ -8747,7 +8747,7 @@ Move_REVENGE: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gRevengeSmallScratchSpriteTemplate, ANIM_ATTACKER, 2, 10, -10 waitforvisualfinish - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 4, 2, 8, RGB_RED + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=0, num_blends=4, initial_blend_y=2, target_blend_y=8, color=RGB_RED waitforvisualfinish unloadspritegfx ANIM_TAG_PURPLE_SCRATCH loadspritegfx ANIM_TAG_PURPLE_SWIPE @@ -8759,10 +8759,10 @@ Move_REVENGE: unloadspritegfx ANIM_TAG_PURPLE_SWIPE loadspritegfx ANIM_TAG_IMPACT createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 10, 1 - createsprite gPersistHitSplatSpriteTemplate, ANIM_TARGET, 3, -10, -8, ANIM_TARGET, 1, 8 + create_persist_hitsplat_sprite ANIM_TARGET, 3, x=-10, y=-8, relative_to=ANIM_TARGET, animation=1, duration=8 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 8 - createsprite gPersistHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, 8, ANIM_TARGET, 1, 8 + create_persist_hitsplat_sprite ANIM_TARGET, 3, x=10, y=8, relative_to=ANIM_TARGET, animation=1, duration=8 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET @@ -8777,7 +8777,7 @@ Move_POISON_FANG: delay 10 createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 3, 0, 10, 1 waitforvisualfinish - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 0, 4, 0, 12, RGB(26, 0, 26) + blend_color_cycle priority=2, selector=F_PAL_TARGET, delay=0, num_blends=4, initial_blend_y=0, target_blend_y=12, color=RGB(26, 0, 26) call PoisonBubblesEffect waitforvisualfinish end @@ -8793,7 +8793,7 @@ Move_FRENZY_PLANT: monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 2, 0, 5, RGB_BLACK + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=5, color=RGB_BLACK waitforvisualfinish createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 10, 8, 2, 0, 0, 100 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER @@ -8822,26 +8822,26 @@ Move_FRENZY_PLANT: createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 85, -16, -6, 0, 2, 75 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -10, ANIM_TARGET, 3 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-10, y=-10, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 8, 0, 20, 1 delay 3 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 8, ANIM_TARGET, 3 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=10, y=8, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 3 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, -3, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=10, y=-3, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 3 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -3, 1, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-3, y=1, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 1, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-10, y=1, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 10, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=10, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 2, 5, 0, RGB_BLACK + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_BG, delay=2, initial_blend_y=5, target_blend_y=0, color=RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -8888,16 +8888,16 @@ FocusPunchContinue: playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gFocusPunchFistSpriteTemplate, ANIM_TARGET, 2 delay 10 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-10, y=-8, relative_to=ANIM_TARGET, animation=0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 8, 0, 24, 1 delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 2, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=10, y=2, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, -6, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=10, y=-6, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 8, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=8, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish restorebg @@ -8937,7 +8937,7 @@ ReturnWeak: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 16, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-10, y=-8, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_COMET_PUNCH, SOUND_PAN_TARGET goto ReturnContinue ReturnMedium: @@ -8950,7 +8950,7 @@ ReturnMedium: delay 11 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 5, 4 delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET goto ReturnContinue ReturnStrong: @@ -8966,35 +8966,35 @@ ReturnStrong: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-10, y=-8, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=10, y=10, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 3, -5, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=3, y=-5, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -5, 3, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-5, y=3, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 goto ReturnContinue ReturnStrongest: - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 0, 6, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=0, initial_blend_y=0, target_blend_y=6, color=RGB_BLACK waitforvisualfinish createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 16, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 3, -5, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=3, y=-5, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 12, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-10, y=-8, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 waitforvisualfinish @@ -9002,7 +9002,7 @@ ReturnStrongest: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 8, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-10, y=-8, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 waitforvisualfinish @@ -9010,7 +9010,7 @@ ReturnStrongest: createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 5, 1 createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-10, y=-8, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 5, 1 @@ -9018,7 +9018,7 @@ ReturnStrongest: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 4, 2, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-10, y=-8, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 5, 1 @@ -9027,25 +9027,25 @@ ReturnStrongest: call ReturnStrongestHit call ReturnStrongestHit call ReturnStrongestHit - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-10, y=-8, relative_to=ANIM_TARGET, animation=0 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 8, 0, 24, 1 delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=10, y=10, relative_to=ANIM_TARGET, animation=0 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 3, -5, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=3, y=-5, relative_to=ANIM_TARGET, animation=0 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -5, 3, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-5, y=3, relative_to=ANIM_TARGET, animation=0 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 6, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=0, initial_blend_y=6, target_blend_y=0, color=RGB_BLACK goto ReturnContinue ReturnStrongestHit: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 4, 3, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 5, 1 @@ -9102,21 +9102,21 @@ Move_BLAST_BURN: createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 40, 20, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -40, 20, 24, 0, 0, 0 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 25 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -96, 0, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 6, -60, -30, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 70, 0, -48, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 70, 60, -30, 24, 0, 0, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -4, 3, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=-4, y=3, relative_to=ANIM_TARGET, animation=0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 12, 0, 20, 1 - createvisualtask AnimTask_ShakeBattlePlatforms, 2, 2, 0, 10, 1 + shake_battle_platforms x_offset=2, y_offset=0, shakes=10, delay=1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 96, 0, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 60, 30, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 48, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -60, 30, 24, 0, 0, 0 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -9125,32 +9125,32 @@ Move_BLAST_BURN: Move_ROCK_TOMB: loadspritegfx ANIM_TAG_X_SIGN loadspritegfx ANIM_TAG_ROCKS - createvisualtask AnimTask_ShakeBattlePlatforms, 2, 2, 0, 10, 1 + shake_battle_platforms x_offset=2, y_offset=0, shakes=10, delay=1 waitforvisualfinish createsprite gRockTombRockSpriteTemplate, ANIM_TARGET, 2, 20, 12, 64, 114, 0 delay 8 - createvisualtask AnimTask_ShakeBattlePlatforms, 2, 0, 2, 3, 1 + shake_battle_platforms x_offset=0, y_offset=2, shakes=3, delay=1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET delay 8 createsprite gRockTombRockSpriteTemplate, ANIM_TARGET, 2, -20, 12, 64, 98, 0 delay 8 - createvisualtask AnimTask_ShakeBattlePlatforms, 2, 0, 2, 3, 1 + shake_battle_platforms x_offset=0, y_offset=2, shakes=3, delay=1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET delay 8 createsprite gRockTombRockSpriteTemplate, ANIM_TARGET, 66, 3, 6, 64, 82, 0 delay 8 - createvisualtask AnimTask_ShakeBattlePlatforms, 2, 0, 2, 3, 1 + shake_battle_platforms x_offset=0, y_offset=2, shakes=3, delay=1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET delay 8 createsprite gRockTombRockSpriteTemplate, ANIM_TARGET, 2, -3, 13, 64, 66, 0 delay 8 - createvisualtask AnimTask_ShakeBattlePlatforms, 2, 0, 2, 3, 1 + shake_battle_platforms x_offset=0, y_offset=2, shakes=3, delay=1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET delay 24 playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_TARGET createsprite gRedXSpriteTemplate, ANIM_TARGET, 5, ANIM_TARGET, 50 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 20, 1 - createvisualtask AnimTask_ShakeBattlePlatforms, 2, 2, 0, 10, 1 + shake_battle_platforms x_offset=2, y_offset=0, shakes=10, delay=1 waitforvisualfinish end @@ -9269,7 +9269,7 @@ Move_ROCK_BLAST: playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gRockBlastRockSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 25, 257 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 2, 0, 0, 20, 24, 14, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 @@ -9284,7 +9284,7 @@ Move_OVERHEAT: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 18 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 5, RGB(28, 0, 0) + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=0, target_blend_y=5, color=RGB(28, 0, 0) waitforvisualfinish createvisualtask AnimTask_AllocBackupPalBuffer, 5 waitforvisualfinish @@ -9295,7 +9295,7 @@ Move_OVERHEAT: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_CopyPalUnfadedToBackup, 5, 1, 0 delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 1, 0, 13, RGB(28, 0, 0) + simple_palette_blend selector=F_PAL_ATTACKER, delay=1, initial_blend_y=0, target_blend_y=13, color=RGB(28, 0, 0) createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 2, 0, 15, 1 waitforvisualfinish playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER @@ -9327,26 +9327,26 @@ Move_OVERHEAT: createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 224, 30, 25, 10 delay 5 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -5, 3, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=-5, y=3, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 10, 0, 25, 1 delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, -5, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=8, y=-5, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, 10, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=10, y=10, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET delay 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 0 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_CopyPalFadedToUnfaded, 5, 1 delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, -1, 0, 13, RGB(18, 18, 18) + simple_palette_blend selector=F_PAL_ATTACKER, delay=-1, initial_blend_y=0, target_blend_y=13, color=RGB(18, 18, 18) createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 3, 0, 15, 1 waitforvisualfinish createvisualtask AnimTask_CopyPalUnfadedFromBackup, 5, 0, 1 delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 5, 0, RGB(28, 0, 0) + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=5, target_blend_y=0, color=RGB(28, 0, 0) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -9354,7 +9354,7 @@ Move_OVERHEAT: delay 15 createvisualtask AnimTask_CopyPalUnfadedFromBackup, 5, 1, 0 delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 13, 0, RGB(18, 18, 18) + simple_palette_blend selector=F_PAL_ATTACKER, delay=0, initial_blend_y=13, target_blend_y=0, color=RGB(18, 18, 18) waitforvisualfinish createvisualtask AnimTask_FreeBackupPalBuffer, 5 waitforvisualfinish @@ -9368,7 +9368,7 @@ Move_HYDRO_CANNON: playsewithpan SE_M_SURF, SOUND_PAN_ATTACKER createsprite gHydroCannonChargeSpriteTemplate, ANIM_TARGET, 2 delay 10 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 30 panse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 call HydroCannonBeam @@ -9385,7 +9385,7 @@ Move_HYDRO_CANNON: call HydroCannonBeam createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 waitforvisualfinish - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -9464,7 +9464,7 @@ SeismicTossStrong: call SeismicTossRockScatter1 goto SeismicTossContinue SeismicTossRockScatter1: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -10, -8, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=-10, y=-8, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 27, 2, 3 @@ -9473,7 +9473,7 @@ SeismicTossRockScatter1: createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 12, 25, 4, 4 return SeismicTossRockScatter2: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, -8, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=10, y=-8, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 32, 3, 4 @@ -9498,7 +9498,7 @@ Move_WATER_PULSE: monbg ANIM_TARGET splitbgprio ANIM_TARGET playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 0, 7, RGB(0, 25, 28) + simple_palette_blend selector=F_PAL_BG, delay=0, initial_blend_y=0, target_blend_y=7, color=RGB(0, 25, 28) delay 10 createsprite gWaterPulseBubbleSpriteTemplate, ANIM_ATTACKER, 66, 100, 100, 8, 1, 20, 40, 0 createsprite gWaterPulseBubbleSpriteTemplate, ANIM_ATTACKER, 66, 20, 100, 16, 2, 10, 35, 1 @@ -9518,7 +9518,7 @@ Move_WATER_PULSE: delay 13 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 8, 18, 1 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 7, 0, RGB(0, 25, 28) + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=7, target_blend_y=0, color=RGB(0, 25, 28) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -9531,7 +9531,7 @@ Move_PSYCHO_BOOST: createvisualtask AnimTask_FadeScreenToWhite, 5 waitbgfadein delay 6 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG, 2, 8, 0, 10, RGB_BLACK + blend_color_cycle priority=2, selector=F_PAL_BG, delay=2, num_blends=8, initial_blend_y=0, target_blend_y=10, color=RGB_BLACK delay 0 splitbgprio ANIM_ATTACKER setalpha 8, 8 @@ -9558,8 +9558,8 @@ Move_KNOCK_OFF: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET createsprite gKnockOffStrikeSpriteTemplate, ANIM_TARGET, 2, -16, -16 delay 8 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 2 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=5, num_blends=1, color1=RGB_WHITE, blend_y1=10, color2=RGB_BLACK, blend_y2=0 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -12, 10, 0, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 @@ -9576,7 +9576,7 @@ Move_DOOM_DESIRE: delay 1 monbg ANIM_ATK_PARTNER createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_TARGET, FALSE - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 4, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=0, target_blend_y=4, color=RGB_BLACK waitforvisualfinish setalpha 8, 8 playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER @@ -9584,7 +9584,7 @@ Move_DOOM_DESIRE: waitforvisualfinish delay 20 createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_TARGET, TRUE - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 4, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=4, target_blend_y=0, color=RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff @@ -9605,20 +9605,20 @@ Move_SKY_UPPERCUT: delay 4 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -28, 28, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=-28, y=28, relative_to=ANIM_TARGET, animation=1 delay 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -15, 8, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=-15, y=8, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -5, -12, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=-5, y=-12, relative_to=ANIM_TARGET, animation=1 delay 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, -32, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=-32, relative_to=ANIM_TARGET, animation=1 delay 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 5, -52, ANIM_TARGET, 1 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=5, y=-52, relative_to=ANIM_TARGET, animation=1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -26, 16, 1, 4 delay 4 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1 @@ -9675,18 +9675,18 @@ Move_TWISTER: createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 20, 255, 15, 32, 0 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 110, 10, 8, 32, 20 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -32, -16, ANIM_TARGET, 3 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=-32, y=-16, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 + create_random_pos_hitsplat_sprite ANIM_TARGET, 3, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 + create_random_pos_hitsplat_sprite ANIM_TARGET, 3, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 + create_basic_hitsplat_sprite ANIM_TARGET, 3, x=32, y=20, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -9727,8 +9727,8 @@ Move_MAGICAL_LEAF: createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 32, -20, 0 delay 30 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, -4, ANIM_TARGET, 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 10, 4, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 4, x=-10, y=-4, relative_to=ANIM_TARGET, animation=2 + create_basic_hitsplat_sprite ANIM_TARGET, 4, x=10, y=4, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 delay 20 setarg 7, 0xFFFF @@ -9836,7 +9836,7 @@ Move_WEATHER_BALL: waitforvisualfinish delay 15 playsewithpan SE_M_DETECT, 0 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=5, num_blends=1, color1=RGB_WHITE, blend_y1=10, color2=RGB_BLACK, blend_y2=0 waitforvisualfinish createvisualtask AnimTask_GetWeather, 2 delay 1 @@ -9850,7 +9850,7 @@ WeatherBallNormal: createsprite gWeatherBallNormalDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 0, 0 waitforvisualfinish playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 4, x=-10, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 8, 1 waitforvisualfinish end @@ -9926,7 +9926,7 @@ Move_COUNT: monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -10149,11 +10149,11 @@ ElectricityEffect: ConfusionEffect: loopsewithpan SE_M_DIZZY_PUNCH, SOUND_PAN_TARGET, 13, 6 - createsprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 0, 3, 90 - createsprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 51, 3, 90 - createsprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 102, 3, 90 - createsprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 153, 3, 90 - createsprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 204, 3, 90 + create_confusion_duck_sprite ANIM_TARGET, 2, x=0, y=-15, wave_offset=0, wave_period=3, duration=90 + create_confusion_duck_sprite ANIM_TARGET, 2, x=0, y=-15, wave_offset=51, wave_period=3, duration=90 + create_confusion_duck_sprite ANIM_TARGET, 2, x=0, y=-15, wave_offset=102, wave_period=3, duration=90 + create_confusion_duck_sprite ANIM_TARGET, 2, x=0, y=-15, wave_offset=153, wave_period=3, duration=90 + create_confusion_duck_sprite ANIM_TARGET, 2, x=0, y=-15, wave_offset=204, wave_period=3, duration=90 return SetPsychicBackground: @@ -10218,7 +10218,7 @@ UnsetSolarBeamBg: Status_Poison: loopsewithpan SE_M_TOXIC, SOUND_PAN_TARGET, 13, 6 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 18, 2 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 12, RGB(30, 0, 31) + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(30, 0, 31) end Status_Confusion: @@ -10389,13 +10389,13 @@ Status_Whirlpool: splitbgprio ANIM_TARGET setalpha 12, 8 delay 0 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 7, RGB(0, 13, 23) + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_TARGET, delay=2, initial_blend_y=0, target_blend_y=7, color=RGB(0, 13, 23) playsewithpan SE_M_WHIRLPOOL, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 30, 1 call WhirlpoolEffect call WhirlpoolEffect delay 12 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 7, 0, RGB(0, 13, 23) + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_TARGET, delay=2, initial_blend_y=7, target_blend_y=0, color=RGB(0, 13, 23) waitforvisualfinish stopsound clearmonbg ANIM_DEF_PARTNER @@ -10410,7 +10410,7 @@ Status_Clamp: createsprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 2, 819, 0, 10 createsprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 6, -819, 0, 10 delay 10 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -10420,13 +10420,13 @@ Status_Clamp: Status_SandTomb: loadspritegfx ANIM_TAG_MUD_SAND - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 7, RGB(19, 17, 0) + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_TARGET, delay=2, initial_blend_y=0, target_blend_y=7, color=RGB(19, 17, 0) createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 30, 1 playsewithpan SE_M_SAND_TOMB, SOUND_PAN_TARGET call SandTombSwirlingDirt call SandTombSwirlingDirt delay 22 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 7, 0, RGB(19, 17, 0) + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_TARGET, delay=2, initial_blend_y=7, target_blend_y=0, color=RGB(19, 17, 0) waitforvisualfinish stopsound end @@ -10448,7 +10448,7 @@ General_HeldItemEffect: call GrantingStarsEffect waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 3, 7, 0, RGB(17, 31, 25) + simple_palette_blend selector=F_PAL_ATTACKER, delay=3, initial_blend_y=7, target_blend_y=0, color=RGB(17, 31, 25) createsprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0 waitforvisualfinish end @@ -10492,11 +10492,11 @@ General_SmokeballEscape: end General_FocusBand: - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_ATTACKER, 7, 0, 9, RGB_RED + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_ATTACKER, delay=7, initial_blend_y=0, target_blend_y=9, color=RGB_RED playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_SlideMonForFocusBand, 5, 30, 128, 0, 1, 2, 0, 1 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_ATTACKER, 4, 9, 0, RGB_RED + simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_ATTACKER, delay=4, initial_blend_y=9, target_blend_y=0, color=RGB_RED waitforvisualfinish delay 6 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 0, 0, 0, 15 @@ -10534,7 +10534,7 @@ General_MonHit: monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -10595,7 +10595,7 @@ General_FutureSightHit: General_DoomDesireHit: createvisualtask AnimTask_SetAnimTargetToBattlerTarget, 2 loadspritegfx ANIM_TAG_EXPLOSION - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 16, RGB_WHITE + simple_palette_blend selector=F_PAL_BG, delay=3, initial_blend_y=0, target_blend_y=16, color=RGB_WHITE waitforvisualfinish delay 10 createvisualtask AnimTask_DoomDesireLightBeam, 5 @@ -10622,7 +10622,7 @@ General_DoomDesireHit: playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 1, 1 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 16, 0, RGB_WHITE + simple_palette_blend selector=F_PAL_BG, delay=3, initial_blend_y=16, target_blend_y=0, color=RGB_WHITE waitforvisualfinish end @@ -10631,7 +10631,7 @@ General_FocusPunchSetUp: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect delay 8 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED + blend_color_cycle priority=2, selector=F_PAL_ATTACKER, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=11, color=RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect delay 8 @@ -10644,7 +10644,7 @@ General_IngrainHeal: loadspritegfx ANIM_TAG_BLUE_STAR monbg ANIM_DEF_PARTNER setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 4, RGB(13, 31, 12) + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=0, target_blend_y=4, color=RGB(13, 31, 12) waitforvisualfinish delay 3 call AbsorbEffect @@ -10652,7 +10652,7 @@ General_IngrainHeal: delay 15 call HealingEffect waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 4, 0, RGB(13, 31, 12) + simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=4, target_blend_y=0, color=RGB(13, 31, 12) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -10660,7 +10660,7 @@ General_IngrainHeal: General_WishHeal: loadspritegfx ANIM_TAG_SPARKLE_2 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 10, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=3, initial_blend_y=0, target_blend_y=10, color=RGB_BLACK waitforvisualfinish playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call GrantingStarsEffect @@ -10669,7 +10669,7 @@ General_WishHeal: loadspritegfx ANIM_TAG_BLUE_STAR call HealingEffect waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 10, 0, RGB_BLACK + simple_palette_blend selector=F_PAL_BG, delay=3, initial_blend_y=10, target_blend_y=0, color=RGB_BLACK end SnatchMoveTrySwapFromSubstitute: @@ -10734,7 +10734,7 @@ BallThrowTrainerBlock: setalpha 12, 8 delay 0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -4, -20, ANIM_TARGET, 2 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=-4, y=-20, relative_to=ANIM_TARGET, animation=2 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff diff --git a/include/battle_anim_internal.h b/include/battle_anim_internal.h new file mode 100644 index 0000000000..0518b9c728 --- /dev/null +++ b/include/battle_anim_internal.h @@ -0,0 +1,18 @@ +#ifndef GUARD_BATTLE_ANIM_INTERNAL_H +#define GUARD_BATTLE_ANIM_INTERNAL_H + +/* CMD_ARGS provides a way to locally name the members of gBattleAnimArgs. + * + * For example: + * { + * CMD_ARGS(x, y); + * // cmd->x is gBattleAnimArgs[0] and cmd->y is gBattleAnimArgs[1] + * } */ +#if MODERN +#define CMD_ARGS(...) struct { s16 __VA_ARGS__; } *cmd = (void *)gBattleAnimArgs +#else +#define CMD_ARGS(...) struct CMD_ARGS { s16 __VA_ARGS__; } +#define cmd ((struct CMD_ARGS *)gBattleAnimArgs) +#endif + +#endif diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index c1cb42a41d..9e63874312 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -436,5 +436,7 @@ // It's redundant with F_PAL_BATTLERS, because they're only ever used together to refer to all the battlers at once. #define F_PAL_BATTLERS_2 (1 << 7 | 1 << 8 | 1 << 9 | 1 << 10) +enum { SHAKE_BG_X, SHAKE_BG_Y, SHAKE_MON_X, SHAKE_MON_Y }; +enum { SHAKE_MON_ATTACKER, SHAKE_MON_TARGET, SHAKE_MON_BOTH }; #endif // GUARD_CONSTANTS_BATTLE_ANIM_H diff --git a/src/battle_anim_normal.c b/src/battle_anim_normal.c index fa6bd69343..683328ea3c 100644 --- a/src/battle_anim_normal.c +++ b/src/battle_anim_normal.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle_anim.h" +#include "battle_anim_internal.h" #include "palette.h" #include "random.h" #include "task.h" @@ -254,29 +255,26 @@ const struct SpriteTemplate gPersistHitSplatSpriteTemplate = }; // Moves a spinning duck around the mon's head. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: initial wave offset -// arg 3: wave period (higher means faster wave) -// arg 4: duration static void AnimConfusionDuck(struct Sprite *sprite) { - sprite->x += gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; - sprite->data[0] = gBattleAnimArgs[2]; + CMD_ARGS(x, y, waveOffset, wavePeriod, duration); + + sprite->x += cmd->x; + sprite->y += cmd->y; + sprite->data[0] = cmd->waveOffset; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { - sprite->data[1] = -gBattleAnimArgs[3]; + sprite->data[1] = -cmd->wavePeriod; sprite->data[4] = 1; } else { - sprite->data[1] = gBattleAnimArgs[3]; + sprite->data[1] = cmd->wavePeriod; sprite->data[4] = 0; StartSpriteAnim(sprite, 1); } - sprite->data[3] = gBattleAnimArgs[4]; + sprite->data[3] = cmd->duration; sprite->callback = AnimConfusionDuck_Step; sprite->callback(sprite); } @@ -297,15 +295,12 @@ static void AnimConfusionDuck_Step(struct Sprite *sprite) } // Performs a simple color blend on a specified sprite. -// arg 0: palette selector -// arg 1: delay -// arg 2: start blend amount -// arg 3: end blend amount -// arg 4: blend color static void AnimSimplePaletteBlend(struct Sprite *sprite) { - u32 selectedPalettes = UnpackSelectedBattlePalettes(gBattleAnimArgs[0]); - BeginNormalPaletteFade(selectedPalettes, gBattleAnimArgs[1], gBattleAnimArgs[2], gBattleAnimArgs[3], gBattleAnimArgs[4]); + CMD_ARGS(selector, delay, initialBlendY, targetBlendY, color); + + u32 selectedPalettes = UnpackSelectedBattlePalettes(cmd->selector); + BeginNormalPaletteFade(selectedPalettes, cmd->delay, cmd->initialBlendY, cmd->targetBlendY, cmd->color); sprite->invisible = TRUE; sprite->callback = AnimSimplePaletteBlend_Step; } @@ -337,21 +332,32 @@ static void AnimSimplePaletteBlend_Step(struct Sprite *sprite) DestroyAnimSprite(sprite); } +#define sTimer data[0] +#define sDelay data[1] +#define sNumBlends data[2] +#define sColor1 data[3] +#define sBlendY1 data[4] +#define sColor2 data[5] +#define sBlendY2 data[6] +#define sPaletteSelector data[7] + static void AnimComplexPaletteBlend(struct Sprite *sprite) { + CMD_ARGS(selector, delay, numBlends, color1, blendY1, color2, blendY2); + u32 selectedPalettes; - sprite->data[0] = gBattleAnimArgs[1]; - sprite->data[1] = gBattleAnimArgs[1]; - sprite->data[2] = gBattleAnimArgs[2]; - sprite->data[3] = gBattleAnimArgs[3]; - sprite->data[4] = gBattleAnimArgs[4]; - sprite->data[5] = gBattleAnimArgs[5]; - sprite->data[6] = gBattleAnimArgs[6]; - sprite->data[7] = gBattleAnimArgs[0]; + sprite->sTimer = cmd->delay; + sprite->sDelay = cmd->delay; + sprite->sNumBlends = cmd->numBlends; + sprite->sColor1 = cmd->color1; + sprite->sBlendY1 = cmd->blendY1; + sprite->sColor2 = cmd->color2; + sprite->sBlendY2 = cmd->blendY2; + sprite->sPaletteSelector = cmd->selector; - selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]); - BlendPalettes(selectedPalettes, gBattleAnimArgs[4], gBattleAnimArgs[3]); + selectedPalettes = UnpackSelectedBattlePalettes(sprite->sPaletteSelector); + BlendPalettes(selectedPalettes, cmd->blendY1, cmd->color1); sprite->invisible = TRUE; sprite->callback = AnimComplexPaletteBlend_Step1; } @@ -360,30 +366,30 @@ static void AnimComplexPaletteBlend_Step1(struct Sprite *sprite) { u32 selectedPalettes; - if (sprite->data[0] > 0) + if (sprite->sTimer > 0) { - sprite->data[0]--; + sprite->sTimer--; return; } if (gPaletteFade.active) return; - if (sprite->data[2] == 0) + if (sprite->sNumBlends == 0) { sprite->callback = AnimComplexPaletteBlend_Step2; return; } - selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]); - if (sprite->data[1] & 0x100) - BlendPalettes(selectedPalettes, sprite->data[4], sprite->data[3]); + selectedPalettes = UnpackSelectedBattlePalettes(sprite->sPaletteSelector); + if (sprite->sDelay & 0x100) + BlendPalettes(selectedPalettes, sprite->sBlendY1, sprite->sColor1); else - BlendPalettes(selectedPalettes, sprite->data[6], sprite->data[5]); + BlendPalettes(selectedPalettes, sprite->sBlendY2, sprite->sColor2); - sprite->data[1] ^= 0x100; - sprite->data[0] = sprite->data[1] & 0xFF; - sprite->data[2]--; + sprite->sDelay ^= 0x100; + sprite->sTimer = sprite->sDelay & 0xFF; + sprite->sNumBlends--; } static void AnimComplexPaletteBlend_Step2(struct Sprite *sprite) @@ -392,16 +398,27 @@ static void AnimComplexPaletteBlend_Step2(struct Sprite *sprite) if (!gPaletteFade.active) { - selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]); + selectedPalettes = UnpackSelectedBattlePalettes(sprite->sPaletteSelector); BlendPalettes(selectedPalettes, 0, 0); DestroyAnimSprite(sprite); } } +#undef sTimer +#undef sDelay +#undef sNumBlends +#undef sColor1 +#undef sBlendY1 +#undef sColor2 +#undef sBlendY2 +#undef sPaletteSelector + static void AnimCirclingSparkle(struct Sprite *sprite) { - sprite->x += gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; + CMD_ARGS(x, y); + + sprite->x += cmd->x; + sprite->y += cmd->y; sprite->data[0] = 0; sprite->data[1] = 10; sprite->data[2] = 8; @@ -429,12 +446,14 @@ static void AnimCirclingSparkle(struct Sprite *sprite) // Many uses of this task only set a tNumBlends of 2, which has the effect of blending to a color and back once void AnimTask_BlendColorCycle(u8 taskId) { - gTasks[taskId].tPalSelector = gBattleAnimArgs[0]; - gTasks[taskId].tDelay = gBattleAnimArgs[1]; - gTasks[taskId].tNumBlends = gBattleAnimArgs[2]; - gTasks[taskId].tInitialBlendY = gBattleAnimArgs[3]; - gTasks[taskId].tTargetBlendY = gBattleAnimArgs[4]; - gTasks[taskId].tBlendColor = gBattleAnimArgs[5]; + CMD_ARGS(selector, delay, numBlends, initialBlendY, targetBlendY, color); + + gTasks[taskId].tPalSelector = cmd->selector; + gTasks[taskId].tDelay = cmd->delay; + gTasks[taskId].tNumBlends = cmd->numBlends; + gTasks[taskId].tInitialBlendY = cmd->initialBlendY; + gTasks[taskId].tTargetBlendY = cmd->targetBlendY; + gTasks[taskId].tBlendColor = cmd->color; gTasks[taskId].tRestoreBlend = FALSE; BlendColorCycle(taskId, 0, gTasks[taskId].tTargetBlendY); gTasks[taskId].func = AnimTask_BlendColorCycleLoop; @@ -489,15 +508,17 @@ static void AnimTask_BlendColorCycleLoop(u8 taskId) // See AnimTask_BlendColorCycle. Same, but excludes Attacker and Target void AnimTask_BlendColorCycleExclude(u8 taskId) { + CMD_ARGS(unk0, delay, numBlends, initialBlendY, targetBlendY, color); + int battler; u32 selectedPalettes = 0; - gTasks[taskId].data[0] = gBattleAnimArgs[0]; - gTasks[taskId].tDelay = gBattleAnimArgs[1]; - gTasks[taskId].tNumBlends = gBattleAnimArgs[2]; - gTasks[taskId].tInitialBlendY = gBattleAnimArgs[3]; - gTasks[taskId].tTargetBlendY = gBattleAnimArgs[4]; - gTasks[taskId].tBlendColor = gBattleAnimArgs[5]; + gTasks[taskId].data[0] = cmd->unk0; + gTasks[taskId].tDelay = cmd->delay; + gTasks[taskId].tNumBlends = cmd->numBlends; + gTasks[taskId].tInitialBlendY = cmd->initialBlendY; + gTasks[taskId].tTargetBlendY = cmd->targetBlendY; + gTasks[taskId].tBlendColor = cmd->color; gTasks[taskId].tRestoreBlend = 0; for (battler = 0; battler < gBattlersCount; battler++) @@ -506,7 +527,7 @@ void AnimTask_BlendColorCycleExclude(u8 taskId) selectedPalettes |= 1 << (battler + 16); } - if (gBattleAnimArgs[0] == 1) + if (cmd->unk0 == 1) selectedPalettes |= 0xE; gTasks[taskId].tPalSelectorHi = selectedPalettes >> 16; @@ -564,12 +585,14 @@ static void AnimTask_BlendColorCycleExcludeLoop(u8 taskId) // See AnimTask_BlendColorCycle. Same, but selects palette by ANIM_TAG_* void AnimTask_BlendColorCycleByTag(u8 taskId) { - gTasks[taskId].tPalTag = gBattleAnimArgs[0]; - gTasks[taskId].tDelay = gBattleAnimArgs[1]; - gTasks[taskId].tNumBlends = gBattleAnimArgs[2]; - gTasks[taskId].tInitialBlendY = gBattleAnimArgs[3]; - gTasks[taskId].tTargetBlendY = gBattleAnimArgs[4]; - gTasks[taskId].tBlendColor = gBattleAnimArgs[5]; + CMD_ARGS(tag, delay, numBlends, initialBlendY, targetBlendY, color); + + gTasks[taskId].tPalTag = cmd->tag; + gTasks[taskId].tDelay = cmd->delay; + gTasks[taskId].tNumBlends = cmd->numBlends; + gTasks[taskId].tInitialBlendY = cmd->initialBlendY; + gTasks[taskId].tTargetBlendY = cmd->targetBlendY; + gTasks[taskId].tBlendColor = cmd->color; gTasks[taskId].tRestoreBlend = FALSE; BlendColorCycleByTag(taskId, 0, gTasks[taskId].tTargetBlendY); @@ -634,26 +657,36 @@ static void AnimTask_BlendColorCycleByTagLoop(u8 taskId) #undef tPalSelectorLo // Flashes the specified anim tag with given color. Used e.g. to flash the particles red in Hyper Beam +#define tTimer data[0] +#define tDelay data[1] +#define tNumBlends data[2] +#define tColor1 data[3] +#define tBlendY1 data[4] +#define tColor2 data[5] +#define tBlendY2 data[6] +#define tAnimTag data[7] void AnimTask_FlashAnimTagWithColor(u8 taskId) { + CMD_ARGS(tag, delay, numBlends, color1, blendY1, color2, blendY2); + u8 paletteIndex; - gTasks[taskId].data[0] = gBattleAnimArgs[1]; - gTasks[taskId].data[1] = gBattleAnimArgs[1]; - gTasks[taskId].data[2] = gBattleAnimArgs[2]; - gTasks[taskId].data[3] = gBattleAnimArgs[3]; - gTasks[taskId].data[4] = gBattleAnimArgs[4]; - gTasks[taskId].data[5] = gBattleAnimArgs[5]; - gTasks[taskId].data[6] = gBattleAnimArgs[6]; - gTasks[taskId].data[7] = gBattleAnimArgs[0]; + gTasks[taskId].tTimer = cmd->delay; + gTasks[taskId].tDelay = cmd->delay; + gTasks[taskId].tNumBlends = cmd->numBlends; + gTasks[taskId].tColor1 = cmd->color1; + gTasks[taskId].tBlendY1 = cmd->blendY1; + gTasks[taskId].tColor2 = cmd->color2; + gTasks[taskId].tBlendY2 = cmd->blendY2; + gTasks[taskId].tAnimTag = cmd->tag; - paletteIndex = IndexOfSpritePaletteTag(gBattleAnimArgs[0]); + paletteIndex = IndexOfSpritePaletteTag(cmd->tag); BeginNormalPaletteFade( 1 << (paletteIndex + 16), 0, - gBattleAnimArgs[4], - gBattleAnimArgs[4], - gBattleAnimArgs[3]); + cmd->blendY1, + cmd->blendY1, + cmd->color1); gTasks[taskId].func = AnimTask_FlashAnimTagWithColor_Step1; } @@ -662,44 +695,44 @@ static void AnimTask_FlashAnimTagWithColor_Step1(u8 taskId) { u32 selectedPalettes; - if (gTasks[taskId].data[0] > 0) + if (gTasks[taskId].tTimer > 0) { - gTasks[taskId].data[0]--; + gTasks[taskId].tTimer--; return; } if (gPaletteFade.active) return; - if (gTasks[taskId].data[2] == 0) + if (gTasks[taskId].tNumBlends == 0) { gTasks[taskId].func = AnimTask_FlashAnimTagWithColor_Step2; return; } - selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16); - if (gTasks[taskId].data[1] & 0x100) + selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].tAnimTag) + 16); + if (gTasks[taskId].tDelay & 0x100) { BeginNormalPaletteFade( selectedPalettes, 0, - gTasks[taskId].data[4], - gTasks[taskId].data[4], - gTasks[taskId].data[3]); + gTasks[taskId].tBlendY1, + gTasks[taskId].tBlendY1, + gTasks[taskId].tColor1); } else { BeginNormalPaletteFade( selectedPalettes, 0, - gTasks[taskId].data[6], - gTasks[taskId].data[6], - gTasks[taskId].data[5]); + gTasks[taskId].tBlendY2, + gTasks[taskId].tBlendY2, + gTasks[taskId].tColor2); } - gTasks[taskId].data[1] ^= 0x100; - gTasks[taskId].data[0] = gTasks[taskId].data[1] & 0xFF; - gTasks[taskId].data[2]--; + gTasks[taskId].tDelay ^= 0x100; + gTasks[taskId].tTimer = gTasks[taskId].tDelay & 0xFF; + gTasks[taskId].tNumBlends--; } static void AnimTask_FlashAnimTagWithColor_Step2(u8 taskId) @@ -708,25 +741,36 @@ static void AnimTask_FlashAnimTagWithColor_Step2(u8 taskId) if (!gPaletteFade.active) { - selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16); + selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].tAnimTag) + 16); BeginNormalPaletteFade(selectedPalettes, 0, 0, 0, RGB_BLACK); DestroyAnimVisualTask(taskId); } } +#undef tTimer +#undef tDelay +#undef tNumBlends +#undef tColor1 +#undef tBlendY1 +#undef tColor2 +#undef tBlendY2 +#undef tAnimTag + void AnimTask_InvertScreenColor(u8 taskId) { + CMD_ARGS(flagsScenery, flagsAttacker, flagsTarget); + u32 selectedPalettes = 0; u8 attackerBattler = gBattleAnimAttacker; u8 targetBattler = gBattleAnimTarget; - if (gBattleAnimArgs[0] & 0x100) + if (cmd->flagsScenery & (1 << 8)) selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE); - if (gBattleAnimArgs[1] & 0x100) + if (cmd->flagsAttacker & (1 << 8)) selectedPalettes |= (0x10000 << attackerBattler); - if (gBattleAnimArgs[2] & 0x100) + if (cmd->flagsTarget & (1 << 8)) selectedPalettes |= (0x10000 << targetBattler); InvertPlttBuffer(selectedPalettes); @@ -744,6 +788,8 @@ void AnimTask_InvertScreenColor(u8 taskId) #define tColorB data[7] void AnimTask_TintPalettes(u8 taskId) { + CMD_ARGS(flagsScenery, flagsAttacker, flagsTarget, duration, r, g, b); + u8 attackerBattler; u8 targetBattler; u8 paletteIndex; @@ -751,13 +797,13 @@ void AnimTask_TintPalettes(u8 taskId) if (gTasks[taskId].tTimer == 0) { - gTasks[taskId].tFlagsScenery = gBattleAnimArgs[0]; - gTasks[taskId].tFlagsAttacker = gBattleAnimArgs[1]; - gTasks[taskId].tFlagsTarget = gBattleAnimArgs[2]; - gTasks[taskId].tLength = gBattleAnimArgs[3]; - gTasks[taskId].tColorR = gBattleAnimArgs[4]; - gTasks[taskId].tColorG = gBattleAnimArgs[5]; - gTasks[taskId].tColorB = gBattleAnimArgs[6]; + gTasks[taskId].tFlagsScenery = cmd->flagsScenery; + gTasks[taskId].tFlagsAttacker = cmd->flagsAttacker; + gTasks[taskId].tFlagsTarget = cmd->flagsTarget; + gTasks[taskId].tLength = cmd->duration; + gTasks[taskId].tColorR = cmd->r; + gTasks[taskId].tColorG = cmd->g; + gTasks[taskId].tColorB = cmd->b; } gTasks[taskId].tTimer++; @@ -795,25 +841,34 @@ void AnimTask_TintPalettes(u8 taskId) #undef tColorG #undef tColorB +#define sShakeVelocity data[0] +#define sShakeTimer data[1] +#define sShakeDuration data[2] +#define sTimer data[3] +#define sOriginalValue data[4] +#define sType data[5] +#define sShakePtrLo data[6] +#define sShakePtrHi data[7] + static void AnimShakeMonOrBattlePlatforms(struct Sprite *sprite) { - u16 var0; + CMD_ARGS(velocity, shakeTimer, shakeDuration, type, battlerSelector); sprite->invisible = TRUE; - sprite->data[0] = -gBattleAnimArgs[0]; - sprite->data[1] = gBattleAnimArgs[1]; - sprite->data[2] = gBattleAnimArgs[1]; - sprite->data[3] = gBattleAnimArgs[2]; + sprite->sShakeVelocity = -cmd->velocity; + sprite->sShakeTimer = cmd->shakeTimer; + sprite->sShakeDuration = cmd->shakeTimer; + sprite->sTimer = cmd->shakeDuration; - switch (gBattleAnimArgs[3]) + switch (cmd->type) { - case 0: + case SHAKE_BG_X: StoreSpriteCallbackInData6(sprite, (void *)&gBattle_BG3_X); break; - case 1: + case SHAKE_BG_Y: StoreSpriteCallbackInData6(sprite, (void *)&gBattle_BG3_Y); break; - case 2: + case SHAKE_MON_X: StoreSpriteCallbackInData6(sprite, (void *)&gSpriteCoordOffsetX); break; default: @@ -821,10 +876,9 @@ static void AnimShakeMonOrBattlePlatforms(struct Sprite *sprite) break; } - sprite->data[4] = *(u16 *)(sprite->data[6] | (sprite->data[7] << 16)); - sprite->data[5] = gBattleAnimArgs[3]; - var0 = sprite->data[5] - 2; - if (var0 < 2) + sprite->sOriginalValue = *(u16 *)(sprite->sShakePtrLo | (sprite->sShakePtrHi << 16)); + sprite->sType = cmd->type; + if (sprite->sType == SHAKE_MON_X || sprite->sType == SHAKE_MON_Y) AnimShakeMonOrBattlePlatforms_UpdateCoordOffsetEnabled(); sprite->callback = AnimShakeMonOrBattlePlatforms_Step; @@ -833,27 +887,25 @@ static void AnimShakeMonOrBattlePlatforms(struct Sprite *sprite) static void AnimShakeMonOrBattlePlatforms_Step(struct Sprite *sprite) { u8 i; - u16 var0; - if (sprite->data[3] > 0) + if (sprite->sTimer > 0) { - sprite->data[3]--; - if (sprite->data[1] > 0) + sprite->sTimer--; + if (sprite->sShakeTimer > 0) { - sprite->data[1]--; + sprite->sShakeTimer--; } else { - sprite->data[1] = sprite->data[2]; - *(u16 *)(sprite->data[6] | (sprite->data[7] << 16)) += sprite->data[0]; - sprite->data[0] = -sprite->data[0]; + sprite->sShakeTimer = sprite->sShakeDuration; + *(u16 *)(sprite->sShakePtrLo | (sprite->sShakePtrHi << 16)) += sprite->sShakeVelocity; + sprite->sShakeVelocity = -sprite->sShakeVelocity; } } else { - *(u16 *)(sprite->data[6] | (sprite->data[7] << 16)) = sprite->data[4]; - var0 = sprite->data[5] - 2; - if (var0 < 2) + *(u16 *)(sprite->sShakePtrLo | (sprite->sShakePtrHi << 16)) = sprite->sOriginalValue; + if (sprite->sType == SHAKE_MON_X || sprite->sType == SHAKE_MON_Y) { for (i = 0; i < gBattlersCount; i++) gSprites[gBattlerSpriteIds[i]].coordOffsetEnabled = FALSE; @@ -865,23 +917,35 @@ static void AnimShakeMonOrBattlePlatforms_Step(struct Sprite *sprite) static void AnimShakeMonOrBattlePlatforms_UpdateCoordOffsetEnabled(void) { + // Matches AnimShakeMonOrBattlePlatforms. + CMD_ARGS(velocity, shakeDuration, duration, type, battlerSelector); + gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = FALSE; gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = FALSE; - if (gBattleAnimArgs[4] == 2) + if (cmd->battlerSelector == 2) { gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = TRUE; gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = TRUE; } else { - if (gBattleAnimArgs[4] == 0) + if (cmd->battlerSelector == 0) gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = TRUE; else gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = TRUE; } } +#undef sShakeVelocity +#undef sShakeTimer +#undef sShakeDuration +#undef sTimer +#undef sOriginalValue +#undef sType +#undef sShakePtrLo +#undef sShakePtrHi + // Task data for AnimTask_ShakeBattlePlatforms #define tXOffset data[0] #define tYOffset data[1] @@ -890,19 +954,17 @@ static void AnimShakeMonOrBattlePlatforms_UpdateCoordOffsetEnabled(void) #define tShakeDelay data[8] // Can shake battle platforms back and forth on the X or down and back to original pos on Y (cant shake up from orig pos) -// arg0: x offset of shake -// arg1: y offset of shake -// arg2: number of shakes -// arg3: time between shakes void AnimTask_ShakeBattlePlatforms(u8 taskId) { - gTasks[taskId].tXOffset = gBattleAnimArgs[0]; - gTasks[taskId].tYOffset = gBattleAnimArgs[1]; - gTasks[taskId].tNumShakes = gBattleAnimArgs[2]; - gTasks[taskId].tTimer = gBattleAnimArgs[3]; - gTasks[taskId].tShakeDelay = gBattleAnimArgs[3]; - gBattle_BG3_X = gBattleAnimArgs[0]; - gBattle_BG3_Y = gBattleAnimArgs[1]; + CMD_ARGS(xOffset, yOffset, shakes, delay); + + gTasks[taskId].tXOffset = cmd->xOffset; + gTasks[taskId].tYOffset = cmd->yOffset; + gTasks[taskId].tNumShakes = cmd->shakes; + gTasks[taskId].tTimer = cmd->delay; + gTasks[taskId].tShakeDelay = cmd->delay; + gBattle_BG3_X = cmd->xOffset; + gBattle_BG3_Y = cmd->yOffset; gTasks[taskId].func = AnimTask_ShakeBattlePlatforms_Step; gTasks[taskId].func(taskId); } @@ -943,8 +1005,10 @@ static void AnimTask_ShakeBattlePlatforms_Step(u8 taskId) static void AnimHitSplatBasic(struct Sprite *sprite) { - StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); - if (gBattleAnimArgs[2] == ANIM_ATTACKER) + CMD_ARGS(x, y, relativeTo, animation); + + StartSpriteAffineAnim(sprite, cmd->animation); + if (cmd->relativeTo == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, TRUE); else InitSpritePosToAnimTarget(sprite, TRUE); @@ -953,16 +1017,18 @@ static void AnimHitSplatBasic(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } -// Same as basic hit splat but takes a length of time to persist for (arg4) +// Same as basic hit splat but takes a length of time to persist for. static void AnimHitSplatPersistent(struct Sprite *sprite) { - StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); - if (gBattleAnimArgs[2] == ANIM_ATTACKER) + CMD_ARGS(x, y, relativeTo, animation, duration); + + StartSpriteAffineAnim(sprite, cmd->animation); + if (cmd->relativeTo == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, TRUE); else InitSpritePosToAnimTarget(sprite, TRUE); - sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[0] = cmd->duration; sprite->callback = RunStoredCallbackWhenAffineAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSpriteAfterTimer); } @@ -971,19 +1037,24 @@ static void AnimHitSplatPersistent(struct Sprite *sprite) // Used by Twineedle and Spike Cannon static void AnimHitSplatHandleInvert(struct Sprite *sprite) { + // Matches AnimHitSplatBasic. + CMD_ARGS(x, y, relativeTo, animation); + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER && !IsContest()) - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + cmd->y = -cmd->y; AnimHitSplatBasic(sprite); } static void AnimHitSplatRandom(struct Sprite *sprite) { - if (gBattleAnimArgs[1] == -1) - gBattleAnimArgs[1] = Random2() & 3; + CMD_ARGS(relativeTo, animation); - StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]); - if (gBattleAnimArgs[0] == ANIM_ATTACKER) + if (cmd->animation == -1) + cmd->animation = Random2() & 3; + + StartSpriteAffineAnim(sprite, cmd->animation); + if (cmd->relativeTo == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, FALSE); else InitSpritePosToAnimTarget(sprite, FALSE); @@ -997,32 +1068,38 @@ static void AnimHitSplatRandom(struct Sprite *sprite) static void AnimHitSplatOnMonEdge(struct Sprite *sprite) { - sprite->data[0] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); + CMD_ARGS(relativeTo, x, y, animation); + + sprite->data[0] = GetAnimBattlerSpriteId(cmd->relativeTo); sprite->x = gSprites[sprite->data[0]].x + gSprites[sprite->data[0]].x2; sprite->y = gSprites[sprite->data[0]].y + gSprites[sprite->data[0]].y2; - sprite->x2 = gBattleAnimArgs[1]; - sprite->y2 = gBattleAnimArgs[2]; - StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); + sprite->x2 = cmd->x; + sprite->y2 = cmd->y; + StartSpriteAffineAnim(sprite, cmd->animation); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } static void AnimCrossImpact(struct Sprite *sprite) { - if (gBattleAnimArgs[2] == ANIM_ATTACKER) + CMD_ARGS(x, y, relativeTo, duration); + + if (cmd->relativeTo == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, TRUE); else InitSpritePosToAnimTarget(sprite, TRUE); - sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[0] = cmd->duration; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = WaitAnimForDuration; } static void AnimFlashingHitSplat(struct Sprite *sprite) { - StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); - if (gBattleAnimArgs[2] == ANIM_ATTACKER) + CMD_ARGS(x, y, relativeTo, animation); + + StartSpriteAffineAnim(sprite, cmd->animation); + if (cmd->relativeTo == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, TRUE); else InitSpritePosToAnimTarget(sprite, TRUE); From 050a9415c7fd32eabf11efe238a2a98dddf0a8e0 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Thu, 28 Nov 2024 13:27:44 +0000 Subject: [PATCH 02/36] Document battle_anim_bug.c --- asm/macros/battle_anim_script.inc | 28 ++++++++ data/battle_anim_scripts.s | 34 +++++----- src/battle_anim_bug.c | 108 +++++++++++++++--------------- 3 files changed, 99 insertions(+), 71 deletions(-) diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index 7abf5b8d28..e0fda482ba 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -312,6 +312,34 @@ .endif .endm + .macro create_megahorn_horn_sprite anim_battler:req, subpriority_offset:req, x1:req, y1:req, x2:req, y2:req, duration:req + createsprite gMegahornHornSpriteTemplate, \anim_battler, \subpriority_offset, \x1, \y1, \x2, \y2, \duration + .endm + + .macro create_leech_life_needle_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, duration:req + createsprite gLeechLifeNeedleSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \duration + .endm + + .macro create_web_thread_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, unk2:req, amplitude:req, targets_both:req + createsprite gWebThreadSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \unk2, \amplitude, \targets_both + .endm + + .macro create_string_wrap_sprite anim_battler:req, subpriority_offset:req, x:req, y:req + createsprite gStringWrapSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y + .endm + + .macro create_linear_stinger_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, target_x:req, target_y:req, duration:req + createsprite gLinearStingerSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \target_x, \target_y, \duration + .endm + + .macro create_pin_missile_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, target_x:req, target_y:req, duration:req, wave_amplitude:req + createsprite gPinMissileSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \target_x, \target_y, \duration, \wave_amplitude + .endm + + .macro create_tail_glow_orb_sprite anim_battler:req, subpriority_offset:req, relative_to:req + createsprite gTailGlowOrbSpriteTemplate, \anim_battler, \subpriority_offset, \relative_to + .endm + .macro create_confusion_duck_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, wave_offset:req, wave_period:req, duration:req createsprite gConfusionDuckSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \wave_offset, \wave_period, \duration .endm diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index e06960e9c1..5d79c375ed 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -706,15 +706,15 @@ Move_PIN_MISSILE: splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER - createsprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, -8, -8, 20, -32 + create_pin_missile_sprite ANIM_ATTACKER, 2, initial_x=20, initial_y=-8, target_x=-8, target_y=-8, duration=20, wave_amplitude=-32 delay 15 - createsprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 8, 8, 20, -40 + create_pin_missile_sprite ANIM_ATTACKER, 2, initial_x=20, initial_y=-8, target_x=8, target_y=8, duration=20, wave_amplitude=-40 delay 4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=-8, y=-8, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 delay 9 - createsprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 0, 0, 20, -32 + create_pin_missile_sprite ANIM_ATTACKER, 2, initial_x=20, initial_y=-8, target_x=0, target_y=0, duration=20, wave_amplitude=-32 delay 4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=8, y=8, relative_to=ANIM_TARGET, animation=2 @@ -821,7 +821,7 @@ Move_POISON_STING: splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER - createsprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 20, 0, -8, 0, 20 + create_linear_stinger_sprite ANIM_TARGET, 2, initial_x=20, initial_y=0, target_x=-8, target_y=0, duration=20 waitforvisualfinish create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 5, 1 @@ -840,8 +840,8 @@ Move_TWINEEDLE: splitbgprio ANIM_TARGET setalpha 12, 8 loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 6, 2 - createsprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 10, -4, 0, -4, 20 - createsprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 20, 12, 10, 12, 20 + create_linear_stinger_sprite ANIM_TARGET, 2, initial_x=10, initial_y=-4, target_x=0, target_y=-4, duration=20 + create_linear_stinger_sprite ANIM_TARGET, 2, initial_x=20, initial_y=12, target_x=10, target_y=12, duration=20 delay 20 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 5, 1 create_handle_invert_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=-4, relative_to=ANIM_TARGET, animation=3 @@ -1307,9 +1307,9 @@ Move_SPIKE_CANNON: waitforvisualfinish loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 5, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 - createsprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 10, -8, -8, -8, 20 - createsprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 0, 0, 20 - createsprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 8, 8, 20 + create_linear_stinger_sprite ANIM_ATTACKER, 2, initial_x=10, initial_y=-8, target_x=-8, target_y=-8, duration=20 + create_linear_stinger_sprite ANIM_ATTACKER, 2, initial_x=18, initial_y=0, target_x=0, target_y=0, duration=20 + create_linear_stinger_sprite ANIM_ATTACKER, 2, initial_x=26, initial_y=8, target_x=8, target_y=8, duration=20 waitforvisualfinish create_handle_invert_hitsplat_sprite ANIM_ATTACKER, 3, x=-8, y=-8, relative_to=ANIM_TARGET, animation=2 create_handle_invert_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 @@ -3893,7 +3893,7 @@ Move_TAIL_GLOW: setalpha 12, 8 simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=4, color=RGB_BLACK waitforvisualfinish - createsprite gTailGlowOrbSpriteTemplate, ANIM_ATTACKER, 66, ANIM_ATTACKER + create_tail_glow_orb_sprite ANIM_ATTACKER, 66, relative_to=ANIM_ATTACKER delay 18 loopsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER, 16, 6 waitforvisualfinish @@ -5884,7 +5884,7 @@ Move_LEECH_LIFE: splitbgprio_foes ANIM_TARGET setalpha 12, 8 delay 1 - createsprite gLeechLifeNeedleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 12 + create_leech_life_needle_sprite ANIM_ATTACKER, 2, x=-20, y=15, duration=12 waitforvisualfinish create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_ABSORB, SOUND_PAN_TARGET @@ -6117,7 +6117,7 @@ MegahornContinue: delay 10 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 6 delay 3 - createsprite gMegahornHornSpriteTemplate, ANIM_ATTACKER, 3, -42, 25, 0, 0, 6 + create_megahorn_horn_sprite ANIM_ATTACKER, 3, x1=-42, y1=25, x2=0, y2=0, duration=6 delay 4 playsewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0 @@ -7452,11 +7452,11 @@ Move_STRING_SHOT: call StringShotThread waitforvisualfinish playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET - createsprite gStringWrapSpriteTemplate, ANIM_TARGET, 2, 0, 10 + create_string_wrap_sprite ANIM_TARGET, 2, x=0, y=10 delay 4 - createsprite gStringWrapSpriteTemplate, ANIM_TARGET, 2, 0, -2 + create_string_wrap_sprite ANIM_TARGET, 2, x=0, y=-2 delay 4 - createsprite gStringWrapSpriteTemplate, ANIM_TARGET, 2, 0, 22 + create_string_wrap_sprite ANIM_TARGET, 2, x=0, y=22 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 1 @@ -7465,7 +7465,7 @@ Move_STRING_SHOT: end StringShotThread: - createsprite gWebThreadSpriteTemplate, ANIM_TARGET, 2, 20, 0, 512, 20, 1 + create_web_thread_sprite ANIM_TARGET, 2, x=20, y=0, unk2=512, amplitude=20, targets_both=TRUE delay 1 return @@ -7502,7 +7502,7 @@ Move_SPIDER_WEB: end SpiderWebThread: - createsprite gWebThreadSpriteTemplate, ANIM_TARGET, 2, 20, 0, 512, 20, 0 + create_web_thread_sprite ANIM_TARGET, 2, x=20, y=0, unk2=512, amplitude=20, targets_both=FALSE delay 1 return diff --git a/src/battle_anim_bug.c b/src/battle_anim_bug.c index a5875a376f..2dbd9a08cc 100644 --- a/src/battle_anim_bug.c +++ b/src/battle_anim_bug.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle_anim.h" +#include "battle_anim_internal.h" #include "gpu_regs.h" #include "trig.h" #include "constants/rgb.h" @@ -197,27 +198,29 @@ const struct SpriteTemplate gTailGlowOrbSpriteTemplate = static void AnimMegahornHorn(struct Sprite *sprite) { + CMD_ARGS(x1, y1, x2, y2, duration); + if (IsContest()) { StartSpriteAffineAnim(sprite, 2); - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + cmd->x2 = -cmd->x2; + cmd->x1 = -cmd->x1; } else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { StartSpriteAffineAnim(sprite, 1); - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - gBattleAnimArgs[3] = -gBattleAnimArgs[3]; - gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + cmd->y1 = -cmd->y1; + cmd->x2 = -cmd->x2; + cmd->y2 = -cmd->y2; + cmd->x1 = -cmd->x1; } - sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; - sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; - sprite->data[0] = gBattleAnimArgs[4]; + sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->x1; + sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->y1; + sprite->data[0] = cmd->duration; - sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; - sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->x2; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->y2; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); @@ -225,20 +228,22 @@ static void AnimMegahornHorn(struct Sprite *sprite) static void AnimLeechLifeNeedle(struct Sprite *sprite) { + CMD_ARGS(x, y, duration); + if (IsContest()) { - gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + cmd->x = -cmd->x; StartSpriteAffineAnim(sprite, 2); } else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + cmd->y = -cmd->y; + cmd->x = -cmd->x; } - sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; - sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; - sprite->data[0] = gBattleAnimArgs[2]; + sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->x; + sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->y; + sprite->data[0] = cmd->duration; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); @@ -249,22 +254,20 @@ static void AnimLeechLifeNeedle(struct Sprite *sprite) // Creates a single web thread that travels from attacker to target. // Used by MOVE_STRING_SHOT and MOVE_SPIDER_WEB in their first move phase. -// arg 0: x -// arg 1: y // arg 2: controls the left-to-right movement -// arg 3: amplitude -// arg 4: if targets both opponents static void AnimTranslateWebThread(struct Sprite *sprite) { + CMD_ARGS(x, y, unk2, amplitude, targetsBoth); + if (IsContest()) - gBattleAnimArgs[2] /= 2; + cmd->unk2 /= 2; InitSpritePosToAnimAttacker(sprite, TRUE); - sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[0] = cmd->unk2; sprite->data[1] = sprite->x; sprite->data[3] = sprite->y; - if (!gBattleAnimArgs[4]) + if (!cmd->targetsBoth) { sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); @@ -275,7 +278,7 @@ static void AnimTranslateWebThread(struct Sprite *sprite) } InitAnimLinearTranslationWithSpeed(sprite); - sprite->data[5] = gBattleAnimArgs[3]; + sprite->data[5] = cmd->amplitude; sprite->callback = AnimTranslateWebThread_Step; } @@ -294,13 +297,15 @@ static void AnimTranslateWebThread_Step(struct Sprite *sprite) // Second stage of String Shot static void AnimStringWrap(struct Sprite *sprite) { + CMD_ARGS(x, y); + SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &sprite->x, &sprite->y); if (GetBattlerSide(gBattleAnimAttacker)) - sprite->x -= gBattleAnimArgs[0]; + sprite->x -= cmd->x; else - sprite->x += gBattleAnimArgs[0]; + sprite->x += cmd->x; - sprite->y += gBattleAnimArgs[1]; + sprite->y += cmd->y; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) sprite->y += 8; @@ -358,27 +363,24 @@ static void AnimSpiderWeb_End(struct Sprite *sprite) // Translates a stinger sprite linearly to a destination location. The sprite is // initially rotated so that it appears to be traveling in a straight line. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: target x pixel offset -// arg 3: target y pixel offset -// arg 4: duration static void AnimTranslateStinger(struct Sprite *sprite) { + CMD_ARGS(initialX, intialY, targetX, targetY, duration); + s16 lVarX, lVarY; u16 rot; if (IsContest()) { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + cmd->targetX = -cmd->targetX; } else { if (GetBattlerSide(gBattleAnimAttacker)) { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + cmd->targetX = -cmd->targetX; + cmd->intialY = -cmd->intialY; + cmd->targetY = -cmd->targetY; } } @@ -387,20 +389,20 @@ static void AnimTranslateStinger(struct Sprite *sprite) if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT || GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT) { - gBattleAnimArgs[2] *= -1; - gBattleAnimArgs[0] *= -1; + cmd->targetX *= -1; + cmd->initialX *= -1; } } InitSpritePosToAnimAttacker(sprite, TRUE); - lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; - lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->targetX; + lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->targetY; rot = ArcTan2Neg(lVarX - sprite->x, lVarY - sprite->y); rot += 0xC000; TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rot); - sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[0] = cmd->duration; sprite->data[2] = lVarX; sprite->data[4] = lVarY; @@ -409,23 +411,19 @@ static void AnimTranslateStinger(struct Sprite *sprite) } // Rotates sprite and moves it in an arc, so that it appears like a missle or arrow traveling. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: target x pixel offset -// arg 3: target y pixel offset -// arg 4: duration -// arg 5: wave amplitude static void AnimMissileArc(struct Sprite *sprite) { + CMD_ARGS(initialX, intialY, targetX, targetY, duration, waveAmplitude); + InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker)) - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + cmd->targetX = -cmd->targetX; - sprite->data[0] = gBattleAnimArgs[4]; - sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; - sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; - sprite->data[5] = gBattleAnimArgs[5]; + sprite->data[0] = cmd->duration; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->targetX; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->targetY; + sprite->data[5] = cmd->waveAmplitude; InitAnimArcTranslation(sprite); sprite->callback = AnimMissileArc_Step; @@ -471,7 +469,9 @@ static void AnimMissileArc_Step(struct Sprite *sprite) static void AnimTailGlowOrb(struct Sprite *sprite) { - if (gBattleAnimArgs[0] == ANIM_ATTACKER) + CMD_ARGS(relativeTo); + + if (cmd->relativeTo == ANIM_ATTACKER) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + 18; From 5d713ad9bbc982ceda26a111eb260a997303c800 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Thu, 28 Nov 2024 15:17:32 +0000 Subject: [PATCH 03/36] Document battle_anim_dark.c --- asm/macros/battle_anim_script.inc | 40 +++++++++++ data/battle_anim_scripts.s | 114 +++++++++++++++--------------- src/battle_anim_dark.c | 62 +++++++++------- 3 files changed, 133 insertions(+), 83 deletions(-) diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index e0fda482ba..19651d5533 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -340,6 +340,22 @@ createsprite gTailGlowOrbSpriteTemplate, \anim_battler, \subpriority_offset, \relative_to .endm + .macro create_sharp_teeth_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, animation:req, x_velocity:req, y_velocity:req, half_duration:req + createsprite gSharpTeethSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \animation, 256 * \x_velocity, 256 * \y_velocity, \half_duration + .endm + + .macro create_clamp_jaw_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, animation:req, x_velocity:req, y_velocity:req, half_duration:req + createsprite gClampJawSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \animation, 256 * \x_velocity, 256 * \y_velocity, \half_duration + .endm + + .macro create_tear_drop_sprite anim_battler:req, subpriority_offset:req, relative_to:req, type:req + createsprite gTearDropSpriteTemplate, \anim_battler, \subpriority_offset, \relative_to, \type + .endm + + .macro create_claw_slash_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, animation:req + createsprite gClawSlashSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \animation + .endm + .macro create_confusion_duck_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, wave_offset:req, wave_period:req, duration:req createsprite gConfusionDuckSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \wave_offset, \wave_period, \duration .endm @@ -379,6 +395,30 @@ @ createvisualtask wrappers @ The arguments are based on the CMD_ARGS of the task. + .macro metallic_shine priority=5, permanent:req, color + .ifb \color + createvisualtask AnimTask_MetallicShine, \priority, \permanent, FALSE, RGB_BLACK + .else + createvisualtask AnimTask_MetallicShine, \priority, \permanent, TRUE, \color + .endif + .endm + + .macro set_grayscale_pal priority=5, battler:req + createvisualtask AnimTask_SetGrayscaleOrOriginalPal, \priority, \battler, FALSE + .endm + + .macro set_original_pal priority=5, battler:req + createvisualtask AnimTask_SetGrayscaleOrOriginalPal, \priority, \battler, TRUE + .endm + + .macro attacker_fade_to_invisible priority=2, step_delay:req + createvisualtask AnimTask_AttackerFadeToInvisible, \priority, \step_delay + .endm + + .macro attacker_fade_from_invisible priority=2, step_delay:req + createvisualtask AnimTask_AttackerFadeFromInvisible, \priority, \step_delay + .endm + .macro blend_color_cycle priority=2, selector:req, delay:req, num_blends:req, initial_blend_y:req, target_blend_y:req, color:req createvisualtask AnimTask_BlendColorCycle, \priority, \selector, \delay, \num_blends, \initial_blend_y, \target_blend_y, \color .endm diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 5d79c375ed..3670de686b 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1657,12 +1657,12 @@ Explosion1: Move_DEFENSE_CURL: loadspritegfx ANIM_TAG_ECLIPSING_ORB loopsewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER, 18, 3 - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, FALSE + set_grayscale_pal battler=ANIM_ATTACKER createvisualtask AnimTask_DefenseCurlDeformMon, 5 waitforvisualfinish createsprite gEclipsingOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 6, 0, 1 waitforvisualfinish - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, TRUE + set_original_pal battler=ANIM_ATTACKER waitforvisualfinish end @@ -2965,7 +2965,7 @@ SkyAttackUnleash: monbg ANIM_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 16, RGB_WHITE delay 4 - createvisualtask AnimTask_AttackerFadeToInvisible, 5, 0 + attacker_fade_to_invisible priority=5, step_delay=0 waitforvisualfinish createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_SKY_UPPERCUT, SOUND_PAN_ATTACKER createsprite gSkyAttackBirdSpriteTemplate, ANIM_TARGET, 2 @@ -2973,7 +2973,7 @@ SkyAttackUnleash: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET delay 20 - createvisualtask AnimTask_AttackerFadeFromInvisible, 5, 1 + attacker_fade_from_invisible priority=5, step_delay=1 delay 2 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 15, 0, RGB_WHITE waitforvisualfinish @@ -3875,13 +3875,13 @@ Move_CAMOUFLAGE: setalpha 16, 0 createvisualtask AnimTask_SetCamouflageBlend, 5, F_PAL_ATTACKER, 3, 0, 14 delay 16 - createvisualtask AnimTask_AttackerFadeToInvisible, 2, 4 + attacker_fade_to_invisible step_delay=4 playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER waitforvisualfinish delay 8 createvisualtask AnimTask_SetCamouflageBlend, 5, F_PAL_ATTACKER, 0, 0, 0 waitforvisualfinish - createvisualtask AnimTask_AttackerFadeFromInvisible, 2, 1 + attacker_fade_from_invisible step_delay=1 waitforvisualfinish blendoff clearmonbg ANIM_ATK_PARTNER @@ -4116,12 +4116,12 @@ Move_CRUSH_CLAW: createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 4 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 18, 1 - createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0 - createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0 + create_claw_slash_sprite ANIM_TARGET, 2, x=-10, y=-10, animation=0 + create_claw_slash_sprite ANIM_TARGET, 2, x=-10, y=10, animation=0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET delay 12 - createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, -10, 1 - createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, 10, 1 + create_claw_slash_sprite ANIM_TARGET, 2, x=10, y=-10, animation=1 + create_claw_slash_sprite ANIM_TARGET, 2, x=10, y=10, animation=1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish blendoff @@ -4176,17 +4176,17 @@ Move_FAKE_TEARS: createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 1 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 12, 4 delay 8 - createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 - createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 1 + create_tear_drop_sprite ANIM_ATTACKER, 2, relative_to=ANIM_ATTACKER, type=0 + create_tear_drop_sprite ANIM_ATTACKER, 2, relative_to=ANIM_ATTACKER, type=1 delay 8 - createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 2 - createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 3 + create_tear_drop_sprite ANIM_ATTACKER, 2, relative_to=ANIM_ATTACKER, type=2 + create_tear_drop_sprite ANIM_ATTACKER, 2, relative_to=ANIM_ATTACKER, type=3 delay 8 - createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 - createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 1 + create_tear_drop_sprite ANIM_ATTACKER, 2, relative_to=ANIM_ATTACKER, type=0 + create_tear_drop_sprite ANIM_ATTACKER, 2, relative_to=ANIM_ATTACKER, type=1 delay 8 - createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 2 - createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 3 + create_tear_drop_sprite ANIM_ATTACKER, 2, relative_to=ANIM_ATTACKER, type=2 + create_tear_drop_sprite ANIM_ATTACKER, 2, relative_to=ANIM_ATTACKER, type=3 waitforvisualfinish end @@ -4360,7 +4360,7 @@ Move_AERIAL_ACE: Move_IRON_DEFENSE: loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER, 28, 2 - createvisualtask AnimTask_MetallicShine, 5, 0, 0, RGB_BLACK + metallic_shine permanent=FALSE complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG, delay=8, num_blends=2, color1=RGB_WHITEALPHA, blend_y1=14, color2=RGB_WHITEALPHA, blend_y2=0 waitforvisualfinish end @@ -4572,7 +4572,7 @@ Move_SHOCK_WAVE: Move_HARDEN: loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 - createvisualtask AnimTask_MetallicShine, 5, 0, 0, RGB_BLACK + metallic_shine permanent=FALSE waitforvisualfinish end @@ -5155,7 +5155,7 @@ Move_FAINT_ATTACK: delay 0 playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 3 - createvisualtask AnimTask_AttackerFadeToInvisible, 2, 1 + attacker_fade_to_invisible step_delay=1 waitforvisualfinish clearmonbg ANIM_ATTACKER invisible ANIM_ATTACKER @@ -5175,7 +5175,7 @@ Move_FAINT_ATTACK: delay 32 createvisualtask AnimTask_InitAttackerFadeFromInvisible, 2 monbg ANIM_ATTACKER - createvisualtask AnimTask_AttackerFadeFromInvisible, 2, 1 + attacker_fade_from_invisible step_delay=1 waitforvisualfinish clearmonbg ANIM_ATTACKER delay 1 @@ -5286,8 +5286,8 @@ Move_BITE: monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_BITE, SOUND_PAN_TARGET - createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 - createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 + create_sharp_teeth_sprite ANIM_ATTACKER, 2, x=0, y=-32, animation=0, x_velocity=0, y_velocity=32/10, half_duration=10 + create_sharp_teeth_sprite ANIM_ATTACKER, 2, x=0, y=32, animation=4, x_velocity=0, y_velocity=-32/10, half_duration=10 delay 10 create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 7, 1 @@ -5305,15 +5305,15 @@ Move_CRUNCH: waitbgfadein setalpha 12, 8 playsewithpan SE_M_BITE, SOUND_PAN_TARGET - createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, -32, -32, 1, 819, 819, 10 - createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 32, 32, 5, -819, -819, 10 + create_sharp_teeth_sprite ANIM_ATTACKER, 2, x=-32, y=-32, animation=1, x_velocity=32/10, y_velocity=32/10, half_duration=10 + create_sharp_teeth_sprite ANIM_ATTACKER, 2, x=32, y=32, animation=5, x_velocity=-32/10, y_velocity=-32/10, half_duration=10 delay 10 create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-8, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 waitforvisualfinish playsewithpan SE_M_BITE, SOUND_PAN_TARGET - createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 32, -32, 7, -819, 819, 10 - createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, -32, 32, 3, 819, -819, 10 + create_sharp_teeth_sprite ANIM_ATTACKER, 2, x=32, y=-32, animation=7, x_velocity=-32/10, y_velocity=32/10, half_duration=10 + create_sharp_teeth_sprite ANIM_ATTACKER, 2, x=-32, y=32, animation=3, x_velocity=32/10, y_velocity=-32/10, half_duration=10 delay 10 create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=8, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 @@ -5331,8 +5331,8 @@ Move_CLAMP: monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET - createsprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 2, 819, 0, 10 - createsprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 6, -819, 0, 10 + create_clamp_jaw_sprite ANIM_ATTACKER, 2, x=-32, y=0, animation=2, x_velocity=32/10, y_velocity=0, half_duration=10 + create_clamp_jaw_sprite ANIM_ATTACKER, 2, x=32, y=0, animation=6, x_velocity=-32/10, y_velocity=0, half_duration=10 delay 10 create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 @@ -7219,7 +7219,7 @@ Move_STEEL_WING: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_IMPACT loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 - createvisualtask AnimTask_MetallicShine, 5, 0, 0, RGB_BLACK + metallic_shine permanent=FALSE waitforvisualfinish monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET @@ -7245,7 +7245,7 @@ Move_STEEL_WING: Move_IRON_TAIL: loadspritegfx ANIM_TAG_IMPACT loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 - createvisualtask AnimTask_MetallicShine, 5, 1, 0, RGB_BLACK + metallic_shine permanent=TRUE waitforvisualfinish monbg ANIM_TARGET setalpha 12, 8 @@ -7255,7 +7255,7 @@ Move_IRON_TAIL: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, TRUE + set_original_pal battler=ANIM_ATTACKER clearmonbg ANIM_TARGET blendoff waitforvisualfinish @@ -7265,7 +7265,7 @@ Move_POISON_TAIL: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_POISON_BUBBLE loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 - createvisualtask AnimTask_MetallicShine, 5, 1, 1, RGB(24, 6, 23) + metallic_shine permanent=TRUE, color=RGB(24, 6, 23) waitforvisualfinish monbg ANIM_TARGET setalpha 12, 8 @@ -7275,7 +7275,7 @@ Move_POISON_TAIL: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, TRUE + set_original_pal battler=ANIM_ATTACKER clearmonbg ANIM_TARGET blendoff call PoisonBubblesEffect @@ -7285,20 +7285,20 @@ Move_POISON_TAIL: Move_METAL_CLAW: loadspritegfx ANIM_TAG_CLAW_SLASH loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 - createvisualtask AnimTask_MetallicShine, 5, 0, 0, RGB_BLACK + metallic_shine permanent=FALSE waitforvisualfinish createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0 - createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0 + create_claw_slash_sprite ANIM_TARGET, 2, x=-10, y=-10, animation=0 + create_claw_slash_sprite ANIM_TARGET, 2, x=-10, y=10, animation=0 shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET delay 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, -10, 1 - createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, 10, 1 + create_claw_slash_sprite ANIM_TARGET, 2, x=10, y=-10, animation=1 + create_claw_slash_sprite ANIM_TARGET, 2, x=10, y=10, animation=1 shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET waitforvisualfinish end @@ -7947,16 +7947,16 @@ Move_PERISH_SONG: panse SE_M_PERISH_SONG, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 delay 80 simple_palette_blend selector=F_PAL_BG, delay=3, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_PLAYER_LEFT, FALSE - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_PLAYER_RIGHT, FALSE - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_OPPONENT_LEFT, FALSE - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_OPPONENT_RIGHT, FALSE + set_grayscale_pal battler=ANIM_PLAYER_LEFT + set_grayscale_pal battler=ANIM_PLAYER_RIGHT + set_grayscale_pal battler=ANIM_OPPONENT_LEFT + set_grayscale_pal battler=ANIM_OPPONENT_RIGHT delay 100 simple_palette_blend selector=F_PAL_BG, delay=3, initial_blend_y=16, target_blend_y=0, color=RGB_BLACK - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_PLAYER_LEFT, TRUE - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_PLAYER_RIGHT, TRUE - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_OPPONENT_LEFT, TRUE - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_OPPONENT_RIGHT, TRUE + set_original_pal battler=ANIM_PLAYER_LEFT + set_original_pal battler=ANIM_PLAYER_RIGHT + set_original_pal battler=ANIM_OPPONENT_LEFT + set_original_pal battler=ANIM_OPPONENT_RIGHT waitforvisualfinish end @@ -8635,8 +8635,8 @@ Move_DRAGON_CLAW: createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 528, 30, 13, 50, ANIM_ATTACKER delay 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_RAZOR_WIND, SOUND_PAN_TARGET - createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0 - createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0 + create_claw_slash_sprite ANIM_TARGET, 2, x=-10, y=-10, animation=0 + create_claw_slash_sprite ANIM_TARGET, 2, x=-10, y=10, animation=0 shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 480, 20, 16, -46, ANIM_ATTACKER delay 2 @@ -8648,8 +8648,8 @@ Move_DRAGON_CLAW: createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 512, 25, 16, 46, ANIM_ATTACKER delay 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_RAZOR_WIND, SOUND_PAN_TARGET - createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, -10, 1 - createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, 10, 1 + create_claw_slash_sprite ANIM_TARGET, 2, x=10, y=-10, animation=1 + create_claw_slash_sprite ANIM_TARGET, 2, x=10, y=10, animation=1 shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 464, 30, 15, -50, ANIM_ATTACKER delay 2 @@ -9575,7 +9575,7 @@ Move_DOOM_DESIRE: createvisualtask GetIsDoomDesireHitTurn, 2 delay 1 monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_TARGET, FALSE + set_grayscale_pal battler=ANIM_TARGET simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=0, target_blend_y=4, color=RGB_BLACK waitforvisualfinish setalpha 8, 8 @@ -9583,7 +9583,7 @@ Move_DOOM_DESIRE: createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_ATTACKER, 1 waitforvisualfinish delay 20 - createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_TARGET, TRUE + set_original_pal battler=ANIM_TARGET simple_palette_blend selector=F_PAL_BG, delay=1, initial_blend_y=4, target_blend_y=0, color=RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATK_PARTNER @@ -10407,8 +10407,8 @@ Status_Clamp: monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET - createsprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 2, 819, 0, 10 - createsprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 6, -819, 0, 10 + create_clamp_jaw_sprite ANIM_ATTACKER, 2, x=-32, y=0, animation=2, x_velocity=32/10, y_velocity=0, half_duration=10 + create_clamp_jaw_sprite ANIM_ATTACKER, 2, x=32, y=0, animation=6, x_velocity=-32/10, y_velocity=0, half_duration=10 delay 10 create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 @@ -10471,7 +10471,7 @@ General_SmokeballEscape: createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 124, 2, 14, -20, 30 delay 4 playsewithpan SE_BALL_OPEN, SOUND_PAN_TARGET - createvisualtask AnimTask_AttackerFadeToInvisible, 2, 2 + attacker_fade_to_invisible step_delay=2 createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 123, 3, 4, 4, 30 delay 14 playsewithpan SE_BALL_OPEN, SOUND_PAN_TARGET diff --git a/src/battle_anim_dark.c b/src/battle_anim_dark.c index 03df99e135..ffa4c15362 100644 --- a/src/battle_anim_dark.c +++ b/src/battle_anim_dark.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle_anim.h" +#include "battle_anim_internal.h" #include "contest.h" #include "gpu_regs.h" #include "graphics.h" @@ -189,8 +190,10 @@ const struct SpriteTemplate gClawSlashSpriteTemplate = void AnimTask_AttackerFadeToInvisible(u8 taskId) { + CMD_ARGS(stepDelay); + int battler; - gTasks[taskId].data[0] = gBattleAnimArgs[0]; + gTasks[taskId].data[0] = cmd->stepDelay; battler = gBattleAnimAttacker; gTasks[taskId].data[1] = 16; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); @@ -227,7 +230,9 @@ static void AnimTask_AttackerFadeToInvisible_Step(u8 taskId) void AnimTask_AttackerFadeFromInvisible(u8 taskId) { - gTasks[taskId].data[0] = gBattleAnimArgs[0]; + CMD_ARGS(stepDelay); + + gTasks[taskId].data[0] = cmd->stepDelay; gTasks[taskId].data[1] = BLDALPHA_BLEND(0, 16); gTasks[taskId].func = AnimTask_AttackerFadeFromInvisible_Step; SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]); @@ -314,12 +319,14 @@ static void AnimUnusedBagSteal_Step(struct Sprite *sprite) // Move sprite inward for Bite/Crunch and Clamp static void AnimBite(struct Sprite *sprite) { - sprite->x += gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; - StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]); - sprite->data[0] = gBattleAnimArgs[3]; - sprite->data[1] = gBattleAnimArgs[4]; - sprite->data[2] = gBattleAnimArgs[5]; + CMD_ARGS(x, y, animation, xVelocity, yVelocity, halfDuration); + + sprite->x += cmd->x; + sprite->y += cmd->y; + StartSpriteAffineAnim(sprite, cmd->animation); + sprite->data[0] = cmd->xVelocity; + sprite->data[1] = cmd->yVelocity; + sprite->data[2] = cmd->halfDuration; sprite->callback = AnimBite_Step1; } @@ -346,10 +353,12 @@ static void AnimBite_Step2(struct Sprite *sprite) // Launches a tear drop away from the battler. Used by Fake Tears static void AnimTearDrop(struct Sprite *sprite) { + CMD_ARGS(relativeTo, type); + u8 battler; s8 xOffset; - if (gBattleAnimArgs[0] == ANIM_ATTACKER) + if (cmd->relativeTo == ANIM_ATTACKER) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; @@ -357,7 +366,7 @@ static void AnimTearDrop(struct Sprite *sprite) xOffset = 20; sprite->oam.tileNum += 4; - switch (gBattleAnimArgs[1]) + switch (cmd->type) { case 0: sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 8; @@ -798,21 +807,22 @@ void AnimTask_MementoHandleBg(u8 taskId) // Animates a deep slash from a claw. Used by Metal Claw, Dragon Claw, and Crush Claw static void AnimClawSlash(struct Sprite *sprite) { - sprite->x += gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; - StartSpriteAnim(sprite, gBattleAnimArgs[2]); + CMD_ARGS(x, y, animation); + + sprite->x += cmd->x; + sprite->y += cmd->y; + StartSpriteAnim(sprite, cmd->animation); sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Makes the attacker metallic and shining. // Used by MOVE_HARDEN and MOVE_IRON_DEFENSE. -// arg0: if true won't change battler's palette back -// arg1: if true, use custom color -// arg2: custom color // Custom color argument is used in MOVE_POISON_TAIL to make the mon turn purplish/pinkish as if became cloaked in poison. void AnimTask_MetallicShine(u8 taskId) { + CMD_ARGS(permanent, useColor, color); + u16 species; u8 spriteId; u8 newSpriteId; @@ -869,15 +879,15 @@ void AnimTask_MetallicShine(u8 taskId) gBattle_BG1_Y = -gSprites[spriteId].y + 32; paletteNum = 16 + gSprites[spriteId].oam.paletteNum; - if (gBattleAnimArgs[1] == 0) + if (cmd->useColor == 0) SetGrayscaleOrOriginalPalette(paletteNum, FALSE); else - BlendPalette(BG_PLTT_ID(paletteNum), 16, 11, gBattleAnimArgs[2]); + BlendPalette(BG_PLTT_ID(paletteNum), 16, 11, cmd->color); gTasks[taskId].data[0] = newSpriteId; - gTasks[taskId].data[1] = gBattleAnimArgs[0]; - gTasks[taskId].data[2] = gBattleAnimArgs[1]; - gTasks[taskId].data[3] = gBattleAnimArgs[2]; + gTasks[taskId].data[1] = cmd->permanent; + gTasks[taskId].data[2] = cmd->useColor; + gTasks[taskId].data[3] = cmd->color; gTasks[taskId].data[6] = priorityChanged; gTasks[taskId].func = AnimTask_MetallicShine_Step; } @@ -926,22 +936,22 @@ static void AnimTask_MetallicShine_Step(u8 taskId) } // Changes battler's palette to either grayscale or original. -// arg0: which battler -// arg1: FALSE grayscale, TRUE original void AnimTask_SetGrayscaleOrOriginalPal(u8 taskId) { + CMD_ARGS(battler, mode); + u8 spriteId; u8 battler; bool8 calcSpriteId = FALSE; u8 position = B_POSITION_PLAYER_LEFT; - switch (gBattleAnimArgs[0]) + switch (cmd->battler) { case ANIM_ATTACKER: case ANIM_TARGET: case ANIM_ATK_PARTNER: case ANIM_DEF_PARTNER: - spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); + spriteId = GetAnimBattlerSpriteId(cmd->battler); break; case ANIM_PLAYER_LEFT: position = B_POSITION_PLAYER_LEFT; @@ -974,7 +984,7 @@ void AnimTask_SetGrayscaleOrOriginalPal(u8 taskId) } if (spriteId != SPRITE_NONE) - SetGrayscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]); + SetGrayscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, cmd->mode); DestroyAnimVisualTask(taskId); } From 0e415dde4685940ca44aac6ed7c3f647e6067d48 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Thu, 28 Nov 2024 16:37:04 +0000 Subject: [PATCH 04/36] Document battle_anim_dragon.c --- asm/macros/battle_anim_script.inc | 24 ++++++ data/battle_anim_scripts.s | 132 +++++++++++++++--------------- src/battle_anim_dragon.c | 69 +++++++++------- 3 files changed, 130 insertions(+), 95 deletions(-) diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index 19651d5533..2ed25ab4ac 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -356,6 +356,30 @@ createsprite gClawSlashSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \animation .endm + .macro create_outrage_flame_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, duration:req, x_velocity:req, y_velocity:req, flicker_duration:req + createsprite gOutrageFlameSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \duration, 256 * \x_velocity, 256 * \y_velocity, \flicker_duration + .endm + + .macro create_dragon_breath_fire_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, target_x:req, target_y:req, duration:req + createsprite gDragonBreathFireSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \target_x, \target_y, \duration + .endm + + .macro create_dragon_rage_fire_spit_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, target_x:req, target_y:req, duration:req + createsprite gDragonRageFireSpitSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \target_x, \target_y, \duration + .endm + + .macro create_dragon_rage_fire_plume_sprite anim_battler:req, subpriority_offset:req, relative_to:req, x:req, y:req + createsprite gDragonRageFirePlumeSpriteTemplate, \anim_battler, \subpriority_offset, \relative_to, \x, \y + .endm + + .macro create_dragon_dance_orb_sprite anim_battler:req, subpriority_offset:req, angle:req + createsprite gDragonDanceOrbSpriteTemplate, \anim_battler, \subpriority_offset, 256 * \angle + .endm + + .macro create_overheat_flame_sprite anim_battler:req, subpriority_offset:req, speed:req, unk1:req, unk2:req, duration:req, y:req + createsprite gOverheatFlameSpriteTemplate, \anim_battler, \subpriority_offset, \speed, \unk1, \unk2, \duration, \y + .endm + .macro create_confusion_duck_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, wave_offset:req, wave_period:req, duration:req createsprite gConfusionDuckSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \wave_offset, \wave_period, \duration .endm diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 3670de686b..0bf4c93050 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1903,43 +1903,43 @@ Move_OUTRAGE: blend_color_cycle priority=2, selector=F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, delay=2, num_blends=5, initial_blend_y=3, target_blend_y=8, color=RGB(14, 13, 0) createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 5, 4 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 0, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=5, y_velocity=0, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, 0, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=-5, y_velocity=0, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 0, 1280, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=0, y_velocity=5, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 0, -1280, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=0, y_velocity=-5, flicker_duration=3 delay 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 40, 1 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 768, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=5, y_velocity=3, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, 768, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=-5, y_velocity=3, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, -768, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=5, y_velocity=-3, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, -768, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=-5, y_velocity=-3, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 0, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=5, y_velocity=0, flicker_duration=3 call OutrageFlames call OutrageFlames waitforvisualfinish end OutrageFlames: delay 3 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, 0, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=-5, y_velocity=0, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 0, 1280, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=0, y_velocity=5, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 0, -1280, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=0, y_velocity=-5, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 768, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=5, y_velocity=3, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, 768, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=-5, y_velocity=3, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, -768, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=5, y_velocity=-3, flicker_duration=3 delay 0 - createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, -768, 3 + create_outrage_flame_sprite ANIM_TARGET, 2, x=0, y=0, duration=30, x_velocity=-5, y_velocity=-3, flicker_duration=3 return Move_SPARK: @@ -4525,12 +4525,12 @@ Move_DRAGON_DANCE: playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER delay 8 createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, RGB(0, 0, 19), 14, 0, 3 - createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0 - createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 43 - createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 85 - createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 128 - createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 170 - createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 213 + create_dragon_dance_orb_sprite ANIM_ATTACKER, 2, angle=0/360 + create_dragon_dance_orb_sprite ANIM_ATTACKER, 2, angle=61/360 + create_dragon_dance_orb_sprite ANIM_ATTACKER, 2, angle=120/360 + create_dragon_dance_orb_sprite ANIM_ATTACKER, 2, angle=180/360 + create_dragon_dance_orb_sprite ANIM_ATTACKER, 2, angle=240/360 + create_dragon_dance_orb_sprite ANIM_ATTACKER, 2, angle=300/360 delay 30 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER delay 30 @@ -4927,29 +4927,29 @@ Move_DRAGON_BREATH: monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 7, 7 - createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 + create_dragon_breath_fire_sprite ANIM_TARGET, 2, initial_x=0, initial_y=0, target_x=0, target_y=0, duration=20 delay 2 - createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 + create_dragon_breath_fire_sprite ANIM_TARGET, 2, initial_x=0, initial_y=0, target_x=0, target_y=0, duration=20 delay 2 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 9, RGB_RED - createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 + create_dragon_breath_fire_sprite ANIM_TARGET, 2, initial_x=0, initial_y=0, target_x=0, target_y=0, duration=20 delay 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 21, 1 - createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 + create_dragon_breath_fire_sprite ANIM_TARGET, 2, initial_x=0, initial_y=0, target_x=0, target_y=0, duration=20 delay 2 - createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 + create_dragon_breath_fire_sprite ANIM_TARGET, 2, initial_x=0, initial_y=0, target_x=0, target_y=0, duration=20 delay 2 - createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 + create_dragon_breath_fire_sprite ANIM_TARGET, 2, initial_x=0, initial_y=0, target_x=0, target_y=0, duration=20 delay 2 - createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 + create_dragon_breath_fire_sprite ANIM_TARGET, 2, initial_x=0, initial_y=0, target_x=0, target_y=0, duration=20 delay 2 - createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 + create_dragon_breath_fire_sprite ANIM_TARGET, 2, initial_x=0, initial_y=0, target_x=0, target_y=0, duration=20 delay 2 - createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 + create_dragon_breath_fire_sprite ANIM_TARGET, 2, initial_x=0, initial_y=0, target_x=0, target_y=0, duration=20 delay 2 - createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 + create_dragon_breath_fire_sprite ANIM_TARGET, 2, initial_x=0, initial_y=0, target_x=0, target_y=0, duration=20 delay 2 - createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 + create_dragon_breath_fire_sprite ANIM_TARGET, 2, initial_x=0, initial_y=0, target_x=0, target_y=0, duration=20 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 9, 0, RGB_RED waitforvisualfinish @@ -5242,25 +5242,25 @@ Move_DRAGON_RAGE: waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, 0, 15, 0, 0, 4 waitforvisualfinish - createsprite gDragonRageFireSpitSpriteTemplate, ANIM_TARGET, 2, 30, 15, 0, 10, 10 + create_dragon_rage_fire_spit_sprite ANIM_TARGET, 2, initial_x=30, initial_y=15, target_x=0, target_y=10, duration=10 waitforvisualfinish loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET, 11, 3 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 25, 1 - createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 5, 0 + create_dragon_rage_fire_plume_sprite ANIM_TARGET, 66, relative_to=ANIM_TARGET, x=5, y=0 delay 1 - createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -10, -15 + create_dragon_rage_fire_plume_sprite ANIM_TARGET, 66, relative_to=ANIM_TARGET, x=-10, y=-15 delay 1 - createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 25 + create_dragon_rage_fire_plume_sprite ANIM_TARGET, 2, relative_to=ANIM_TARGET, x=0, y=25 delay 1 - createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 15, 5 + create_dragon_rage_fire_plume_sprite ANIM_TARGET, 66, relative_to=ANIM_TARGET, x=15, y=5 delay 1 - createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -25, 0 + create_dragon_rage_fire_plume_sprite ANIM_TARGET, 66, relative_to=ANIM_TARGET, x=-25, y=0 delay 1 - createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 30, 30 + create_dragon_rage_fire_plume_sprite ANIM_TARGET, 2, relative_to=ANIM_TARGET, x=30, y=30 delay 1 - createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, -27, 25 + create_dragon_rage_fire_plume_sprite ANIM_TARGET, 2, relative_to=ANIM_TARGET, x=-27, y=25 delay 1 - createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 0, 8 + create_dragon_rage_fire_plume_sprite ANIM_TARGET, 66, relative_to=ANIM_TARGET, x=0, y=8 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 66, 0, 0, 4 waitforvisualfinish @@ -9299,32 +9299,32 @@ Move_OVERHEAT: createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 2, 0, 15, 1 waitforvisualfinish playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 30, 25, -20 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 32, 30, 25, -20 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 64, 30, 25, -20 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 96, 30, 25, -20 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 128, 30, 25, -20 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 160, 30, 25, -20 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 192, 30, 25, -20 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 224, 30, 25, -20 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=0, unk2=30, duration=25, y=-20 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=32, unk2=30, duration=25, y=-20 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=64, unk2=30, duration=25, y=-20 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=96, unk2=30, duration=25, y=-20 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=128, unk2=30, duration=25, y=-20 + create_overheat_flame_sprite ANIM_ATTACKER, 66, speed=1, unk1=160, unk2=30, duration=25, y=-20 + create_overheat_flame_sprite ANIM_ATTACKER, 66, speed=1, unk1=192, unk2=30, duration=25, y=-20 + create_overheat_flame_sprite ANIM_ATTACKER, 66, speed=1, unk1=224, unk2=30, duration=25, y=-20 delay 5 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 30, 25, 0 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 32, 30, 25, 0 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 64, 30, 25, 0 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 96, 30, 25, 0 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 128, 30, 25, 0 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 160, 30, 25, 0 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 192, 30, 25, 0 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 224, 30, 25, 0 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=0, unk2=30, duration=25, y=0 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=32, unk2=30, duration=25, y=0 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=64, unk2=30, duration=25, y=0 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=96, unk2=30, duration=25, y=0 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=128, unk2=30, duration=25, y=0 + create_overheat_flame_sprite ANIM_ATTACKER, 66, speed=1, unk1=160, unk2=30, duration=25, y=0 + create_overheat_flame_sprite ANIM_ATTACKER, 66, speed=1, unk1=192, unk2=30, duration=25, y=0 + create_overheat_flame_sprite ANIM_ATTACKER, 66, speed=1, unk1=224, unk2=30, duration=25, y=0 delay 5 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 30, 25, 10 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 32, 30, 25, 10 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 64, 30, 25, 10 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 96, 30, 25, 10 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 128, 30, 25, 10 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 160, 30, 25, 10 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 192, 30, 25, 10 - createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 224, 30, 25, 10 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=0, unk2=30, duration=25, y=10 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=32, unk2=30, duration=25, y=10 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=64, unk2=30, duration=25, y=10 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=96, unk2=30, duration=25, y=10 + create_overheat_flame_sprite ANIM_ATTACKER, 2, speed=1, unk1=128, unk2=30, duration=25, y=10 + create_overheat_flame_sprite ANIM_ATTACKER, 66, speed=1, unk1=160, unk2=30, duration=25, y=10 + create_overheat_flame_sprite ANIM_ATTACKER, 66, speed=1, unk1=192, unk2=30, duration=25, y=10 + create_overheat_flame_sprite ANIM_ATTACKER, 66, speed=1, unk1=224, unk2=30, duration=25, y=10 delay 5 waitforvisualfinish create_basic_hitsplat_sprite ANIM_TARGET, 3, x=-5, y=3, relative_to=ANIM_TARGET, animation=0 diff --git a/src/battle_anim_dragon.c b/src/battle_anim_dragon.c index 4badd53627..09d0957d77 100644 --- a/src/battle_anim_dragon.c +++ b/src/battle_anim_dragon.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle_anim.h" +#include "battle_anim_internal.h" #include "scanline_effect.h" #include "task.h" #include "trig.h" @@ -189,24 +190,26 @@ const struct SpriteTemplate gOverheatFlameSpriteTemplate = static void AnimOutrageFlame(struct Sprite *sprite) { + CMD_ARGS(x, y, duration, xVelocity, yVelocity, flickerDuration); + sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { - sprite->x -= gBattleAnimArgs[0]; - gBattleAnimArgs[3] = -gBattleAnimArgs[3]; - gBattleAnimArgs[4] = -gBattleAnimArgs[4]; + sprite->x -= cmd->x; + cmd->xVelocity = -cmd->xVelocity; + cmd->yVelocity = -cmd->yVelocity; } else { - sprite->x += gBattleAnimArgs[0]; + sprite->x += cmd->x; } - sprite->y += gBattleAnimArgs[1]; - sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[1] = gBattleAnimArgs[3]; - sprite->data[3] = gBattleAnimArgs[4]; - sprite->data[5] = gBattleAnimArgs[5]; + sprite->y += cmd->y; + sprite->data[0] = cmd->duration; + sprite->data[1] = cmd->xVelocity; + sprite->data[3] = cmd->yVelocity; + sprite->data[5] = cmd->flickerDuration; sprite->invisible = TRUE; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = TranslateSpriteLinearAndFlicker; @@ -214,33 +217,37 @@ static void AnimOutrageFlame(struct Sprite *sprite) static void StartDragonFireTranslation(struct Sprite *sprite) { + CMD_ARGS(initialX, initialY, targetX, targetY, duration); + SetSpriteCoordsToAnimAttackerCoords(sprite); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { - sprite->x -= gBattleAnimArgs[1]; - sprite->y += gBattleAnimArgs[1]; - sprite->data[2] -= gBattleAnimArgs[2]; - sprite->data[4] += gBattleAnimArgs[3]; + sprite->x -= cmd->initialY; + sprite->y += cmd->initialY; + sprite->data[2] -= cmd->targetX; + sprite->data[4] += cmd->targetY; } else { - sprite->x += gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; - sprite->data[2] += gBattleAnimArgs[2]; - sprite->data[4] += gBattleAnimArgs[3]; + sprite->x += cmd->initialX; + sprite->y += cmd->initialY; + sprite->data[2] += cmd->targetX; + sprite->data[4] += cmd->targetY; StartSpriteAnim(sprite, 1); } - sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[0] = cmd->duration; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); } static void AnimDragonRageFirePlume(struct Sprite *sprite) { - if (gBattleAnimArgs[0] == 0) + CMD_ARGS(relativeTo, x, y); + + if (cmd->relativeTo == ANIM_ATTACKER) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); @@ -251,8 +258,8 @@ static void AnimDragonRageFirePlume(struct Sprite *sprite) sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); } - SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[1]); - sprite->y += gBattleAnimArgs[2]; + SetAnimSpriteInitialXOffset(sprite, cmd->x); + sprite->y += cmd->y; sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); } @@ -268,13 +275,15 @@ static void AnimDragonFireToTarget(struct Sprite *sprite) static void AnimDragonDanceOrb(struct Sprite *sprite) { + CMD_ARGS(angle); + u16 r5; u16 r0; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[4] = 0; sprite->data[5] = 1; - sprite->data[6] = gBattleAnimArgs[0]; + sprite->data[6] = cmd->angle; r5 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_HEIGHT); r0 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_WIDTH); if (r5 > r0) @@ -415,15 +424,17 @@ static void UpdateDragonDanceScanlineEffect(struct Task *task) static void AnimOverheatFlame(struct Sprite *sprite) { + CMD_ARGS(speed, unk1, unk2, duration, y); + int i; - int yAmplitude = (gBattleAnimArgs[2] * 3) / 5; + int yAmplitude = (cmd->unk2 * 3) / 5; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); - sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[4]; - sprite->data[1] = Cos(gBattleAnimArgs[1], gBattleAnimArgs[2]); - sprite->data[2] = Sin(gBattleAnimArgs[1], yAmplitude); - sprite->x += sprite->data[1] * gBattleAnimArgs[0]; - sprite->y += sprite->data[2] * gBattleAnimArgs[0]; - sprite->data[3] = gBattleAnimArgs[3]; + sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + cmd->y; + sprite->data[1] = Cos(cmd->unk1, cmd->unk2); + sprite->data[2] = Sin(cmd->unk1, yAmplitude); + sprite->x += sprite->data[1] * cmd->speed; + sprite->y += sprite->data[2] * cmd->speed; + sprite->data[3] = cmd->duration; sprite->callback = AnimOverheatFlame_Step; for (i = 0; i < 7; i++) sUnusedOverheatData[i] = sprite->data[i]; From 22eed3f4bfd17b5ed3c47b5e0e8af369fa90c3c2 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Tue, 3 Dec 2024 10:09:35 +0000 Subject: [PATCH 05/36] Partially document battle_anim_effects_1.c --- asm/macros/battle_anim_script.inc | 108 +++++ data/battle_anim_scripts.s | 520 ++++++++++++------------ src/battle_anim_effects_1.c | 629 ++++++++++++++++-------------- 3 files changed, 700 insertions(+), 557 deletions(-) diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index 2ed25ab4ac..d46638949b 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -380,6 +380,106 @@ createsprite gOverheatFlameSpriteTemplate, \anim_battler, \subpriority_offset, \speed, \unk1, \unk2, \duration, \y .endm + .macro create_sleep_powder_particle_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, duration:req, y_velocity:req, wave_amplitude:req, wave_speed:req + createsprite gSleepPowderParticleSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \duration, 256 * \y_velocity, \wave_amplitude, \wave_speed + .endm + + .macro create_stun_spore_particle_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, duration:req, y_velocity:req, wave_amplitude:req, wave_speed:req + createsprite gStunSporeParticleSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \duration, 256 * \y_velocity, \wave_amplitude, \wave_speed + .endm + + .macro create_poison_powder_particle_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, duration:req, y_velocity:req, wave_amplitude:req, wave_speed:req + createsprite gPoisonPowderParticleSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \duration, 256 * \y_velocity, \wave_amplitude, \wave_speed + .endm + + .macro create_power_absorption_orb_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, duration:req + createsprite gPowerAbsorptionOrbSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \duration + .endm + + .macro create_stockpile_absorption_orb_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, duration:req + createsprite gStockpileAbsorptionOrbSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \duration + .endm + + .macro create_solar_beam_big_orb_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, duration:req, animation:req + createsprite gSolarBeamBigOrbSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \duration, \animation + .endm + + .macro create_absorption_orb_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, wave_amplitude:req, wave_period:req + createsprite gAbsorptionOrbSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \wave_amplitude, \wave_period + .endm + + .macro create_hyper_beam_orb_sprite anim_battler:req, subpriority_offset:req + createsprite gHyperBeamOrbSpriteTemplate, \anim_battler, \subpriority_offset + .endm + + .macro createleechseedsprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, target_x:req, target_y:req, duration:req, wave_amplitude:req + createsprite gLeechSeedSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \target_x, \target_y, \duration, \wave_amplitude + .endm + + .macro create_spore_particle_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, wave_offset:req, duration:req, blend:req + createsprite gSporeParticleSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \wave_offset, \duration, \blend + .endm + + .macro create_petal_dance_big_flower_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, target_y:req, duration:req + createsprite gPetalDanceBigFlowerSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \target_y, \duration + .endm + + .macro create_petal_dance_small_flower_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, target_y:req, duration:req + createsprite gPetalDanceSmallFlowerSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \target_y, \duration + .endm + + .macro create_razor_leaf_particle_sprite anim_battler:req, subpriority_offset:req, upward_delta_x:req, upward_delta_y:req, upward_duration:req + createsprite gRazorLeafParticleSpriteTemplate, \anim_battler, \subpriority_offset, \upward_delta_x, \upward_delta_y, \upward_duration + .endm + + .macro create_razor_leaf_cutter_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, target_x:req, target_y:req, duration:req, wave_amplitude:req, target_both:req + createsprite gRazorLeafCutterSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \target_x, \target_y, \duration, \wave_amplitude, \target_both + .endm + + .macro create_swift_star_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, target_x:req, target_y:req, duration:req, wave_amplitude:req, target_both:req + createsprite gSwiftStarSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \target_x, \target_y, \duration, \wave_amplitude, \target_both + .endm + + .macro create_twister_leaf_sprite anim_battler:req, subpriority_offset:req, duration:req, distance_y:req, wave_period:req, wave_amplitude:req, speed_up_on_frame:req + createsprite gTwisterLeafSpriteTemplate, \anim_battler, \subpriority_offset, \duration, \distance_y, \wave_period, \wave_amplitude, \speed_up_on_frame + .endm + + .macro create_constrict_binding_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, affine_animation:req, squeezes:req + createsprite gConstrictBindingSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \affine_animation, \squeezes + .endm + + .macro create_mimic_orb_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req + createsprite gMimicOrbSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y + .endm + + .macro create_ingrain_root_sprite anim_battler:req, subpriority_offset:req, offset_x:req, offset_y:req, subpriority:req, animation:req, duration:req + createsprite gIngrainRootSpriteTemplate, \anim_battler, \subpriority_offset, \offset_x, \offset_y, \subpriority - 30, \animation, \duration + .endm + + .macro create_frenzy_plant_root_sprite anim_battler:req, subpriority_offset:req, interpolate_percent:req, offset_x:req, offset_y:req, subpriority:req, animation:req, duration:req + createsprite gFrenzyPlantRootSpriteTemplate, \anim_battler, \subpriority_offset, \interpolate_percent, \offset_x, \offset_y, \subpriority - 30, \animation, \duration + .endm + + .macro create_ingrain_orb_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, velocity_x:req, wave_amplitude:req, duration:req + createsprite gIngrainOrbSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \velocity_x, \wave_amplitude, \duration + .endm + + .macro create_present_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, unk2:req, unk3:req, unk4:req + createsprite gPresentSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \unk2, \unk3, \unk4 + .endm + + .macro create_present_heal_particle_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, velocity_y:req, unused3=1 + createsprite gPresentHealParticleSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \velocity_y, \unused3 + .endm + + .macro create_item_steal_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, unk2, unk3, unk4 + createsprite gItemStealSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \unk2, \unk3, \unk4 + .endm + + .macro create_trick_bag_sprite anim_battler:req, subpriority_offset:req, initial_y:req, wave_offset:req + createsprite gTrickBagSpriteTemplate, \anim_battler, \subpriority_offset, \initial_y, \wave_offset + .endm + .macro create_confusion_duck_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, wave_offset:req, wave_period:req, duration:req createsprite gConfusionDuckSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \wave_offset, \wave_period, \duration .endm @@ -443,6 +543,14 @@ createvisualtask AnimTask_AttackerFadeFromInvisible, \priority, \step_delay .endm + .macro shrink_target_copy priority=5, unk0:req, unk1:req + createvisualtask AnimTask_ShrinkTargetCopy, \priority, \unk0, \unk1 + .endm + + .macro create_leaf_blade_task priority=5 + createvisualtask AnimTask_LeafBlade, \priority + .endm + .macro blend_color_cycle priority=2, selector:req, delay:req, num_blends:req, initial_blend_y:req, target_blend_y:req, color:req createvisualtask AnimTask_BlendColorCycle, \priority, \selector, \delay, \num_blends, \initial_blend_y, \target_blend_y, \color .endm diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 0bf4c93050..409e2d60ff 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -458,72 +458,72 @@ Move_POISON_POWDER: loadspritegfx ANIM_TAG_POISON_POWDER loadspritegfx ANIM_TAG_POISON_BUBBLE loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 10, 6 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -30, -22, 117, 80, 5, 1 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 10, -22, 117, 80, -5, 1 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -25, -22, 117, 112, 5, 3 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=-30, y=-22, duration=117, y_velocity=80/256, wave_amplitude=5, wave_speed=1 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=10, y=-22, duration=117, y_velocity=80/256, wave_amplitude=-5, wave_speed=1 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=-25, y=-22, duration=117, y_velocity=112/256, wave_amplitude=5, wave_speed=3 delay 15 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 80, -5, 1 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 96, 5, 1 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 69, -5, 1 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=-5, y=-22, duration=117, y_velocity=80/256, wave_amplitude=-5, wave_speed=1 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=5, y=-22, duration=117, y_velocity=96/256, wave_amplitude=5, wave_speed=1 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=0, y=-22, duration=117, y_velocity=69/256, wave_amplitude=-5, wave_speed=1 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=-15, y=-22, duration=117, y_velocity=112/256, wave_amplitude=5, wave_speed=2 delay 30 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 15, -22, 117, 80, -5, 1 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 96, 7, 2 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 90, -8, 0 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=-15, y=-22, duration=117, y_velocity=112/256, wave_amplitude=5, wave_speed=2 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=15, y=-22, duration=117, y_velocity=80/256, wave_amplitude=-5, wave_speed=1 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=-10, y=-22, duration=117, y_velocity=96/256, wave_amplitude=7, wave_speed=2 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=-5, y=-22, duration=117, y_velocity=90/256, wave_amplitude=-8, wave_speed=0 delay 20 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 80, -5, 1 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 89, 5, 2 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 20, -22, 117, 112, -8, 2 - createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 80, 5, 1 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=-10, y=-22, duration=117, y_velocity=80/256, wave_amplitude=-5, wave_speed=1 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=0, y=-22, duration=117, y_velocity=89/256, wave_amplitude=5, wave_speed=2 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=20, y=-22, duration=117, y_velocity=112/256, wave_amplitude=-8, wave_speed=2 + create_poison_powder_particle_sprite ANIM_TARGET, 2, x=5, y=-22, duration=117, y_velocity=80/256, wave_amplitude=5, wave_speed=1 waitforvisualfinish end Move_STUN_SPORE: loadspritegfx ANIM_TAG_STUN_SPORE loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 10, 6 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -30, -22, 117, 80, 5, 1 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 10, -22, 117, 80, -5, 1 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -25, -22, 117, 112, 5, 3 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=-30, y=-22, duration=117, y_velocity=80/256, wave_amplitude=5, wave_speed=1 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=10, y=-22, duration=117, y_velocity=80/256, wave_amplitude=-5, wave_speed=1 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=-25, y=-22, duration=117, y_velocity=112/256, wave_amplitude=5, wave_speed=3 delay 15 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 80, -5, 1 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 96, 5, 1 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 69, -5, 1 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=-5, y=-22, duration=117, y_velocity=80/256, wave_amplitude=-5, wave_speed=1 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=5, y=-22, duration=117, y_velocity=96/256, wave_amplitude=5, wave_speed=1 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=0, y=-22, duration=117, y_velocity=69/256, wave_amplitude=-5, wave_speed=1 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=-15, y=-22, duration=117, y_velocity=112/256, wave_amplitude=5, wave_speed=2 delay 30 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 15, -22, 117, 80, -5, 1 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 96, 7, 2 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 90, -8, 0 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=-15, y=-22, duration=117, y_velocity=112/256, wave_amplitude=5, wave_speed=2 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=15, y=-22, duration=117, y_velocity=80/256, wave_amplitude=-5, wave_speed=1 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=-10, y=-22, duration=117, y_velocity=96/256, wave_amplitude=7, wave_speed=2 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=-5, y=-22, duration=117, y_velocity=90/256, wave_amplitude=-8, wave_speed=0 delay 20 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 80, -5, 1 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 89, 5, 2 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 20, -22, 117, 112, -8, 2 - createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 80, 5, 1 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=-10, y=-22, duration=117, y_velocity=80/256, wave_amplitude=-5, wave_speed=1 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=0, y=-22, duration=117, y_velocity=89/256, wave_amplitude=5, wave_speed=2 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=20, y=-22, duration=117, y_velocity=112/256, wave_amplitude=-8, wave_speed=2 + create_stun_spore_particle_sprite ANIM_TARGET, 2, x=5, y=-22, duration=117, y_velocity=80/256, wave_amplitude=5, wave_speed=1 waitforvisualfinish end Move_SLEEP_POWDER: loadspritegfx ANIM_TAG_SLEEP_POWDER loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 10, 6 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -30, -22, 117, 80, 5, 1 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 10, -22, 117, 80, -5, 1 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -25, -22, 117, 112, 5, 3 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=-30, y=-22, duration=117, y_velocity=80/256, wave_amplitude=5, wave_speed=1 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=10, y=-22, duration=117, y_velocity=80/256, wave_amplitude=-5, wave_speed=1 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=-25, y=-22, duration=117, y_velocity=112/256, wave_amplitude=5, wave_speed=3 delay 15 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 80, -5, 1 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 96, 5, 1 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 69, -5, 1 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=-5, y=-22, duration=117, y_velocity=80/256, wave_amplitude=-5, wave_speed=1 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=5, y=-22, duration=117, y_velocity=96/256, wave_amplitude=5, wave_speed=1 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=0, y=-22, duration=117, y_velocity=69/256, wave_amplitude=-5, wave_speed=1 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=-15, y=-22, duration=117, y_velocity=112/256, wave_amplitude=5, wave_speed=2 delay 30 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 15, -22, 117, 80, -5, 1 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 96, 7, 2 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 90, -8, 0 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=-15, y=-22, duration=117, y_velocity=112/256, wave_amplitude=5, wave_speed=2 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=15, y=-22, duration=117, y_velocity=80/256, wave_amplitude=-5, wave_speed=1 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=-10, y=-22, duration=117, y_velocity=96/256, wave_amplitude=7, wave_speed=2 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=-5, y=-22, duration=117, y_velocity=90/256, wave_amplitude=-8, wave_speed=0 delay 20 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 80, -5, 1 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 89, 5, 2 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 20, -22, 117, 112, -8, 2 - createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 80, 5, 1 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=-10, y=-22, duration=117, y_velocity=80/256, wave_amplitude=-5, wave_speed=1 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=0, y=-22, duration=117, y_velocity=89/256, wave_amplitude=5, wave_speed=2 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=20, y=-22, duration=117, y_velocity=112/256, wave_amplitude=-8, wave_speed=2 + create_sleep_powder_particle_sprite ANIM_TARGET, 2, x=5, y=-22, duration=117, y_velocity=80/256, wave_amplitude=5, wave_speed=1 waitforvisualfinish end @@ -533,21 +533,21 @@ Move_SWIFT: monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER - createsprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, 20, 1 + create_swift_star_sprite ANIM_TARGET, 3, initial_x=20, initial_y=-10, target_x=20, target_y=0, duration=22, wave_amplitude=20, target_both=TRUE delay 5 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER - createsprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 5, 22, -18, 1 + create_swift_star_sprite ANIM_TARGET, 3, initial_x=20, initial_y=-10, target_x=20, target_y=5, duration=22, wave_amplitude=-18, target_both=TRUE delay 5 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER - createsprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, -10, 22, 15, 1 + create_swift_star_sprite ANIM_TARGET, 3, initial_x=20, initial_y=-10, target_x=20, target_y=-10, duration=22, wave_amplitude=15, target_both=TRUE createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 18, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 18, 1 delay 5 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER - createsprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, -20, 1 + create_swift_star_sprite ANIM_TARGET, 3, initial_x=20, initial_y=-10, target_x=20, target_y=0, duration=22, wave_amplitude=-20, target_both=TRUE delay 5 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER - createsprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, 12, 1 + create_swift_star_sprite ANIM_TARGET, 3, initial_x=20, initial_y=-10, target_x=20, target_y=0, duration=22, wave_amplitude=12, target_both=TRUE delay 5 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -904,13 +904,13 @@ FireBlastCross: Move_LEECH_SEED: loadspritegfx ANIM_TAG_SEED playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER - createsprite gLeechSeedSpriteTemplate, ANIM_TARGET, 2, 15, 0, 0, 24, 35, -32 + createleechseedsprite ANIM_TARGET, 2, initial_x=15, initial_y=0, target_x=0, target_y=24, duration=35, wave_amplitude=-32 delay 8 playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER - createsprite gLeechSeedSpriteTemplate, ANIM_TARGET, 2, 15, 0, -16, 24, 35, -40 + createleechseedsprite ANIM_TARGET, 2, initial_x=15, initial_y=0, target_x=-16, target_y=24, duration=35, wave_amplitude=-40 delay 8 playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER - createsprite gLeechSeedSpriteTemplate, ANIM_TARGET, 2, 15, 0, 16, 24, 35, -37 + createleechseedsprite ANIM_TARGET, 2, initial_x=15, initial_y=0, target_x=16, target_y=24, duration=35, wave_amplitude=-37 delay 12 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_TARGET, 10, 8 waitforvisualfinish @@ -4494,7 +4494,7 @@ Move_CALM_MIND: Move_LEAF_BLADE: loadspritegfx ANIM_TAG_LEAF loadspritegfx ANIM_TAG_CROSS_IMPACT - createvisualtask AnimTask_LeafBlade, 5 + create_leaf_blade_task delay 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 playsewithpan SE_M_CUT, SOUND_PAN_TARGET @@ -5445,54 +5445,54 @@ SolarBeamSetUp: blendoff goto SolarBeamEnd SolarBeamAbsorbEffect: - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, 40, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=40, y=40, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, -40, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=-40, y=-40, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 40, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=0, y=40, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, -40, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=0, y=-40, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, -20, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=40, y=-20, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, 20, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=40, y=20, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, -20, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=-40, y=-20, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, 20, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=-40, y=20, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -20, 30, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=-20, y=30, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 20, -30, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=20, y=-30, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -20, -30, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=-20, y=-30, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 20, 30, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=20, y=30, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, 0, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=-40, y=0, duration=16 delay 2 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, 0, 16 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=40, y=0, duration=16 delay 2 return SolarBeamUnleash: call SetSolarBeamBg panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 createvisualtask AnimTask_CreateSmallSolarBeamOrbs, 5 - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=0 delay 4 - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=1 delay 4 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 10, RGB(25, 31, 0) - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=2 delay 4 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 65, 1 - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 3 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=3 delay 4 - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 4 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=4 delay 4 - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 5 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=5 delay 4 - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 6 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=6 delay 4 call SolarBeamUnleash1 call SolarBeamUnleash1 @@ -5501,19 +5501,19 @@ SolarBeamUnleash: call UnsetSolarBeamBg goto SolarBeamEnd SolarBeamUnleash1: - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=0 delay 4 - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=1 delay 4 - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=2 delay 4 - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 3 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=3 delay 4 - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 4 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=4 delay 4 - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 5 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=5 delay 4 - createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 6 + create_solar_beam_big_orb_sprite ANIM_TARGET, 3, x=15, y=0, duration=20, animation=6 delay 4 return @@ -5719,28 +5719,28 @@ Move_ABSORB: AbsorbEffect: playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-5, y=15, wave_amplitude=16, wave_period=33 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=-15, wave_amplitude=-16, wave_period=36 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-10, y=20, wave_amplitude=20, wave_period=39 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=5, y=-18, wave_amplitude=-20, wave_period=35 delay 4 return @@ -5772,36 +5772,36 @@ Move_MEGA_DRAIN: MegaDrainAbsorbEffect: playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=5, y=-18, wave_amplitude=-20, wave_period=35 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-10, y=20, wave_amplitude=20, wave_period=39 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-5, y=15, wave_amplitude=16, wave_period=33 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=-15, wave_amplitude=-16, wave_period=36 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=-15, wave_amplitude=-16, wave_period=36 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-5, y=15, wave_amplitude=16, wave_period=33 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-10, y=20, wave_amplitude=20, wave_period=39 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=5, y=-18, wave_amplitude=-20, wave_period=35 delay 4 return @@ -5833,44 +5833,44 @@ Move_GIGA_DRAIN: GigaDrainAbsorbEffect: playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -40, 35 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=5, y=-18, wave_amplitude=-40, wave_period=35 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-10, y=20, wave_amplitude=20, wave_period=39 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 28, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 40, 39 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=28, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-10, y=20, wave_amplitude=40, wave_period=39 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -32, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-5, y=15, wave_amplitude=16, wave_period=33 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-32, wave_period=26 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=-15, wave_amplitude=-16, wave_period=36 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-5, y=15, wave_amplitude=16, wave_period=33 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=-15, wave_amplitude=-16, wave_period=36 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -40, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-5, y=15, wave_amplitude=16, wave_period=33 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-40, wave_period=26 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 36, 33 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-5, y=15, wave_amplitude=36, wave_period=33 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-10, y=20, wave_amplitude=20, wave_period=39 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=5, y=-18, wave_amplitude=-20, wave_period=35 delay 4 return @@ -6753,11 +6753,11 @@ Move_COTTON_SPORE: end CreateCottonSpores: - createsprite gSporeParticleSpriteTemplate, ANIM_ATTACKER, 2, 0, -20, 85, 80, 0 + create_spore_particle_sprite ANIM_ATTACKER, 2, x=0, y=-20, wave_offset=85, duration=80, blend=FALSE delay 12 - createsprite gSporeParticleSpriteTemplate, ANIM_ATTACKER, 2, 0, -10, 170, 80, 0 + create_spore_particle_sprite ANIM_ATTACKER, 2, x=0, y=-10, wave_offset=170, duration=80, blend=FALSE delay 12 - createsprite gSporeParticleSpriteTemplate, ANIM_ATTACKER, 2, 0, -15, 0, 80, 0 + create_spore_particle_sprite ANIM_ATTACKER, 2, x=0, y=-15, wave_offset=0, duration=80, blend=FALSE delay 12 return @@ -6777,11 +6777,11 @@ Move_SPORE: end CreateSpore: - createsprite gSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -20, 85, 80, 1 + create_spore_particle_sprite ANIM_TARGET, 2, x=0, y=-20, wave_offset=85, duration=80, blend=TRUE delay 12 - createsprite gSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -10, 170, 80, 1 + create_spore_particle_sprite ANIM_TARGET, 2, x=0, y=-10, wave_offset=170, duration=80, blend=TRUE delay 12 - createsprite gSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -15, 0, 80, 1 + create_spore_particle_sprite ANIM_TARGET, 2, x=0, y=-15, wave_offset=0, duration=80, blend=TRUE delay 12 return @@ -6792,23 +6792,23 @@ Move_PETAL_DANCE: setalpha 12, 8 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 6, 3 - createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 8, 140 - createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 16, -24, 8, 100 - createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -16, -24, 8, 100 + create_petal_dance_big_flower_sprite ANIM_ATTACKER, 2, initial_x=0, initial_y=-24, target_y=8, duration=140 + create_petal_dance_small_flower_sprite ANIM_ATTACKER, 2, initial_x=16, initial_y=-24, target_y=8, duration=100 + create_petal_dance_small_flower_sprite ANIM_ATTACKER, 2, initial_x=-16, initial_y=-24, target_y=8, duration=100 delay 15 - createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 8, 140 - createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 32, -24, 8, 100 - createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -32, -24, 8, 100 + create_petal_dance_big_flower_sprite ANIM_ATTACKER, 2, initial_x=0, initial_y=-24, target_y=8, duration=140 + create_petal_dance_small_flower_sprite ANIM_ATTACKER, 2, initial_x=32, initial_y=-24, target_y=8, duration=100 + create_petal_dance_small_flower_sprite ANIM_ATTACKER, 2, initial_x=-32, initial_y=-24, target_y=8, duration=100 delay 15 - createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 8, 140 - createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 24, -24, 8, 100 - createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -24, -24, 8, 100 + create_petal_dance_big_flower_sprite ANIM_ATTACKER, 2, initial_x=0, initial_y=-24, target_y=8, duration=140 + create_petal_dance_small_flower_sprite ANIM_ATTACKER, 2, initial_x=24, initial_y=-24, target_y=8, duration=100 + create_petal_dance_small_flower_sprite ANIM_ATTACKER, 2, initial_x=-24, initial_y=-24, target_y=8, duration=100 delay 30 - createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 16, -24, 0, 100 - createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -16, -24, 0, 100 + create_petal_dance_small_flower_sprite ANIM_ATTACKER, 2, initial_x=16, initial_y=-24, target_y=0, duration=100 + create_petal_dance_small_flower_sprite ANIM_ATTACKER, 2, initial_x=-16, initial_y=-24, target_y=0, duration=100 delay 30 - createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 20, -16, 14, 80 - createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -20, -14, 16, 80 + create_petal_dance_small_flower_sprite ANIM_ATTACKER, 2, initial_x=20, initial_y=-16, target_y=14, duration=80 + create_petal_dance_small_flower_sprite ANIM_ATTACKER, 2, initial_x=-20, initial_y=-14, target_y=16, duration=80 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 5 delay 3 @@ -6831,29 +6831,29 @@ Move_RAZOR_LEAF: setalpha 12, 8 delay 1 loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER, 10, 5 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -2, 10 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=-3, upward_delta_y=-2, upward_duration=10 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -1, -1, 15 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=-1, upward_delta_y=-1, upward_duration=15 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -4, -4, 7 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=-4, upward_delta_y=-4, upward_duration=7 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 3, -3, 11 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=3, upward_delta_y=-3, upward_duration=11 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -1, -6, 8 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=-1, upward_delta_y=-6, upward_duration=8 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 2, -1, 12 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=2, upward_delta_y=-1, upward_duration=12 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -4, 13 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=-3, upward_delta_y=-4, upward_duration=13 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 4, -5, 7 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=4, upward_delta_y=-5, upward_duration=7 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 2, -6, 11 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=2, upward_delta_y=-6, upward_duration=11 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -5, 8 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=-3, upward_delta_y=-5, upward_duration=8 delay 60 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER - createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, 20, 1 - createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, -20, 1 + create_razor_leaf_cutter_sprite ANIM_TARGET, 3, initial_x=20, initial_y=-10, target_x=20, target_y=0, duration=22, wave_amplitude=20, target_both=TRUE + create_razor_leaf_cutter_sprite ANIM_TARGET, 3, initial_x=20, initial_y=-10, target_x=20, target_y=0, duration=22, wave_amplitude=-20, target_both=TRUE delay 20 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 @@ -7031,44 +7031,44 @@ Move_DREAM_EATER: end DreamEaterAbsorb: playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -40, 35 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=5, y=-18, wave_amplitude=-40, wave_period=35 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-10, y=20, wave_amplitude=20, wave_period=39 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 28, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 40, 39 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=28, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-10, y=20, wave_amplitude=40, wave_period=39 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -32, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-5, y=15, wave_amplitude=16, wave_period=33 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-32, wave_period=26 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=-15, wave_amplitude=-16, wave_period=36 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-5, y=15, wave_amplitude=16, wave_period=33 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=-15, wave_amplitude=-16, wave_period=36 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -40, 26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-5, y=15, wave_amplitude=16, wave_period=33 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-40, wave_period=26 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 36, 33 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-5, y=15, wave_amplitude=36, wave_period=33 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=10, y=-5, wave_amplitude=-8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=-10, y=20, wave_amplitude=20, wave_period=39 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 - createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=0, y=5, wave_amplitude=8, wave_period=26 + create_absorption_orb_sprite ANIM_ATTACKER, 3, x=5, y=-18, wave_amplitude=-20, wave_period=35 delay 4 return @@ -7579,19 +7579,19 @@ Move_RECOVER: end RecoverAbsorbEffect: - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, -10, 13 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=40, y=-10, duration=13 delay 3 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -35, -10, 13 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=-35, y=-10, duration=13 delay 3 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 15, -40, 13 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=15, y=-40, duration=13 delay 3 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -10, -32, 13 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=-10, y=-32, duration=13 delay 3 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 25, -20, 13 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=25, y=-20, duration=13 delay 3 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, -20, 13 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=-40, y=-20, duration=13 delay 3 - createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 5, -40, 13 + create_power_absorption_orb_sprite ANIM_ATTACKER, 2, x=5, y=-40, duration=13 delay 3 return @@ -7601,9 +7601,9 @@ Move_MIMIC: monbg_static ANIM_DEF_PARTNER splitbgprio_all panse SE_M_MINIMIZE, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, -3, 0 - createvisualtask AnimTask_ShrinkTargetCopy, 5, 128, 24 + shrink_target_copy unk0=128, unk1=24 delay 15 - createsprite gMimicOrbSpriteTemplate, ANIM_TARGET, 2, -12, 24 + create_mimic_orb_sprite ANIM_TARGET, 2, initial_x=-12, initial_y=24 delay 10 setarg 7, 0xFFFF waitforvisualfinish @@ -7617,12 +7617,12 @@ Move_MIMIC: Move_CONSTRICT: loadspritegfx ANIM_TAG_TENDRILS loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 6, 4 - createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 4, 0, 16, 0, 2 + create_constrict_binding_sprite ANIM_TARGET, 4, initial_x=0, initial_y=16, affine_animation=0, squeezes=2 delay 7 - createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0, 0, 0, 2 - createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 2, 0, 8, 1, 2 + create_constrict_binding_sprite ANIM_TARGET, 3, initial_x=0, initial_y=0, affine_animation=0, squeezes=2 + create_constrict_binding_sprite ANIM_TARGET, 2, initial_x=0, initial_y=8, affine_animation=1, squeezes=2 delay 7 - createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0, -8, 1, 2 + create_constrict_binding_sprite ANIM_TARGET, 3, initial_x=0, initial_y=-8, affine_animation=1, squeezes=2 delay 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 delay 20 @@ -7830,28 +7830,28 @@ Move_FURY_SWIPES: Move_INGRAIN: loadspritegfx ANIM_TAG_ROOTS loadspritegfx ANIM_TAG_ORBS - createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 16, 26, -1, 2, 150 + create_ingrain_root_sprite ANIM_ATTACKER, 2, offset_x=16, offset_y=26, subpriority=29, animation=2, duration=150 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER delay 10 - createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, -32, 20, 1, 1, 140 + create_ingrain_root_sprite ANIM_ATTACKER, 2, offset_x=-32, offset_y=20, subpriority=31, animation=1, duration=140 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER delay 10 - createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 32, 22, 1, 0, 130 + create_ingrain_root_sprite ANIM_ATTACKER, 2, offset_x=32, offset_y=22, subpriority=31, animation=0, duration=130 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER delay 10 - createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, -16, 25, -1, 3, 120 + create_ingrain_root_sprite ANIM_ATTACKER, 2, offset_x=-16, offset_y=25, subpriority=29, animation=3, duration=120 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER delay 40 - createsprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, 32, 26, -1, 3, 30 + create_ingrain_orb_sprite ANIM_ATTACKER, 3, initial_x=32, initial_y=26, velocity_x=-1, wave_amplitude=3, duration=30 delay 5 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 5 - createsprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, -48, 20, 1, 2, 30 + create_ingrain_orb_sprite ANIM_ATTACKER, 3, initial_x=-48, initial_y=20, velocity_x=1, wave_amplitude=2, duration=30 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 5 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 5 - createsprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, 48, 26, -2, 3, 18 + create_ingrain_orb_sprite ANIM_ATTACKER, 3, initial_x=48, initial_y=26, velocity_x=-2, wave_amplitude=3, duration=18 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 10 waitforvisualfinish @@ -7860,7 +7860,7 @@ Move_INGRAIN: Move_PRESENT: loadspritegfx ANIM_TAG_ITEM_BAG createvisualtask AnimTask_IsHealingMove, 2 - createsprite gPresentSpriteTemplate, ANIM_TARGET, 2, 0, -5, 10, 2, -1 + create_present_sprite ANIM_TARGET, 2, initial_x=0, initial_y=-5, unk2=10, unk3=2, unk4=-1 playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 14 playsewithpan SE_M_BUBBLE2, SOUND_PAN_ATTACKER @@ -7895,23 +7895,23 @@ PresentHeal: loadspritegfx ANIM_TAG_GREEN_SPARKLE loadspritegfx ANIM_TAG_BLUE_STAR playsewithpan SE_M_MORNING_SUN, SOUND_PAN_TARGET - createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -16, 32, -3, 1 + create_present_heal_particle_sprite ANIM_TARGET, 4, initial_x=-16, initial_y=32, velocity_y=-3 delay 3 - createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 16, 32, -3, -1 + create_present_heal_particle_sprite ANIM_TARGET, 4, initial_x=16, initial_y=32, velocity_y=-3, unused3=-1 delay 3 - createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 32, 32, -3, 1 + create_present_heal_particle_sprite ANIM_TARGET, 4, initial_x=32, initial_y=32, velocity_y=-3 delay 3 - createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -32, 32, -3, 1 + create_present_heal_particle_sprite ANIM_TARGET, 4, initial_x=-32, initial_y=32, velocity_y=-3 delay 3 - createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 0, 32, -3, 1 + create_present_heal_particle_sprite ANIM_TARGET, 4, initial_x=0, initial_y=32, velocity_y=-3 delay 3 - createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -8, 32, -3, 1 + create_present_heal_particle_sprite ANIM_TARGET, 4, initial_x=-8, initial_y=32, velocity_y=-3 delay 3 - createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -8, 32, -3, 1 + create_present_heal_particle_sprite ANIM_TARGET, 4, initial_x=-8, initial_y=32, velocity_y=-3 delay 3 - createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 24, 32, -3, 1 + create_present_heal_particle_sprite ANIM_TARGET, 4, initial_x=24, initial_y=32, velocity_y=-3 delay 3 - createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -24, 32, -3, 1 + create_present_heal_particle_sprite ANIM_TARGET, 4, initial_x=-24, initial_y=32, velocity_y=-3 waitforvisualfinish waitsound call HealingEffect2 @@ -8121,8 +8121,8 @@ Move_ENCORE: Move_TRICK: loadspritegfx ANIM_TAG_ITEM_BAG loadspritegfx ANIM_TAG_SPEED_DUST - createsprite gTrickBagSpriteTemplate, ANIM_ATTACKER, 2, -40, 80 - createsprite gTrickBagSpriteTemplate, ANIM_ATTACKER, 2, -40, 208 + create_trick_bag_sprite ANIM_ATTACKER, 2, initial_y=-40, wave_offset=80 + create_trick_bag_sprite ANIM_ATTACKER, 2, initial_y=-40, wave_offset=208 delay 16 playsewithpan SE_M_SKETCH, 0 createvisualtask AnimTask_StretchTargetUp, 3 @@ -8173,21 +8173,21 @@ Move_STOCKPILE: simple_palette_blend selector=F_PAL_ATTACKER, delay=0, initial_blend_y=12, target_blend_y=0, color=RGB_WHITE end StockpileAbsorb: - createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 55, 55, 13 + create_stockpile_absorption_orb_sprite ANIM_ATTACKER, 2, x=55, y=55, duration=13 delay 1 - createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -55, -55, 13 + create_stockpile_absorption_orb_sprite ANIM_ATTACKER, 2, x=-55, y=-55, duration=13 delay 1 - createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 55, 13 + create_stockpile_absorption_orb_sprite ANIM_ATTACKER, 2, x=0, y=55, duration=13 delay 1 - createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, -55, 13 + create_stockpile_absorption_orb_sprite ANIM_ATTACKER, 2, x=0, y=-55, duration=13 delay 1 - createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 55, -34, 13 + create_stockpile_absorption_orb_sprite ANIM_ATTACKER, 2, x=55, y=-34, duration=13 delay 1 - createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 55, 34, 13 + create_stockpile_absorption_orb_sprite ANIM_ATTACKER, 2, x=55, y=34, duration=13 delay 1 - createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -55, -34, 13 + create_stockpile_absorption_orb_sprite ANIM_ATTACKER, 2, x=-55, y=-34, duration=13 delay 1 - createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -55, 34, 13 + create_stockpile_absorption_orb_sprite ANIM_ATTACKER, 2, x=-55, y=34, duration=13 delay 1 return @@ -8398,8 +8398,8 @@ Move_HYPER_BEAM: simple_palette_blend selector=F_PAL_BG, delay=4, initial_blend_y=16, target_blend_y=0, color=RGB_BLACK end HyperBeamOrbs: - createsprite gHyperBeamOrbSpriteTemplate, ANIM_TARGET, 2 - createsprite gHyperBeamOrbSpriteTemplate, ANIM_TARGET, 2 + create_hyper_beam_orb_sprite ANIM_TARGET, 2 + create_hyper_beam_orb_sprite ANIM_TARGET, 2 delay 1 return @@ -8795,31 +8795,31 @@ Move_FRENZY_PLANT: setalpha 12, 8 simple_palette_blend unused_subpriority_offset=0, selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=5, color=RGB_BLACK waitforvisualfinish - createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 10, 8, 2, 0, 0, 100 + create_frenzy_plant_root_sprite ANIM_ATTACKER, 2, interpolate_percent=10, offset_x=8, offset_y=2, subpriority=30, animation=0, duration=100 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER delay 5 - createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, -2, 0, 1, 95 + create_frenzy_plant_root_sprite ANIM_ATTACKER, 2, interpolate_percent=20, offset_x=-8, offset_y=-2, subpriority=30, animation=1, duration=95 playsewithpan SE_M_SCRATCH, -43 delay 5 - createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 30, 8, -4, 0, 0, 90 + create_frenzy_plant_root_sprite ANIM_ATTACKER, 2, interpolate_percent=30, offset_x=8, offset_y=-4, subpriority=30, animation=0, duration=90 playsewithpan SE_M_SCRATCH, -22 delay 5 - createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 40, -8, 4, 0, 1, 85 + create_frenzy_plant_root_sprite ANIM_ATTACKER, 2, interpolate_percent=40, offset_x=-8, offset_y=4, subpriority=30, animation=1, duration=85 playsewithpan SE_M_SCRATCH, 0 delay 5 - createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 50, 8, 0, 0, 0, 85 + create_frenzy_plant_root_sprite ANIM_ATTACKER, 2, interpolate_percent=50, offset_x=8, offset_y=0, subpriority=30, animation=0, duration=85 playsewithpan SE_M_SCRATCH, +21 delay 5 - createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 60, -8, -2, 0, 1, 85 + create_frenzy_plant_root_sprite ANIM_ATTACKER, 2, interpolate_percent=60, offset_x=-8, offset_y=-2, subpriority=30, animation=1, duration=85 playsewithpan SE_M_SCRATCH, +42 delay 5 - createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 75, 8, 0, 0, 0, 85 + create_frenzy_plant_root_sprite ANIM_ATTACKER, 2, interpolate_percent=75, offset_x=8, offset_y=0, subpriority=30, animation=0, duration=85 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET delay 5 - createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 85, 16, 6, 0, 3, 80 + create_frenzy_plant_root_sprite ANIM_ATTACKER, 2, interpolate_percent=85, offset_x=16, offset_y=6, subpriority=30, animation=3, duration=80 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET delay 5 - createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 85, -16, -6, 0, 2, 75 + create_frenzy_plant_root_sprite ANIM_ATTACKER, 2, interpolate_percent=85, offset_x=-16, offset_y=-6, subpriority=30, animation=2, duration=75 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET delay 5 create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-10, y=-10, relative_to=ANIM_TARGET, animation=3 @@ -9654,26 +9654,26 @@ Move_TWISTER: monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET playsewithpan SE_M_TWISTER, SOUND_PAN_TARGET - createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 120, 70, 5, 70, 30 + create_twister_leaf_sprite ANIM_TARGET, 2, duration=120, distance_y=70, wave_period=5, wave_amplitude=70, speed_up_on_frame=30 delay 1 - createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 55, 6, 60, 25 + create_twister_leaf_sprite ANIM_TARGET, 2, duration=115, distance_y=55, wave_period=6, wave_amplitude=60, speed_up_on_frame=25 delay 1 - createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 60, 7, 60, 30 - createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 55, 10, 60, 30 + create_twister_leaf_sprite ANIM_TARGET, 2, duration=115, distance_y=60, wave_period=7, wave_amplitude=60, speed_up_on_frame=30 + create_twister_leaf_sprite ANIM_TARGET, 2, duration=115, distance_y=55, wave_period=10, wave_amplitude=60, speed_up_on_frame=30 delay 3 createsprite gTwisterRockSpriteTemplate, ANIM_TARGET, 2, 100, 50, 4, 50, 26 delay 1 - createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 105, 25, 8, 60, 20 + create_twister_leaf_sprite ANIM_TARGET, 2, duration=105, distance_y=25, wave_period=8, wave_amplitude=60, speed_up_on_frame=20 delay 1 - createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 40, 10, 48, 30 + create_twister_leaf_sprite ANIM_TARGET, 2, duration=115, distance_y=40, wave_period=10, wave_amplitude=48, speed_up_on_frame=30 delay 3 createsprite gTwisterRockSpriteTemplate, ANIM_TARGET, 2, 120, 30, 6, 45, 25 - createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 35, 10, 60, 30 + create_twister_leaf_sprite ANIM_TARGET, 2, duration=115, distance_y=35, wave_period=10, wave_amplitude=60, speed_up_on_frame=30 delay 3 createsprite gTwisterRockSpriteTemplate, ANIM_TARGET, 2, 105, 20, 8, 40, 0 delay 3 - createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 20, 255, 15, 32, 0 - createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 110, 10, 8, 32, 20 + create_twister_leaf_sprite ANIM_TARGET, 2, duration=20, distance_y=255, wave_period=15, wave_amplitude=32, speed_up_on_frame=0 + create_twister_leaf_sprite ANIM_TARGET, 2, duration=110, distance_y=10, wave_period=8, wave_amplitude=32, speed_up_on_frame=20 waitforvisualfinish create_basic_hitsplat_sprite ANIM_TARGET, 3, x=-32, y=-16, relative_to=ANIM_TARGET, animation=3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET @@ -9702,29 +9702,29 @@ Move_MAGICAL_LEAF: delay 1 loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER, 10, 5 createvisualtask AnimTask_CycleMagicalLeafPal, 5 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -2, 10 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=-3, upward_delta_y=-2, upward_duration=10 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -1, -1, 15 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=-1, upward_delta_y=-1, upward_duration=15 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -4, -4, 7 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=-4, upward_delta_y=-4, upward_duration=7 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 3, -3, 11 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=3, upward_delta_y=-3, upward_duration=11 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -1, -6, 8 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=-1, upward_delta_y=-6, upward_duration=8 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 2, -1, 12 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=2, upward_delta_y=-1, upward_duration=12 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -4, 13 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=-3, upward_delta_y=-4, upward_duration=13 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 4, -5, 7 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=4, upward_delta_y=-5, upward_duration=7 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 2, -6, 11 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=2, upward_delta_y=-6, upward_duration=11 delay 2 - createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -5, 8 + create_razor_leaf_particle_sprite ANIM_ATTACKER, 2, upward_delta_x=-3, upward_delta_y=-5, upward_duration=8 delay 60 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER - createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 32, 20, 0 - createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 32, -20, 0 + create_razor_leaf_cutter_sprite ANIM_TARGET, 3, initial_x=20, initial_y=-10, target_x=20, target_y=0, duration=32, wave_amplitude=20, target_both=FALSE + create_razor_leaf_cutter_sprite ANIM_TARGET, 3, initial_x=20, initial_y=-10, target_x=20, target_y=0, duration=32, wave_amplitude=-20, target_both=FALSE delay 30 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET create_basic_hitsplat_sprite ANIM_TARGET, 4, x=-10, y=-4, relative_to=ANIM_TARGET, animation=2 @@ -10362,9 +10362,9 @@ General_TurnTrap: Status_BindWrap: loadspritegfx ANIM_TAG_TENDRILS loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 6, 2 - createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 4, 0, 16, 0, 1 + create_constrict_binding_sprite ANIM_TARGET, 4, initial_x=0, initial_y=16, affine_animation=0, squeezes=1 delay 7 - createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 2, 0, 8, 1, 1 + create_constrict_binding_sprite ANIM_TARGET, 2, initial_x=0, initial_y=8, affine_animation=1, squeezes=1 delay 3 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 delay 20 @@ -10546,7 +10546,7 @@ General_ItemSteal: createvisualtask AnimTask_SetAnimAttackerAndTargetForEffectAtk, 2 createvisualtask AnimTask_SetTargetToEffectBattler, 2 @ Redundant with above delay 1 - createsprite gItemStealSpriteTemplate, ANIM_ATTACKER, 2, 0, -5, 10, 2, -1 + create_item_steal_sprite ANIM_ATTACKER, 2, initial_x=0, initial_y=-5, unk2=10, unk3=2, unk4=-1 end General_SnatchMove: diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index c2894894b6..cdf566380a 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -1,6 +1,7 @@ #include "global.h" #include "malloc.h" #include "battle_anim.h" +#include "battle_anim_internal.h" #include "battle_interface.h" #include "decompress.h" #include "gpu_regs.h" @@ -2191,29 +2192,21 @@ const struct SpriteTemplate gTauntFingerSpriteTemplate = // Animates the falling particles that horizontally wave back and forth. // Used by Sleep Powder, Stun Spore, and Poison Powder. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: total duration in frames -// arg 3: vertical movement speed (sub-pixel value) -// arg 4: wave amplitude -// arg 5: wave speed static void AnimMovePowderParticle(struct Sprite *sprite) { - sprite->x += gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; - sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[1] = gBattleAnimArgs[3]; + CMD_ARGS(x, y, duration, yVelocity, waveAmplitude, waveSpeed); + + sprite->x += cmd->x; + sprite->y += cmd->y; + sprite->data[0] = cmd->duration; + sprite->data[1] = cmd->yVelocity; if (GetBattlerSide(gBattleAnimAttacker)) - { - sprite->data[3] = -gBattleAnimArgs[4]; - } + sprite->data[3] = -cmd->waveAmplitude; else - { - sprite->data[3] = gBattleAnimArgs[4]; - } + sprite->data[3] = cmd->waveAmplitude; - sprite->data[4] = gBattleAnimArgs[5]; + sprite->data[4] = cmd->waveSpeed; sprite->callback = AnimMovePowderParticle_Step; } @@ -2234,13 +2227,12 @@ static void AnimMovePowderParticle_Step(struct Sprite *sprite) } // Moves an energy orb towards the center of the mon. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: duration static void AnimPowerAbsorptionOrb(struct Sprite *sprite) { + CMD_ARGS(x, y, duration); + InitSpritePosToAnimAttacker(sprite, TRUE); - sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[0] = cmd->duration; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = StartAnimLinearTranslation; @@ -2248,15 +2240,13 @@ static void AnimPowerAbsorptionOrb(struct Sprite *sprite) } // Moves an orb in a straight line towards the target mon. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: duration -// arg 3: sprite anim number static void AnimSolarBeamBigOrb(struct Sprite *sprite) { + CMD_ARGS(x, y, duration, animation); + InitSpritePosToAnimAttacker(sprite, TRUE); - StartSpriteAnim(sprite, gBattleAnimArgs[3]); - sprite->data[0] = gBattleAnimArgs[2]; + StartSpriteAnim(sprite, cmd->animation); + sprite->data[0] = cmd->duration; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = StartAnimLinearTranslation; @@ -2265,20 +2255,18 @@ static void AnimSolarBeamBigOrb(struct Sprite *sprite) // Moves a small orb in a wavy pattern towards the target mon. // The small orb "circles" the big orbs in AnimSolarBeamBigOrb. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: duration -// arg 3: initial wave offset static void AnimSolarBeamSmallOrb(struct Sprite *sprite) { + CMD_ARGS(x, y, duration, waveOffset); + InitSpritePosToAnimAttacker(sprite, TRUE); - sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[0] = cmd->duration; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); - sprite->data[5] = gBattleAnimArgs[3]; + sprite->data[5] = cmd->waveOffset; sprite->callback = AnimSolarBeamSmallOrb_Step; sprite->callback(sprite); } @@ -2311,6 +2299,7 @@ void AnimTask_CreateSmallSolarBeamOrbs(u8 taskId) { gTasks[taskId].data[1]++; gTasks[taskId].data[0] = 6; + // See AnimSolarBeamSmallOrb for how to interpret these. gBattleAnimArgs[0] = 15; gBattleAnimArgs[1] = 0; gBattleAnimArgs[2] = 80; @@ -2323,17 +2312,15 @@ void AnimTask_CreateSmallSolarBeamOrbs(u8 taskId) } // Moves an orb from the target mon to the attacking mon in an arc-like fashion. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: wave amplitude -// arg 3: wave period (lower means faster wave) static void AnimAbsorptionOrb(struct Sprite *sprite) { + CMD_ARGS(x, y, waveAmplitude, wavePeriod); + InitSpritePosToAnimTarget(sprite, TRUE); - sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[0] = cmd->wavePeriod; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); - sprite->data[5] = gBattleAnimArgs[2]; + sprite->data[5] = cmd->waveAmplitude; InitAnimArcTranslation(sprite); sprite->callback = AnimAbsorptionOrb_Step; } @@ -2393,22 +2380,18 @@ static void AnimHyperBeamOrb_Step(struct Sprite *sprite) // seed (sprouts a sapling from a seed.) // Used by Leech Seed. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: target x pixel offset -// arg 3: target y pixel offset -// arg 4: duration -// arg 5: wave amplitude static void AnimLeechSeed(struct Sprite *sprite) { + CMD_ARGS(initialX, initialY, targetX, targetY, duration, waveAmplitude); + InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + cmd->targetX = -cmd->targetX; - sprite->data[0] = gBattleAnimArgs[4]; - sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[2]; - sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[3]; - sprite->data[5] = gBattleAnimArgs[5]; + sprite->data[0] = cmd->duration; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + cmd->targetX; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + cmd->targetY; + sprite->data[5] = cmd->waveAmplitude; InitAnimArcTranslation(sprite); sprite->callback = AnimLeechSeed_Step; } @@ -2436,20 +2419,17 @@ static void AnimLeechSeedSprouts(struct Sprite *sprite) // Moves a spore particle in a halo around the target mon. // The sprite's priority is updated to give the effect of going // behind the mon's sprite. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: initial wave offset -// arg 3: duration -// arg 4: blend (0 = off, 1 = on) static void AnimSporeParticle(struct Sprite *sprite) { + CMD_ARGS(x, y, waveOffset, duration, blend); + InitSpritePosToAnimTarget(sprite, TRUE); - StartSpriteAnim(sprite, gBattleAnimArgs[4]); - if (gBattleAnimArgs[4] == 1) + StartSpriteAnim(sprite, cmd->blend); + if (cmd->blend == TRUE) sprite->oam.objMode = ST_OAM_OBJ_BLEND; - sprite->data[0] = gBattleAnimArgs[3]; - sprite->data[1] = gBattleAnimArgs[2]; + sprite->data[0] = cmd->duration; + sprite->data[1] = cmd->waveOffset; sprite->callback = AnimSporeParticle_Step; sprite->callback(sprite); } @@ -2499,18 +2479,16 @@ void AnimTask_SporeDoubleBattle(u8 taskId) // Rotates a big flower around the attacking mon, and slowly floats // downward. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: target y pixel offset -// arg 3: duration static void AnimPetalDanceBigFlower(struct Sprite *sprite) { + CMD_ARGS(initialX, initialY, targetY, duration); + InitSpritePosToAnimAttacker(sprite, FALSE); - sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[0] = cmd->duration; sprite->data[1] = sprite->x; sprite->data[2] = sprite->x; sprite->data[3] = sprite->y; - sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + cmd->targetY; InitAnimLinearTranslation(sprite); sprite->data[5] = 0x40; sprite->callback = AnimPetalDanceBigFlower_Step; @@ -2537,18 +2515,16 @@ static void AnimPetalDanceBigFlower_Step(struct Sprite *sprite) } // Slowly floats a small flower downard, while swaying from right to left. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: target y pixel offset -// arg 3: duration static void AnimPetalDanceSmallFlower(struct Sprite *sprite) { + CMD_ARGS(initialX, initialY, targetY, duration); + InitSpritePosToAnimAttacker(sprite, TRUE); - sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[0] = cmd->duration; sprite->data[1] = sprite->x; sprite->data[2] = sprite->x; sprite->data[3] = sprite->y; - sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + cmd->targetY; InitAnimLinearTranslation(sprite); sprite->data[5] = 0x40; sprite->callback = AnimPetalDanceSmallFlower_Step; @@ -2573,16 +2549,15 @@ static void AnimPetalDanceSmallFlower_Step(struct Sprite *sprite) } // Shoots a leaf upward, then floats it downward while swaying back and forth. -// arg 0: upward x delta per frame -// arg 1: upward y delta per frame -// arg 2: upward duration static void AnimRazorLeafParticle(struct Sprite *sprite) { + CMD_ARGS(upwardDeltaX, upwardDeltaY, upwardDuration); + sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); - sprite->data[0] = gBattleAnimArgs[0]; - sprite->data[1] = gBattleAnimArgs[1]; - sprite->data[2] = gBattleAnimArgs[2]; + sprite->data[0] = cmd->upwardDeltaX; + sprite->data[1] = cmd->upwardDeltaY; + sprite->data[2] = cmd->upwardDuration; sprite->callback = AnimRazorLeafParticle_Step1; } @@ -2632,33 +2607,28 @@ static void AnimRazorLeafParticle_Step2(struct Sprite *sprite) // Animates a sprite that moves linearly from one location to another, with a // single-cycle sine wave added to the y position along the way. // Used by Razor Leaf and Magical Leaf. -// arg 0: initial x offset -// arg 1: initial y offset -// arg 2: target x offset -// arg 3: target y offset -// arg 4: translation duration -// arg 5: wave amplitude -// arg 6: target between double battle opponents (boolean) static void AnimTranslateLinearSingleSineWave(struct Sprite *sprite) { + CMD_ARGS(initialX, initialY, targetX, targetY, duration, waveAmplitude, targetBoth); + InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + cmd->targetX = -cmd->targetX; - sprite->data[0] = gBattleAnimArgs[4]; - if (!gBattleAnimArgs[6]) + sprite->data[0] = cmd->duration; + if (!cmd->targetBoth) { - sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; - sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->targetX; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->targetY; } else { SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->data[2], &sprite->data[4]); - sprite->data[2] += gBattleAnimArgs[2]; - sprite->data[4] += gBattleAnimArgs[3]; + sprite->data[2] += cmd->targetX; + sprite->data[4] += cmd->targetY; } - sprite->data[5] = gBattleAnimArgs[5]; + sprite->data[5] = cmd->waveAmplitude; InitAnimArcTranslation(sprite); if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) sprite->data[0] = 1; @@ -2701,22 +2671,19 @@ static void AnimTranslateLinearSingleSineWave_Step(struct Sprite *sprite) } // Animates particles in the Twister move animation. -// arg 0: duration -// arg 1: total y delta (the particles rise upward) -// arg 2: wave period (higher means faster wave) -// arg 3: wave amplitude -// arg 4: speedup frame (particles move faster at the end of the animation) void AnimMoveTwisterParticle(struct Sprite *sprite) { + CMD_ARGS(duration, distanceY, wavePeriod, waveAmplitude, speedUpOnFrame); + if (IsDoubleBattle() == TRUE) SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y); sprite->y += 32; - sprite->data[0] = gBattleAnimArgs[0]; - sprite->data[1] = gBattleAnimArgs[1]; - sprite->data[2] = gBattleAnimArgs[2]; - sprite->data[3] = gBattleAnimArgs[3]; - sprite->data[4] = gBattleAnimArgs[4]; + sprite->data[0] = cmd->duration; + sprite->data[1] = cmd->distanceY; + sprite->data[2] = cmd->wavePeriod; + sprite->data[3] = cmd->waveAmplitude; + sprite->data[4] = cmd->speedUpOnFrame; sprite->callback = AnimMoveTwisterParticle_Step; } @@ -2749,17 +2716,15 @@ static void AnimMoveTwisterParticle_Step(struct Sprite *sprite) } // Squeezes a constricting "rope" several times via affine animations. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: affine anim num -// arg 3: num squeezes static void AnimConstrictBinding(struct Sprite *sprite) { + CMD_ARGS(initialX, initialY, affineAnimation, squeezes); + InitSpritePosToAnimTarget(sprite, FALSE); sprite->affineAnimPaused = 1; - StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]); - sprite->data[6] = gBattleAnimArgs[2]; - sprite->data[7] = gBattleAnimArgs[3]; + StartSpriteAffineAnim(sprite, cmd->affineAnimation); + sprite->data[6] = cmd->affineAnimation; + sprite->data[7] = cmd->squeezes; sprite->callback = AnimConstrictBinding_Step1; } @@ -2799,8 +2764,11 @@ static void AnimConstrictBinding_Step2(struct Sprite *sprite) } } +// unk1 may be some sort of duration? void AnimTask_ShrinkTargetCopy(u8 taskId) { + CMD_ARGS(unk0, unk1); + u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); if (gSprites[spriteId].invisible) { @@ -2814,8 +2782,8 @@ void AnimTask_ShrinkTargetCopy(u8 taskId) spriteId = GetAnimBattlerSpriteId(ANIM_DEF_PARTNER); gTasks[taskId].data[15] = gSprites[spriteId].oam.priority; gSprites[spriteId].oam.priority = GetBattlerSpriteBGPriority(BATTLE_PARTNER(gBattleAnimTarget)); - gTasks[taskId].data[0] = gBattleAnimArgs[0]; - gTasks[taskId].data[1] = gBattleAnimArgs[1]; + gTasks[taskId].data[0] = cmd->unk0; + gTasks[taskId].data[1] = cmd->unk1; gTasks[taskId].data[11] = 0x100; gTasks[taskId].func = AnimTask_DuplicateAndShrinkToPos_Step1; } @@ -2841,6 +2809,7 @@ static void AnimTask_DuplicateAndShrinkToPos_Step1(u8 taskId) static void AnimTask_DuplicateAndShrinkToPos_Step2(u8 taskId) { + // TODO: gBattleAnimArgs[ARG_RET_ID]? if ((u16)gBattleAnimArgs[7] == 0xFFFF) { if (gTasks[taskId].data[0] == 0) @@ -2868,18 +2837,18 @@ static void AnimTask_DuplicateAndShrinkToPos_Step2(u8 taskId) } // Moves an orb from the target mon to the attacking mon. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset static void AnimMimicOrb(struct Sprite *sprite) { + CMD_ARGS(initialX, initialY); + switch (sprite->data[0]) { case 0: if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) - gBattleAnimArgs[0] *= -1; + cmd->initialX *= -1; - sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[0]; - sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[1]; + sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + cmd->initialX; + sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + cmd->initialY; sprite->invisible = TRUE; sprite->data[0]++; break; @@ -2899,22 +2868,19 @@ static void AnimMimicOrb(struct Sprite *sprite) } // Animates a root that flickers away after some time. -// arg 0: x pixel offset -// arg 1: y pixel offset -// arg 2: sprite subpriority offset -// arg 3: sprite anim num -// arg 4: duration static void AnimIngrainRoot(struct Sprite *sprite) { + CMD_ARGS(offsetX, offsetY, subpriorityM30, animation, duration); + if (!sprite->data[0]) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); - sprite->x2 = gBattleAnimArgs[0]; - sprite->y2 = gBattleAnimArgs[1]; - sprite->subpriority = gBattleAnimArgs[2] + 30; - StartSpriteAnim(sprite, gBattleAnimArgs[3]); - sprite->data[2] = gBattleAnimArgs[4]; + sprite->x2 = cmd->offsetX; + sprite->y2 = cmd->offsetY; + sprite->subpriority = cmd->subpriorityM30 + 30; + StartSpriteAnim(sprite, cmd->animation); + sprite->data[2] = cmd->duration; sprite->data[0]++; if (sprite->y + sprite->y2 > 120) sprite->y += sprite->y2 + sprite->y - 120; @@ -2923,14 +2889,10 @@ static void AnimIngrainRoot(struct Sprite *sprite) } // Places a root on the path to the target mon that flickers away after some time. -// arg 0: percent along the path to the target mon -// arg 1: x pixel offset -// arg 2: y pixel offset -// arg 3: sprite subpriority offset -// arg 4: sprite anum num -// arg 5: duration static void AnimFrenzyPlantRoot(struct Sprite *sprite) { + CMD_ARGS(interpolatePercent, offsetX, offsetY, subpriorityM30, animation, duration); + s16 attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); s16 attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); s16 targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); @@ -2938,13 +2900,13 @@ static void AnimFrenzyPlantRoot(struct Sprite *sprite) targetX -= attackerX; targetY -= attackerY; - sprite->x = attackerX + targetX * gBattleAnimArgs[0] / 100; - sprite->y = attackerY + targetY * gBattleAnimArgs[0] / 100; - sprite->x2 = gBattleAnimArgs[1]; - sprite->y2 = gBattleAnimArgs[2]; - sprite->subpriority = gBattleAnimArgs[3] + 30; - StartSpriteAnim(sprite, gBattleAnimArgs[4]); - sprite->data[2] = gBattleAnimArgs[5]; + sprite->x = attackerX + targetX * cmd->interpolatePercent / 100; + sprite->y = attackerY + targetY * cmd->interpolatePercent / 100; + sprite->x2 = cmd->offsetX; + sprite->y2 = cmd->offsetY; + sprite->subpriority = cmd->subpriorityM30 + 30; + StartSpriteAnim(sprite, cmd->animation); + sprite->data[2] = cmd->duration; sprite->callback = AnimRootFlickerOut; sFrenzyPlantRootData.startX = sprite->x; sFrenzyPlantRootData.startY = sprite->y; @@ -2962,20 +2924,17 @@ static void AnimRootFlickerOut(struct Sprite *sprite) } // Moves an orb in a fast wavy path. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: horizontal velocity -// arg 3: wave amplitude -// arg 4: duration static void AnimIngrainOrb(struct Sprite *sprite) { + CMD_ARGS(initialX, initialY, velocityX, waveAmplitude, duration); + if (!sprite->data[0]) { - sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; - sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1]; - sprite->data[1] = gBattleAnimArgs[2]; - sprite->data[2] = gBattleAnimArgs[3]; - sprite->data[3] = gBattleAnimArgs[4]; + sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + cmd->initialX; + sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + cmd->initialY; + sprite->data[1] = cmd->velocityX; + sprite->data[2] = cmd->waveAmplitude; + sprite->data[3] = cmd->duration; } sprite->data[0]++; @@ -3056,6 +3015,8 @@ static void AnimItemSteal_Step1(struct Sprite *sprite) static void AnimPresent(struct Sprite *sprite) { + CMD_ARGS(initialX, initialY, unk2, unk3, unk4); + s16 targetX; s16 targetY; InitSpritePosToAnimAttacker(sprite, FALSE); @@ -3125,16 +3086,14 @@ static void AnimKnockOffItem(struct Sprite *sprite) } // Animates a heal particle upward. -// arg 0: initial x pixel offset -// arg 1: initial y pixel offset -// arg 2: vertical velocity -// arg 3: unused static void AnimPresentHealParticle(struct Sprite *sprite) { + CMD_ARGS(initialX, initialY, velocityY, unused3); + if (!sprite->data[0]) { InitSpritePosToAnimTarget(sprite, FALSE); - sprite->data[1] = gBattleAnimArgs[2]; + sprite->data[1] = cmd->velocityY; } sprite->data[0]++; @@ -3145,6 +3104,8 @@ static void AnimPresentHealParticle(struct Sprite *sprite) static void AnimItemSteal(struct Sprite *sprite) { + CMD_ARGS(initialX, initialY); + s16 attackerX; s16 attackerY; InitSpritePosToAnimTarget(sprite, FALSE); @@ -3192,10 +3153,10 @@ static void AnimItemSteal_Step3(struct Sprite *sprite) } // Moves a bag in a circular motion. -// arg 0: y position -// arg 1: initial wave offset static void AnimTrickBag(struct Sprite *sprite) { + CMD_ARGS(initialY, waveOffset); + int a; int b; @@ -3203,14 +3164,14 @@ static void AnimTrickBag(struct Sprite *sprite) { if (!IsContest()) { - sprite->data[1] = gBattleAnimArgs[1]; + sprite->data[1] = cmd->waveOffset; sprite->x = 120; } else { - a = gBattleAnimArgs[1] - 32; + a = cmd->waveOffset - 32; if (a < 0) - b = gBattleAnimArgs[1] + 0xDF; + b = cmd->waveOffset + 0xDF; else b = a; @@ -3218,8 +3179,8 @@ static void AnimTrickBag(struct Sprite *sprite) sprite->x = 70; } - sprite->y = gBattleAnimArgs[0]; - sprite->data[2] = gBattleAnimArgs[0]; + sprite->y = cmd->initialY; + sprite->data[2] = cmd->initialY; sprite->data[4] = 20; sprite->x2 = Cos(sprite->data[1], 60); sprite->y2 = Sin(sprite->data[1], 20); @@ -3564,8 +3525,14 @@ static void AnimTask_LeafBlade_Step2_Callback(struct Sprite *sprite) static void AnimFlyingParticle(struct Sprite *sprite) { + // unk6 chooses an anchor? + // unk3 is probably some sort of y offset relative to the center of + // the screen? + // unk5 is some kind of mode. it affects priority and y. + CMD_ARGS(unk0, unk1, unk2, unk3, unk4, unk5, unk6); + u8 battler; - if (!gBattleAnimArgs[6]) + if (!cmd->unk6) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; @@ -3573,35 +3540,35 @@ static void AnimFlyingParticle(struct Sprite *sprite) if (GetBattlerSide(battler) != B_SIDE_PLAYER) { sprite->data[4] = 0; - sprite->data[2] = gBattleAnimArgs[3]; + sprite->data[2] = cmd->unk3; sprite->x = -16; } else { sprite->data[4] = 1; - sprite->data[2] = -gBattleAnimArgs[3]; + sprite->data[2] = -cmd->unk3; sprite->x = DISPLAY_WIDTH + 16; } - sprite->data[1] = gBattleAnimArgs[1]; - sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[3] = gBattleAnimArgs[4]; - switch (gBattleAnimArgs[5]) + sprite->data[1] = cmd->unk1; + sprite->data[0] = cmd->unk2; + sprite->data[3] = cmd->unk4; + switch (cmd->unk5) { case 0: - sprite->y = gBattleAnimArgs[0]; + sprite->y = cmd->unk0; sprite->oam.priority = GetBattlerSpriteBGPriority(battler); break; case 1: - sprite->y = gBattleAnimArgs[0]; + sprite->y = cmd->unk0; sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1; break; case 2: - sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[0]; + sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + cmd->unk0; sprite->oam.priority = GetBattlerSpriteBGPriority(battler); break; case 3: - sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[0]; + sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->unk0; GetAnimBattlerSpriteId(ANIM_TARGET); sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1; break; @@ -3657,25 +3624,28 @@ void AnimTask_CycleMagicalLeafPal(u8 taskId) break; } + // TODO: gBattleAnimArgs[ARG_RET_ID]? if (gBattleAnimArgs[7] == -1) DestroyAnimVisualTask(taskId); } static void AnimNeedleArmSpike(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1, unk2, unk3, unk4); + u8 a; u8 b; u16 c; u16 x; u16 y; - if (gBattleAnimArgs[4] == 0) + if (cmd->unk4 == 0) { DestroyAnimSprite(sprite); } else { - if (gBattleAnimArgs[0] == 0) + if (cmd->unk0 == 0) { a = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); b = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); @@ -3686,11 +3656,11 @@ static void AnimNeedleArmSpike(struct Sprite *sprite) b = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); } - sprite->data[0] = gBattleAnimArgs[4]; - if (gBattleAnimArgs[1] == 0) + sprite->data[0] = cmd->unk4; + if (cmd->unk1 == 0) { - sprite->x = gBattleAnimArgs[2] + a; - sprite->y = gBattleAnimArgs[3] + b; + sprite->x = cmd->unk2 + a; + sprite->y = cmd->unk3 + b; sprite->data[5] = a; sprite->data[6] = b; } @@ -3698,16 +3668,16 @@ static void AnimNeedleArmSpike(struct Sprite *sprite) { sprite->x = a; sprite->y = b; - sprite->data[5] = gBattleAnimArgs[2] + a; - sprite->data[6] = gBattleAnimArgs[3] + b; + sprite->data[5] = cmd->unk2 + a; + sprite->data[6] = cmd->unk3 + b; } x = sprite->x; sprite->data[1] = x * 16; y = sprite->y; sprite->data[2] = y * 16; - sprite->data[3] = (sprite->data[5] - sprite->x) * 16 / gBattleAnimArgs[4]; - sprite->data[4] = (sprite->data[6] - sprite->y) * 16 / gBattleAnimArgs[4]; + sprite->data[3] = (sprite->data[5] - sprite->x) * 16 / cmd->unk4; + sprite->data[4] = (sprite->data[6] - sprite->y) * 16 / cmd->unk4; c = ArcTan2Neg(sprite->data[5] - x, sprite->data[6] - y); if (IsContest()) c -= 0x8000; @@ -3741,15 +3711,17 @@ static void AnimWhipHit_WaitEnd(struct Sprite *sprite) static void AnimSlidingHit(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1); + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { - sprite->x -= gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; + sprite->x -= cmd->unk0; + sprite->y += cmd->unk1; } else { - sprite->x += gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; + sprite->x += cmd->unk0; + sprite->y += cmd->unk1; } sprite->callback = RunStoredCallbackWhenAnimEnds; @@ -3758,23 +3730,27 @@ static void AnimSlidingHit(struct Sprite *sprite) static void AnimWhipHit(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1); + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) StartSpriteAnim(sprite, 1); sprite->callback = AnimWhipHit_WaitEnd; - SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); - sprite->y += gBattleAnimArgs[1]; + SetAnimSpriteInitialXOffset(sprite, cmd->unk0); + sprite->y += cmd->unk1; } static void AnimFlickeringPunch(struct Sprite *sprite) { - sprite->x += gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; - sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[1] = gBattleAnimArgs[3]; - sprite->data[3] = gBattleAnimArgs[4]; - sprite->data[5] = gBattleAnimArgs[5]; - StartSpriteAffineAnim(sprite, gBattleAnimArgs[6]); + CMD_ARGS(unk0, unk1, unk2, unk3, unk4, unk5, unk6); + + sprite->x += cmd->unk0; + sprite->y += cmd->unk1; + sprite->data[0] = cmd->unk2; + sprite->data[1] = cmd->unk3; + sprite->data[3] = cmd->unk4; + sprite->data[5] = cmd->unk5; + StartSpriteAffineAnim(sprite, cmd->unk6); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = TranslateSpriteLinearAndFlicker; } @@ -3786,34 +3762,38 @@ static void AnimFlickeringPunch(struct Sprite *sprite) // arg 2: slice direction; 0 = right-to-left, 1 = left-to-right static void AnimCuttingSlice(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1, unk2); + sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) sprite->y += 8; sprite->callback = AnimSlice_Step; - if (gBattleAnimArgs[2] == 0) + if (cmd->unk2 == 0) { - sprite->x += gBattleAnimArgs[0]; + sprite->x += cmd->unk0; } else { - sprite->x -= gBattleAnimArgs[0]; + sprite->x -= cmd->unk0; sprite->hFlip = 1; } - sprite->y += gBattleAnimArgs[1]; + sprite->y += cmd->unk1; sprite->data[1] -= 0x400; sprite->data[2] += 0x400; - sprite->data[5] = gBattleAnimArgs[2]; + sprite->data[5] = cmd->unk2; if (sprite->data[5] == 1) sprite->data[1] = -sprite->data[1]; } static void AnimAirCutterSlice(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1, unk2, unk3); + u8 x, y; - switch (gBattleAnimArgs[3]) + switch (cmd->unk3) { case 1: x = GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X); @@ -3841,20 +3821,20 @@ static void AnimAirCutterSlice(struct Sprite *sprite) sprite->y += 8; sprite->callback = AnimSlice_Step; - if (gBattleAnimArgs[2] == 0) + if (cmd->unk2 == 0) { - sprite->x += gBattleAnimArgs[0]; + sprite->x += cmd->unk0; } else { - sprite->x -= gBattleAnimArgs[0]; + sprite->x -= cmd->unk0; sprite->hFlip = 1; } - sprite->y += gBattleAnimArgs[1]; + sprite->y += cmd->unk1; sprite->data[1] -= 0x400; sprite->data[2] += 0x400; - sprite->data[5] = gBattleAnimArgs[2]; + sprite->data[5] = cmd->unk2; if (sprite->data[5] == 1) sprite->data[1] = -sprite->data[1]; } @@ -3915,16 +3895,18 @@ static void UNUSED UnusedFlickerAnim(struct Sprite *sprite) static void AnimCirclingMusicNote(struct Sprite *sprite) { - sprite->data[0] = gBattleAnimArgs[2]; - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - sprite->x -= gBattleAnimArgs[0]; - else - sprite->x += gBattleAnimArgs[0]; + CMD_ARGS(unk0, unk1, unk2, unk3, unk4, unk5); - StartSpriteAnim(sprite, gBattleAnimArgs[5]); - sprite->data[1] = -gBattleAnimArgs[3]; - sprite->y += gBattleAnimArgs[1]; - sprite->data[3] = gBattleAnimArgs[4]; + sprite->data[0] = cmd->unk2; + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + sprite->x -= cmd->unk0; + else + sprite->x += cmd->unk0; + + StartSpriteAnim(sprite, cmd->unk5); + sprite->data[1] = -cmd->unk3; + sprite->y += cmd->unk1; + sprite->data[3] = cmd->unk4; sprite->callback = AnimCirclingMusicNote_Step; sprite->callback(sprite); } @@ -3948,17 +3930,19 @@ static void AnimCirclingMusicNote_Step(struct Sprite *sprite) static void AnimProtect(struct Sprite *sprite) { - if (IsContest()) - gBattleAnimArgs[1] += 8; + CMD_ARGS(unk0, unk1, unk2); - sprite->x = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0]; - sprite->y = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1]; + if (IsContest()) + cmd->unk1 += 8; + + sprite->x = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X) + cmd->unk0; + sprite->y = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y) + cmd->unk1; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest()) sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker) + 1; else sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); - sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[0] = cmd->unk2; sprite->data[2] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(ANIM_TAG_PROTECT)); sprite->data[7] = 16; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); @@ -4123,67 +4107,73 @@ static void AnimMilkBottle_Step2(struct Sprite *sprite, int unk1, int unk2) static void AnimGrantingStars(struct Sprite *sprite) { - if (!gBattleAnimArgs[2]) + CMD_ARGS(unk0, unk1, unk2, unk3, unk4, unk5); + + if (!cmd->unk2) SetSpriteCoordsToAnimAttackerCoords(sprite); - SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); - sprite->y += gBattleAnimArgs[1]; - sprite->data[0] = gBattleAnimArgs[5]; - sprite->data[1] = gBattleAnimArgs[3]; - sprite->data[2] = gBattleAnimArgs[4]; + SetAnimSpriteInitialXOffset(sprite, cmd->unk0); + sprite->y += cmd->unk1; + sprite->data[0] = cmd->unk5; + sprite->data[1] = cmd->unk3; + sprite->data[2] = cmd->unk4; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = TranslateSpriteLinearFixedPoint; } static void AnimSparklingStars(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1, unk2, unk3, unk4, unk5, unk6); + u8 battler; - if (!gBattleAnimArgs[2]) + if (!cmd->unk2) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; if (IsDoubleBattle() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler))) { - SetAverageBattlerPositions(battler, gBattleAnimArgs[6], &sprite->x, &sprite->y); - SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); - sprite->y += gBattleAnimArgs[1]; + SetAverageBattlerPositions(battler, cmd->unk6, &sprite->x, &sprite->y); + SetAnimSpriteInitialXOffset(sprite, cmd->unk0); + sprite->y += cmd->unk1; } else { - if (!gBattleAnimArgs[6]) + if (!cmd->unk6) { sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X); - sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y) + gBattleAnimArgs[1]; + sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y) + cmd->unk1; } else { sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2); - sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; + sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + cmd->unk1; } - SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); + SetAnimSpriteInitialXOffset(sprite, cmd->unk0); } - sprite->data[0] = gBattleAnimArgs[5]; - sprite->data[1] = gBattleAnimArgs[3]; - sprite->data[2] = gBattleAnimArgs[4]; + sprite->data[0] = cmd->unk5; + sprite->data[1] = cmd->unk3; + sprite->data[2] = cmd->unk4; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = TranslateSpriteLinearFixedPoint; } static void AnimBubbleBurst(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1); + SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { - sprite->x += gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; + sprite->x += cmd->unk0; + sprite->y += cmd->unk1; } else { - sprite->x -= gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; + sprite->x -= cmd->unk0; + sprite->y += cmd->unk1; StartSpriteAnim(sprite, 1); } @@ -4205,17 +4195,19 @@ static void AnimBubbleBurst_Step(struct Sprite *sprite) static void AnimSleepLetterZ(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1); + SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { - sprite->x += gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; + sprite->x += cmd->unk0; + sprite->y += cmd->unk1; sprite->data[3] = 1; } else { - sprite->x -= gBattleAnimArgs[0]; - sprite->y += gBattleAnimArgs[1]; + sprite->x -= cmd->unk0; + sprite->y += cmd->unk1; sprite->data[3] = 0xFFFF; StartSpriteAffineAnim(sprite, 1); } @@ -4358,6 +4350,7 @@ static void AnimLockOnTarget_Step4(struct Sprite *sprite) static void AnimLockOnTarget_Step5(struct Sprite *sprite) { + // TODO: gBattleAnimArgs[ARG_RET_ID]? if ((u16)gBattleAnimArgs[7] == 0xFFFF) { sprite->data[1] = 0; @@ -4381,7 +4374,9 @@ static void AnimLockOnTarget_Step6(struct Sprite *sprite) static void AnimLockOnMoveTarget(struct Sprite *sprite) { - sprite->oam.affineParam = gBattleAnimArgs[0]; + CMD_ARGS(unk0); + + sprite->oam.affineParam = cmd->unk0; if ((s16)sprite->oam.affineParam == 1) { sprite->x -= 0x18; @@ -4413,9 +4408,11 @@ static void AnimLockOnMoveTarget(struct Sprite *sprite) static void AnimBowMon(struct Sprite *sprite) { + CMD_ARGS(unk0); + sprite->invisible = TRUE; sprite->data[0] = 0; - switch (gBattleAnimArgs[0]) + switch (cmd->unk0) { case 0: sprite->callback = AnimBowMon_Step1; @@ -4559,13 +4556,15 @@ static void AnimTipMon_Step(struct Sprite *sprite) void AnimTask_SkullBashPosition(u8 taskId) { + CMD_ARGS(unk0); + u8 side; gTasks[taskId].data[0] = gBattlerSpriteIds[gBattleAnimAttacker]; side = GetBattlerSide(gBattleAnimAttacker); gTasks[taskId].data[1] = side; gTasks[taskId].data[2] = 0; - switch (gBattleAnimArgs[0]) + switch (cmd->unk0) { default: DestroyAnimVisualTask(taskId); @@ -4705,15 +4704,17 @@ static void AnimTask_SkullBashPositionReset(u8 taskId) static void AnimSlashSlice(struct Sprite *sprite) { - if (gBattleAnimArgs[0] == 0) + CMD_ARGS(unk0, unk1, unk2); + + if (cmd->unk0 == 0) { - sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1]; - sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; + sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + cmd->unk1; + sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + cmd->unk2; } else { - sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[1]; - sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; + sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->unk1; + sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->unk2; } sprite->data[0] = 0; @@ -4732,7 +4733,9 @@ static void AnimFalseSwipeSlice(struct Sprite *sprite) static void AnimFalseSwipePositionedSlice(struct Sprite *sprite) { - sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) - 48 + gBattleAnimArgs[0]; + CMD_ARGS(unk0); + + sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) - 48 + cmd->unk0; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); StartSpriteAnim(sprite, 1); sprite->data[0] = 0; @@ -4772,19 +4775,21 @@ static void AnimFalseSwipeSlice_Step3(struct Sprite *sprite) static void AnimEndureEnergy(struct Sprite *sprite) { - if (gBattleAnimArgs[0] == 0) + CMD_ARGS(unk0, unk1, unk2, unk3); + + if (cmd->unk0 == 0) { - sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[1]; - sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[2]; + sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + cmd->unk1; + sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + cmd->unk2; } else { - sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[1]; - sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[2]; + sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + cmd->unk1; + sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + cmd->unk2; } sprite->data[0] = 0; - sprite->data[1] = gBattleAnimArgs[3]; + sprite->data[1] = cmd->unk3; sprite->callback = AnimEndureEnergy_Step; } @@ -4840,16 +4845,19 @@ static void AnimSharpenSphere_Step(struct Sprite *sprite) static void AnimConversion(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1); + if (sprite->data[0] == 0) { - sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0]; - sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1]; + sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + cmd->unk0; + sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + cmd->unk1; if (IsContest()) sprite->y += 10; sprite->data[0]++; } + // TODO: gBattleAnimArgs[ARG_RET_ID]? if ((u16)gBattleAnimArgs[7] == 0xFFFF) DestroyAnimSprite(sprite); } @@ -4858,6 +4866,7 @@ void AnimTask_ConversionAlphaBlend(u8 taskId) { if (gTasks[taskId].data[2] == 1) { + // TODO: gBattleAnimArgs[ARG_RET_ID]? gBattleAnimArgs[7] = 0xFFFF; gTasks[taskId].data[2]++; } @@ -4880,9 +4889,11 @@ void AnimTask_ConversionAlphaBlend(u8 taskId) static void AnimConversion2(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1, unk2); + InitSpritePosToAnimTarget(sprite, FALSE); sprite->animPaused = 1; - sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[0] = cmd->unk2; sprite->callback = AnimConversion2_Step; } @@ -4917,13 +4928,15 @@ void AnimTask_Conversion2AlphaBlend(u8 taskId) static void UNUSED AnimTask_HideBattlersHealthbox(u8 taskId) { + CMD_ARGS(unk0, unk1); + u8 i; for (i = 0; i < gBattlersCount; i++) { - if (gBattleAnimArgs[0] == TRUE && GetBattlerSide(i) == B_SIDE_PLAYER) + if (cmd->unk0 == TRUE && GetBattlerSide(i) == B_SIDE_PLAYER) SetHealthboxSpriteInvisible(gHealthboxSpriteIds[i]); - if (gBattleAnimArgs[1] == TRUE && GetBattlerSide(i) == B_SIDE_OPPONENT) + if (cmd->unk1 == TRUE && GetBattlerSide(i) == B_SIDE_OPPONENT) SetHealthboxSpriteInvisible(gHealthboxSpriteIds[i]); } @@ -4941,6 +4954,8 @@ static void UNUSED AnimTask_ShowBattlersHealthbox(u8 taskId) static void AnimMoon(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1); + if (IsContest()) { sprite->x = 48; @@ -4948,8 +4963,8 @@ static void AnimMoon(struct Sprite *sprite) } else { - sprite->x = gBattleAnimArgs[0]; - sprite->y = gBattleAnimArgs[1]; + sprite->x = cmd->unk0; + sprite->y = cmd->unk1; } sprite->oam.shape = SPRITE_SHAPE(64x64); @@ -4966,8 +4981,10 @@ static void AnimMoon_Step(struct Sprite *sprite) static void AnimMoonlightSparkle(struct Sprite *sprite) { - sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; - sprite->y = gBattleAnimArgs[1]; + CMD_ARGS(unk0, unk1); + + sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + cmd->unk0; + sprite->y = cmd->unk1; sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2] = 0; @@ -5099,16 +5116,18 @@ static void AnimTask_MoonlightEndFade_Step(u8 taskId) static void AnimHornHit(struct Sprite *sprite) { - if (gBattleAnimArgs[2] < 2) - gBattleAnimArgs[2] = 2; + CMD_ARGS(unk0, unk1, unk2); - if (gBattleAnimArgs[2] > 0x7F) - gBattleAnimArgs[2] = 0x7F; + if (cmd->unk2 < 2) + cmd->unk2 = 2; + + if (cmd->unk2 > 0x7F) + cmd->unk2 = 0x7F; sprite->data[0] = 0; - sprite->data[1] = gBattleAnimArgs[2]; - sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; - sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; + sprite->data[1] = cmd->unk2; + sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->unk0; + sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->unk1; sprite->data[6] = sprite->x; sprite->data[7] = sprite->y; if (IsContest()) @@ -5286,16 +5305,18 @@ void AnimTask_MusicNotesClearRainbowBlend(u8 taskId) static void AnimWavyMusicNotes(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1, unk2); + u8 index; u8 x, y; SetSpriteCoordsToAnimAttackerCoords(sprite); - StartSpriteAnim(sprite, gBattleAnimArgs[0]); - if ((index = IndexOfSpritePaletteTag(gParticlesColorBlendTable[gBattleAnimArgs[1]][0])) != 0xFF) + StartSpriteAnim(sprite, cmd->unk0); + if ((index = IndexOfSpritePaletteTag(gParticlesColorBlendTable[cmd->unk1][0])) != 0xFF) sprite->oam.paletteNum = index; - sprite->sBlendTableIdx = gBattleAnimArgs[1]; + sprite->sBlendTableIdx = cmd->unk1; sprite->sBlendTimer = 0; - sprite->sBlendCycleTime = gBattleAnimArgs[2]; + sprite->sBlendCycleTime = cmd->unk2; if (IsContest()) { x = 48; @@ -5364,18 +5385,20 @@ static void AnimWavyMusicNotes_Step(struct Sprite *sprite) static void AnimFlyingMusicNotes(struct Sprite *sprite) { - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) - gBattleAnimArgs[1] *= -1; + CMD_ARGS(unk0, unk1, unk2); - sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1]; - sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; - StartSpriteAnim(sprite, gBattleAnimArgs[0]); + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) + cmd->unk1 *= -1; + + sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + cmd->unk1; + sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + cmd->unk2; + StartSpriteAnim(sprite, cmd->unk0); sprite->data[2] = 0; sprite->data[3] = 0; sprite->data[4] = sprite->x << 4; sprite->data[5] = sprite->y << 4; - sprite->data[6] = (gBattleAnimArgs[1] << 4) / 5; - sprite->data[7] = (gBattleAnimArgs[2] << 7) / 5; + sprite->data[6] = (cmd->unk1 << 4) / 5; + sprite->data[7] = (cmd->unk2 << 7) / 5; sprite->callback = AnimFlyingMusicNotes_Step; } @@ -5400,8 +5423,10 @@ static void AnimFlyingMusicNotes_Step(struct Sprite *sprite) static void AnimBellyDrumHand(struct Sprite *sprite) { + CMD_ARGS(unk0); + s16 a; - if (gBattleAnimArgs[0] == 1) + if (cmd->unk0 == 1) { sprite->oam.matrixNum = ST_OAM_HFLIP; a = 16; @@ -5420,23 +5445,25 @@ static void AnimBellyDrumHand(struct Sprite *sprite) void AnimSlowFlyingMusicNotes(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1, unk2, unk3); + s16 xDiff; u8 index; SetSpriteCoordsToAnimAttackerCoords(sprite); sprite->y += 8; - StartSpriteAnim(sprite, gBattleAnimArgs[1]); - index = IndexOfSpritePaletteTag(gParticlesColorBlendTable[gBattleAnimArgs[2]][0]); + StartSpriteAnim(sprite, cmd->unk1); + index = IndexOfSpritePaletteTag(gParticlesColorBlendTable[cmd->unk2][0]); if (index != 0xFF) sprite->oam.paletteNum = index; - xDiff = (gBattleAnimArgs[0] == 0) ? -32 : 32; + xDiff = (cmd->unk0 == 0) ? -32 : 32; sprite->data[0] = 40; sprite->data[1] = sprite->x; sprite->data[2] = xDiff + sprite->data[1]; sprite->data[3] = sprite->y; sprite->data[4] = sprite->data[3] - 40; InitAnimLinearTranslation(sprite); - sprite->data[5] = gBattleAnimArgs[3]; + sprite->data[5] = cmd->unk3; sprite->callback = AnimSlowFlyingMusicNotes_Step; } @@ -5471,16 +5498,18 @@ void SetSpriteNextToMonHead(u8 battler, struct Sprite *sprite) static void AnimThoughtBubble(struct Sprite *sprite) { + CMD_ARGS(unk0, unk1); + u8 animNum; u8 battler; - if (gBattleAnimArgs[0] == 0) + if (cmd->unk0 == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; SetSpriteNextToMonHead(battler, sprite); animNum = (GetBattlerSide(battler) == B_SIDE_PLAYER) ? 0 : 1; - sprite->data[0] = gBattleAnimArgs[1]; + sprite->data[0] = cmd->unk1; sprite->data[1] = animNum + 2; StartSpriteAnim(sprite, animNum); StoreSpriteCallbackInData6(sprite, AnimThoughtBubble_Step); @@ -5499,8 +5528,10 @@ static void AnimThoughtBubble_Step(struct Sprite *sprite) static void AnimMetronomeFinger(struct Sprite *sprite) { + CMD_ARGS(unk0); + u8 battler; - if (gBattleAnimArgs[0] == 0) + if (cmd->unk0 == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; @@ -5523,8 +5554,10 @@ static void AnimMetronomeFinger_Step(struct Sprite *sprite) static void AnimFollowMeFinger(struct Sprite *sprite) { + CMD_ARGS(unk0); + u8 battler; - if (gBattleAnimArgs[0] == 0) + if (cmd->unk0 == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; @@ -5581,8 +5614,10 @@ static void AnimFollowMeFinger_Step2(struct Sprite *sprite) static void AnimTauntFinger(struct Sprite *sprite) { + CMD_ARGS(unk0); + u8 battler; - if (gBattleAnimArgs[0] == 0) + if (cmd->unk0 == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; From f9c826ca576395d1960fd7b5a0e84007e8411573 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Tue, 20 Jan 2026 12:13:48 +0100 Subject: [PATCH 06/36] Merge pull request #2228 from hedara90/fix-spaces Fix spaces instead of tabs in battle_anim_scripts.s --- data/battle_anim_scripts.s | 62 +++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 409e2d60ff..884360034c 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1452,7 +1452,7 @@ FuryCutterStrong: complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=3, color1=RGB(9, 8, 10), blend_y1=4, color2=RGB_BLACK, blend_y2=0 goto FuryCutterContinue2 FuryCutterStrongest: - complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=3, color1=RGB(9, 8, 10), blend_y1=4, color2=RGB_BLACK, blend_y2=0 + complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=3, color1=RGB(9, 8, 10), blend_y1=4, color2=RGB_BLACK, blend_y2=0 goto FuryCutterContinue2 Move_SELF_DESTRUCT: @@ -2054,7 +2054,7 @@ Move_CONFUSE_RAY: fadetobg BG_GHOST waitbgfadein createvisualtask SoundTask_AdjustPanningVar, 2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0 - blend_color_cyclebytag tag=ANIM_TAG_YELLOW_BALL, delay=0, num_blends=6, initial_blend_y=0, target_blend_y=14, color=RGB(31, 10, 0) + blend_color_cyclebytag tag=ANIM_TAG_YELLOW_BALL, delay=0, num_blends=6, initial_blend_y=0, target_blend_y=14, color=RGB(31, 10, 0) createsprite gConfuseRayBallBounceSpriteTemplate, ANIM_TARGET, 2, 28, 0, 288 waitforvisualfinish setalpha 8, 8 @@ -2097,7 +2097,7 @@ Move_MEAN_LOOK: Move_ROCK_THROW: loadspritegfx ANIM_TAG_ROCKS - shake_mon_or_platform unused_anim_battler=ANIM_TARGET, velocity=6, shake_timer=1, shake_duration=15, type=SHAKE_BG_Y + shake_mon_or_platform unused_anim_battler=ANIM_TARGET, velocity=6, shake_timer=1, shake_duration=15, type=SHAKE_BG_Y createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 0, 1, 0, 0 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 6 @@ -2119,7 +2119,7 @@ Move_ROCK_THROW: Move_ROCK_SLIDE: loadspritegfx ANIM_TAG_ROCKS monbg ANIM_DEF_PARTNER - shake_mon_or_platform velocity=7, shake_timer=1, shake_duration=11, type=SHAKE_BG_Y + shake_mon_or_platform velocity=7, shake_timer=1, shake_duration=11, type=SHAKE_BG_Y createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -5, 1, -5, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 @@ -2909,7 +2909,7 @@ Move_BARRAGE: createvisualtask AnimTask_BarrageBall, 3 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER delay 24 - shake_mon_or_platform velocity=8, shake_timer=1, shake_duration=40, type=SHAKE_BG_Y + shake_mon_or_platform velocity=8, shake_timer=1, shake_duration=40, type=SHAKE_BG_Y createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 0, 4, 20, 1 createvisualtask AnimTask_ShakeMon, 3, ANIM_DEF_PARTNER, 0, 4, 20, 1 loopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 8, 2 @@ -3660,7 +3660,7 @@ Move_SUPERPOWER: createsprite gSuperpowerOrbSpriteTemplate, ANIM_TARGET, 2, ANIM_ATTACKER playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER delay 20 - shake_mon_or_platform velocity=4, shake_timer=1, shake_duration=180, type=SHAKE_BG_Y + shake_mon_or_platform velocity=4, shake_timer=1, shake_duration=180, type=SHAKE_BG_Y createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_EARTHQUAKE, 0 delay 40 createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 200, 96, 1, 120 @@ -4769,7 +4769,7 @@ Move_THUNDER: waitbgfadein simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK delay 16 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, -36 @@ -4786,7 +4786,7 @@ Move_THUNDER: createsprite gLightningSpriteTemplate, ANIM_TARGET, 6, -16, 16 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET delay 5 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 24, -32 delay 1 @@ -4794,9 +4794,9 @@ Move_THUNDER: delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 24, 16 delay 30 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 5 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -32 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET @@ -4805,11 +4805,11 @@ Move_THUNDER: delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 10 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 createvisualtask AnimTask_ShakeTargetInPattern, 2, 30, 3, TRUE, 0 delay 2 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 simple_palette_blend unused_anim_battler=ANIM_TARGET, selector=F_PAL_BG, delay=2, initial_blend_y=16, target_blend_y=0, color=RGB_BLACK waitforvisualfinish @@ -4831,7 +4831,7 @@ Move_THUNDER_PUNCH: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 delay 1 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48 delay 1 @@ -4840,7 +4840,7 @@ Move_THUNDER_PUNCH: createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, 16 delay 1 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 @@ -4868,12 +4868,12 @@ Move_SACRED_FIRE: delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 20, 10, 50, 5, 1, 1 delay 1 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 50, 5, 0, 1 delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -20, 10, 50, 5, -1, 1 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 waitforvisualfinish playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET @@ -4885,10 +4885,10 @@ Move_SACRED_FIRE: playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createsprite gLargeFlameSpriteTemplate, ANIM_TARGET, 2, 16, 0, 80, 16, 0, 1 delay 1 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 waitforvisualfinish - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 1 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 0 @@ -5011,7 +5011,7 @@ SnoreEffect: playsewithpan SE_M_SNORE, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 7, ANIM_ATTACKER, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 7, 1 - shake_mon_or_platform velocity=6, shake_timer=1, shake_duration=14, type=SHAKE_BG_X, battler_selector=SHAKE_MON_ATTACKER + shake_mon_or_platform velocity=6, shake_timer=1, shake_duration=14, type=SHAKE_BG_X, battler_selector=SHAKE_MON_ATTACKER createsprite gSnoreZSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -42, -38, 24, 0, 0 createsprite gSnoreZSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, -42, 24, 0, 0 createsprite gSnoreZSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 42, -38, 24, 0, 0 @@ -6871,7 +6871,7 @@ Move_ANCIENT_POWER: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 - shake_mon_or_platform velocity=4, shake_timer=1, shake_duration=10, type=SHAKE_BG_Y + shake_mon_or_platform velocity=4, shake_timer=1, shake_duration=10, type=SHAKE_BG_Y createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 20, 32, -48, 50, 2 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, -38, 25, 5 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 32, 32, -28, 40, 3 @@ -7265,7 +7265,7 @@ Move_POISON_TAIL: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_POISON_BUBBLE loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 - metallic_shine permanent=TRUE, color=RGB(24, 6, 23) + metallic_shine permanent=TRUE, color=RGB(24, 6, 23) waitforvisualfinish monbg ANIM_TARGET setalpha 12, 8 @@ -7292,14 +7292,14 @@ Move_METAL_CLAW: playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET create_claw_slash_sprite ANIM_TARGET, 2, x=-10, y=-10, animation=0 create_claw_slash_sprite ANIM_TARGET, 2, x=-10, y=10, animation=0 - shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET + shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET delay 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET create_claw_slash_sprite ANIM_TARGET, 2, x=10, y=-10, animation=1 create_claw_slash_sprite ANIM_TARGET, 2, x=10, y=10, animation=1 - shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET + shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET waitforvisualfinish end @@ -8049,7 +8049,7 @@ Move_TRI_ATTACK: createvisualtask AnimTask_ShakeTargetInPattern, 2, 20, 3, TRUE, 1 waitforvisualfinish loadspritegfx ANIM_TAG_LIGHTNING - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48 delay 1 @@ -8059,7 +8059,7 @@ Move_TRI_ATTACK: delay 20 createvisualtask AnimTask_ShakeTargetInPattern, 2, 20, 3, TRUE, 0 delay 2 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE waitforvisualfinish loadspritegfx ANIM_TAG_ICE_CRYSTALS call IceCrystalEffectShort @@ -8637,7 +8637,7 @@ Move_DRAGON_CLAW: createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_RAZOR_WIND, SOUND_PAN_TARGET create_claw_slash_sprite ANIM_TARGET, 2, x=-10, y=-10, animation=0 create_claw_slash_sprite ANIM_TARGET, 2, x=-10, y=10, animation=0 - shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET + shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 480, 20, 16, -46, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 576, 20, 8, 42, ANIM_ATTACKER @@ -8650,7 +8650,7 @@ Move_DRAGON_CLAW: createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_RAZOR_WIND, SOUND_PAN_TARGET create_claw_slash_sprite ANIM_TARGET, 2, x=10, y=-10, animation=1 create_claw_slash_sprite ANIM_TARGET, 2, x=10, y=10, animation=1 - shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET + shake_mon_or_platform velocity=-4, shake_timer=1, shake_duration=10, type=SHAKE_MON_Y, battler_selector=SHAKE_MON_TARGET createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 464, 30, 15, -50, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 528, 30, 13, 50, ANIM_ATTACKER @@ -9102,7 +9102,7 @@ Move_BLAST_BURN: createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 40, 20, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -40, 20, 24, 0, 0, 0 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 25 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -96, 0, 24, 0, 0, 0 @@ -9116,7 +9116,7 @@ Move_BLAST_BURN: createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 60, 30, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 48, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -60, 30, 24, 0, 0, 0 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -9368,7 +9368,7 @@ Move_HYDRO_CANNON: playsewithpan SE_M_SURF, SOUND_PAN_ATTACKER createsprite gHydroCannonChargeSpriteTemplate, ANIM_TARGET, 2 delay 10 - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE delay 30 panse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 call HydroCannonBeam @@ -9385,7 +9385,7 @@ Move_HYDRO_CANNON: call HydroCannonBeam createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 waitforvisualfinish - invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE + invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff From c468c9a5f70ed53b517b84d836843730b27294b4 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Tue, 27 Jan 2026 14:17:26 +0100 Subject: [PATCH 07/36] Fix substitute follower appearing with dead party (#9028) --- src/event_object_movement.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 848289aec7..188f4dc742 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1971,7 +1971,11 @@ struct Pokemon *GetFirstLiveMon(void) for (i = 0; i < PARTY_SIZE; i++) { struct Pokemon *mon = &gPlayerParty[i]; - if ((OW_FOLLOWERS_ALLOWED_SPECIES && GetMonData(mon, MON_DATA_SPECIES_OR_EGG) != VarGet(OW_FOLLOWERS_ALLOWED_SPECIES)) + u32 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); + if (species == SPECIES_NONE) + continue; + + if ((OW_FOLLOWERS_ALLOWED_SPECIES && species != VarGet(OW_FOLLOWERS_ALLOWED_SPECIES)) || (OW_FOLLOWERS_ALLOWED_MET_LVL && GetMonData(mon, MON_DATA_MET_LEVEL) != VarGet(OW_FOLLOWERS_ALLOWED_MET_LVL)) || (OW_FOLLOWERS_ALLOWED_MET_LOC && GetMonData(mon, MON_DATA_MET_LOCATION) != VarGet(OW_FOLLOWERS_ALLOWED_MET_LOC))) continue; From e0fb60ba093fcf444a0d8fe68023a351d05523b0 Mon Sep 17 00:00:00 2001 From: GGbond Date: Tue, 27 Jan 2026 22:39:59 +0800 Subject: [PATCH 08/36] Fix Synchronoise typeless behavior in Gen7+ (#9031) --- src/battle_util.c | 18 ++++++----- test/battle/move_effect/synchronoise.c | 42 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index c209573d30..f14aed2674 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9409,19 +9409,23 @@ bool32 TryBattleFormChange(u32 battler, enum FormChanges method) bool32 DoBattlersShareType(u32 battler1, u32 battler2) { s32 i; + s32 j; enum Type types1[3], types2[3]; GetBattlerTypes(battler1, FALSE, types1); GetBattlerTypes(battler2, FALSE, types2); - if (types1[2] == TYPE_MYSTERY) - types1[2] = types1[0]; - if (types2[2] == TYPE_MYSTERY) - types2[2] = types2[0]; - for (i = 0; i < 3; i++) { - if (types1[i] == types2[0] || types1[i] == types2[1] || types1[i] == types2[2]) - return TRUE; + if (types1[i] == TYPE_MYSTERY) + continue; + + for (j = 0; j < 3; j++) + { + if (types2[j] == TYPE_MYSTERY) + continue; + if (types1[i] == types2[j]) + return TRUE; + } } return FALSE; diff --git a/test/battle/move_effect/synchronoise.c b/test/battle/move_effect/synchronoise.c index 45b4f125ea..8201f0e535 100644 --- a/test/battle/move_effect/synchronoise.c +++ b/test/battle/move_effect/synchronoise.c @@ -1,6 +1,17 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SYNCHRONOISE) == EFFECT_SYNCHRONOISE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_BULBASAUR, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_BULBASAUR, 1) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE); +} + DOUBLE_BATTLE_TEST("Synchronoise hits all Pokemon that share a type with the attacker") { GIVEN { @@ -71,4 +82,35 @@ DOUBLE_BATTLE_TEST("Synchronoise will fail if the corresponding typing mon prote } } +DOUBLE_BATTLE_TEST("Synchronoise will fail for a typeless user even if a target is typeless") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE); + PLAYER(SPECIES_ARCANINE) { Moves(MOVE_BURN_UP, MOVE_SYNCHRONOISE); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ARCANINE) { Moves(MOVE_BURN_UP, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(playerLeft, MOVE_BURN_UP, target: opponentRight); + MOVE(opponentLeft, MOVE_BURN_UP, target: playerRight); + MOVE(playerRight, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_CELEBRATE); + } + TURN { + MOVE(playerLeft, MOVE_SYNCHRONOISE); + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(playerRight, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_CELEBRATE); + } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SYNCHRONOISE, playerLeft); + MESSAGE("Arcanine used Synchronoise!"); + MESSAGE("It doesn't affect the opposing Arcanine…"); + MESSAGE("It doesn't affect Wobbuffet…"); + MESSAGE("It doesn't affect the opposing Wobbuffet…"); + NOT MESSAGE("But it failed!"); + } +} + TO_DO_BATTLE_TEST("TODO: Write Synchronoise (Move Effect) test titles") From aafc5814600d6f711eb41593996c75819e4a8e2a Mon Sep 17 00:00:00 2001 From: GGbond Date: Tue, 27 Jan 2026 22:44:42 +0800 Subject: [PATCH 09/36] Fix Psych Up wrong battler message and Gen 6+ crit ratio copying (#9015) --- data/battle_scripts_1.s | 1 + include/config/battle.h | 1 + include/constants/generational_changes.h | 1 + src/battle_script_commands.c | 10 +- test/battle/move_effect/psych_up.c | 120 ++++++++++++++++++++++- 5 files changed, 131 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7007410e15..37aa8e48b9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3767,6 +3767,7 @@ BattleScript_EffectBellyDrum:: BattleScript_EffectPsychUp:: attackcanceler + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE copyfoestats attackanimation waitanimation diff --git a/include/config/battle.h b/include/config/battle.h index 9d2814cb85..0d02e2873a 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -90,6 +90,7 @@ #define B_MINIMIZE_EVASION GEN_LATEST // In Gen5+, Minimize raises evasion by 2 stages instead of 1. #define B_GROWTH_STAT_RAISE GEN_LATEST // In Gen5+, Growth raises Attack in addition to Special Attack by 1 stage each. Under the effects of the sun, it raises them by 2 stages each instead. #define B_FOCUS_ENERGY_CRIT_RATIO GEN_LATEST // In Gen3+, Focus Energy increases critical hit ratio by 2 instead of 1. +#define B_PSYCH_UP_CRIT_RATIO GEN_LATEST // In Gen6+, Psych Up also copies the target's critical hit ratio. // Other move settings #define B_INCINERATE_GEMS GEN_LATEST // In Gen6+, Incinerate can destroy Gems. diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index ad700a6ea2..37b2b3f357 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -84,6 +84,7 @@ F(MINIMIZE_EVASION, minimizeEvasion, (u32, GEN_COUNT - 1)) \ F(GROWTH_STAT_RAISE, growthStatRaise, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ F(FOCUS_ENERGY_CRIT_RATIO, focusEnergyCritRatio, (u32, GEN_COUNT - 1)) \ + F(PSYCH_UP_CRIT_RATIO, psychUpCritRatio, (u32, GEN_COUNT - 1)) \ /* Other move settings */ \ F(INCINERATE_GEMS, incinerateGems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ F(CAN_SPITE_FAIL, canSpiteFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1421eaf9e6..c25cdf14b6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12288,7 +12288,15 @@ static void Cmd_copyfoestats(void) { gBattleMons[gBattlerAttacker].statStages[i] = gBattleMons[gBattlerTarget].statStages[i]; } - gBattleScripting.battler = gBattlerTarget; + if (GetConfig(CONFIG_PSYCH_UP_CRIT_RATIO) >= GEN_6) + { + // Copy crit boosts (Focus Energy, Dragon Cheer, G-Max Chi Strike) + gBattleMons[gBattlerAttacker].volatiles.focusEnergy = gBattleMons[gBattlerTarget].volatiles.focusEnergy; + gBattleMons[gBattlerAttacker].volatiles.dragonCheer = gBattleMons[gBattlerTarget].volatiles.dragonCheer; + gBattleMons[gBattlerAttacker].volatiles.bonusCritStages = gBattleMons[gBattlerTarget].volatiles.bonusCritStages; + } + gEffectBattler = gBattlerTarget; + gBattleScripting.battler = gBattlerAttacker; gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/test/battle/move_effect/psych_up.c b/test/battle/move_effect/psych_up.c index 36241a4ed7..ca2ecd3f5a 100644 --- a/test/battle/move_effect/psych_up.c +++ b/test/battle/move_effect/psych_up.c @@ -1,4 +1,122 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Psych Up (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_PSYCH_UP) == EFFECT_PSYCH_UP); +} + +SINGLE_BATTLE_TEST("Psych Up displays the correct battlers when used by the player") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); + PLAYER(SPECIES_TORNADUS) { Speed(66); } + OPPONENT(SPECIES_LANDORUS) { Speed(99); } + } WHEN { + TURN { MOVE(opponent, MOVE_SWORDS_DANCE); MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_PSYCH_UP); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, opponent); + MESSAGE("Tornadus copied the opposing Landorus's stat changes!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], opponent->statStages[STAT_ATK]); + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Psych Up displays the correct battlers when used by the opponent") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); + PLAYER(SPECIES_TORNADUS) { Speed(66); } + OPPONENT(SPECIES_LANDORUS) { Speed(99); } + } WHEN { + TURN { MOVE(player, MOVE_SWORDS_DANCE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(opponent, MOVE_PSYCH_UP); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + MESSAGE("The opposing Landorus copied Tornadus's stat changes!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], player->statStages[STAT_ATK]); + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Psych Up ignores Spiky Shield and Baneful Bunker but fails against Crafty Shield") +{ + u32 protectMove = MOVE_NONE; + bool32 shouldFail = FALSE; + + PARAMETRIZE { protectMove = MOVE_SPIKY_SHIELD; shouldFail = FALSE; } + PARAMETRIZE { protectMove = MOVE_BANEFUL_BUNKER; shouldFail = FALSE; } + PARAMETRIZE { protectMove = MOVE_CRAFTY_SHIELD; shouldFail = TRUE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); + ASSUME(GetMoveEffect(MOVE_SPIKY_SHIELD) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_BANEFUL_BUNKER) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_CRAFTY_SHIELD) == EFFECT_PROTECT); + PLAYER(SPECIES_TORNADUS) { Speed(66); } + OPPONENT(SPECIES_LANDORUS) { Speed(99); } + } WHEN { + TURN { MOVE(opponent, MOVE_SWORDS_DANCE); MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(opponent, protectMove); MOVE(player, MOVE_PSYCH_UP); } + } SCENE { + if (shouldFail) { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCH_UP, player); + MESSAGE("Tornadus copied the opposing Landorus's stat changes!"); + } + } else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCH_UP, player); + MESSAGE("Tornadus copied the opposing Landorus's stat changes!"); + } + } THEN { + if (shouldFail) { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } else { + EXPECT_EQ(player->statStages[STAT_ATK], opponent->statStages[STAT_ATK]); + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } + } +} + +SINGLE_BATTLE_TEST("Psych Up does not copy the target's critical hit ratio (Gen5)") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FOCUS_ENERGY) == EFFECT_FOCUS_ENERGY); + WITH_CONFIG(CONFIG_PSYCH_UP_CRIT_RATIO, GEN_5); + WITH_CONFIG(CONFIG_FOCUS_ENERGY_CRIT_RATIO, GEN_9); + PLAYER(SPECIES_TORNADUS) { Speed(66); } + OPPONENT(SPECIES_LANDORUS) { Speed(99); } + } WHEN { + TURN { MOVE(opponent, MOVE_FOCUS_ENERGY); MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_PSYCH_UP); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCH_UP, player); + MESSAGE("Tornadus copied the opposing Landorus's stat changes!"); + } THEN { + EXPECT(opponent->volatiles.focusEnergy); + EXPECT(!player->volatiles.focusEnergy); + } +} + +SINGLE_BATTLE_TEST("Psych Up copies the target's critical hit ratio (Gen6+)") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FOCUS_ENERGY) == EFFECT_FOCUS_ENERGY); + WITH_CONFIG(CONFIG_PSYCH_UP_CRIT_RATIO, GEN_6); + WITH_CONFIG(CONFIG_FOCUS_ENERGY_CRIT_RATIO, GEN_9); + PLAYER(SPECIES_TORNADUS) { Speed(66); } + OPPONENT(SPECIES_LANDORUS) { Speed(99); } + } WHEN { + TURN { MOVE(opponent, MOVE_FOCUS_ENERGY); MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_PSYCH_UP); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCH_UP, player); + MESSAGE("Tornadus copied the opposing Landorus's stat changes!"); + } THEN { + EXPECT(opponent->volatiles.focusEnergy); + EXPECT(player->volatiles.focusEnergy); + } +} From c8eb55969e0923008b25981bf2079a81f075e99c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 27 Jan 2026 16:17:25 +0100 Subject: [PATCH 10/36] Add accuracy check to BattleScript_EffectNightmare (#9032) --- data/battle_scripts_1.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 37aa8e48b9..4f0645838b 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3393,6 +3393,7 @@ BattleScript_EffectMeanLookGen5: BattleScript_EffectNightmare:: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifvolatile BS_TARGET, VOLATILE_NIGHTMARE, BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_NightmareWorked jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_NightmareWorked From b88554198e2b723b029f3cf209bd0580e188f660 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Tue, 27 Jan 2026 20:53:23 -0500 Subject: [PATCH 11/36] Fixed instances of COMBO_STARTER_CHARGE used incorrectly (#9034) --- src/data/moves_info.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 31db4e424f..fe61bd32d1 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -9214,8 +9214,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = #endif .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = COMBO_STARTER_CHARGE, - .contestComboMoves = {0}, + .contestComboStarterId = 0, + .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_VoltTackle, .validApprenticeMove = TRUE, }, @@ -13510,8 +13510,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, //CONTEST_EFFECT_QUICKLY_GROW_BORED .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = COMBO_STARTER_CHARGE, - .contestComboMoves = {0}, + .contestComboStarterId = 0, + .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_VoltSwitch, }, From ec9ba22f8721e256848ef9c5d1b26b8a72cc0613 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 28 Jan 2026 15:47:07 +0100 Subject: [PATCH 12/36] Fixes to Commander and Emergency Exit (#9040) --- src/battle_script_commands.c | 6 ++- src/battle_util.c | 1 + test/battle/ability/commander.c | 19 ++++++++ test/battle/ability/emergency_exit.c | 70 ++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+), 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c25cdf14b6..d81760a442 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2851,7 +2851,7 @@ static void Cmd_printselectionstringfromtable(void) bool32 HasBattlerActedThisTurn(u32 battler) { u32 i; - for (i = 0; i < gCurrentTurnActionNumber; i++) + for (i = 0; i <= gCurrentTurnActionNumber; i++) { if (gBattlerByTurnOrder[i] == battler) return TRUE; @@ -6848,7 +6848,9 @@ static void Cmd_moveend(void) for (i = 0; i < gBattlersCount; i++) { - if (IsBattlerTurnDamaged(i) && EmergencyExitCanBeTriggered(i)) + if (!IsBattleMoveStatus(gCurrentMove) + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && EmergencyExitCanBeTriggered(i)) { emergencyExitBattlers |= 1u << i; numEmergencyExitBattlers++; diff --git a/src/battle_util.c b/src/battle_util.c index f14aed2674..37280e12b6 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4602,6 +4602,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab && IsBattlerAlive(battler) && gBattleStruct->battlerState[partner].commanderSpecies == SPECIES_NONE && gBattleMons[partner].species == SPECIES_DONDOZO + && (gChosenActionByBattler[partner] != B_ACTION_SWITCH || HasBattlerActedThisTurn(partner)) && GET_BASE_SPECIES_ID(GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)) == SPECIES_TATSUGIRI) { SaveBattlerAttacker(gBattlerAttacker); diff --git a/test/battle/ability/commander.c b/test/battle/ability/commander.c index 5a075a8ebf..e33c4e1521 100644 --- a/test/battle/ability/commander.c +++ b/test/battle/ability/commander.c @@ -455,3 +455,22 @@ DOUBLE_BATTLE_TEST("Commander prevent Dondozo from switch out by Dragon Tail") NOT MESSAGE("Wobbuffet was dragged out!"); } } + +DOUBLE_BATTLE_TEST("Commander will not activate if partner Dondozo is about to switch out") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_DONDOZO); + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + SWITCH(playerLeft, 2); + SWITCH(playerRight, 3); + } + } SCENE { + NOT ABILITY_POPUP(playerRight, ABILITY_COMMANDER); + } +} diff --git a/test/battle/ability/emergency_exit.c b/test/battle/ability/emergency_exit.c index a03a4853cb..6112267aa5 100644 --- a/test/battle/ability/emergency_exit.c +++ b/test/battle/ability/emergency_exit.c @@ -209,3 +209,73 @@ WILD_BATTLE_TEST("Emergency Exit activates when taking residual damage and falli EXPECT_EQ(gBattleOutcome, B_OUTCOME_PLAYER_TELEPORTED); } } + +SINGLE_BATTLE_TEST("Emergency Exit will trigger due to recoil damage") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_MIND_BLOWN) == EFFECT_MAX_HP_50_RECOIL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_MIND_BLOWN); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIND_BLOWN, opponent); + HP_BAR(player); + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } +} + +SINGLE_BATTLE_TEST("Emergency Exit will trigger due to confusion damage") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(133); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_CONFUSE_RAY); + MOVE(opponent, MOVE_POUND); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent); + HP_BAR(opponent); + NOT ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } +} + +SINGLE_BATTLE_TEST("Emergency Exit is not triggered by Pain Split") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_PAIN_SPLIT) == EFFECT_PAIN_SPLIT); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(133); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_PAIN_SPLIT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PAIN_SPLIT, player); + HP_BAR(opponent); + NOT ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } +} + +SINGLE_BATTLE_TEST("Emergency Exit will trigger due to Jump Kick recoil") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_JUMP_KICK) == EFFECT_RECOIL_IF_MISS); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_JUMP_KICK, hit: FALSE); SEND_OUT(opponent, 1); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_JUMP_KICK, opponent); + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); + } +} + From edaa838a203c845e4bbe96114b539bacea39ad78 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Wed, 28 Jan 2026 15:50:06 +0100 Subject: [PATCH 13/36] Fix berry tree spawning with max yield when OW_BERRY_ALWAYS_WATERABLE is active (#8976) Co-authored-by: Bassoonian --- src/berry.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/berry.c b/src/berry.c index cb8a06ef5b..c6d542a4a6 100644 --- a/src/berry.c +++ b/src/berry.c @@ -20,6 +20,7 @@ static u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree); static u8 GetNumStagesWateredByBerryTreeId(u8 id); static u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water); static u8 CalcBerryYield(struct BerryTree *tree); +static u32 GetBerryTreeAge(u8 id, u8 stage); static u8 GetBerryCountByBerryTreeId(u8 id); static u16 GetStageDurationByBerryType(u8); static u8 GetDrainRateByBerryType(u8); @@ -1961,8 +1962,15 @@ void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 allowGrowth) tree->stage = stage; tree->moistureLevel = 100; if (OW_BERRY_ALWAYS_WATERABLE) - tree->berryYield = GetBerryInfo(berry)->maxYield; - if (stage == BERRY_STAGE_BERRIES) + { + // We simulate a tree having grown without water + u32 berryTreeAge = GetBerryTreeAge(id, stage); + if (GetBerryInfo(berry)->maxYield - berryTreeAge * GetBerryInfo(berry)->maxYield / 5 < GetBerryInfo(berry)->minYield) + tree->berryYield = GetBerryInfo(berry)->minYield; + else + tree->berryYield = GetBerryInfo(berry)->maxYield - berryTreeAge * GetBerryInfo(berry)->maxYield / 5; + } + else if (stage == BERRY_STAGE_BERRIES) { tree->berryYield = CalcBerryYield(tree); tree->minutesUntilNextStage *= ((tree->mulch == ITEM_TO_MULCH(ITEM_STABLE_MULCH)) ? 6 : 4); @@ -2094,6 +2102,17 @@ static u8 CalcBerryYield(struct BerryTree *tree) return result; } +static u32 GetBerryTreeAge(u8 id, u8 stage) +{ + if (stage == BERRY_STAGE_TRUNK) + stage = 5; + else if (stage == BERRY_STAGE_BUDDING) + stage = 6; + else if (stage > 0) + stage -= 1; + return GetBerryInfo(id)->growthDuration * stage / (OW_BERRY_SIX_STAGES ? 6 : 4); +} + static u8 GetBerryCountByBerryTreeId(u8 id) { return gSaveBlock1Ptr->berryTrees[id].berryYield; @@ -2331,7 +2350,6 @@ static const u8 sBerryMutations[][3] = { {ITEM_TO_BERRY(ITEM_IAPAPA_BERRY), ITEM_TO_BERRY(ITEM_MAGO_BERRY), ITEM_TO_BERRY(ITEM_POMEG_BERRY)}, {ITEM_TO_BERRY(ITEM_CHESTO_BERRY), ITEM_TO_BERRY(ITEM_PERSIM_BERRY), ITEM_TO_BERRY(ITEM_KELPSY_BERRY)}, {ITEM_TO_BERRY(ITEM_ORAN_BERRY), ITEM_TO_BERRY(ITEM_PECHA_BERRY), ITEM_TO_BERRY(ITEM_QUALOT_BERRY)}, - {ITEM_TO_BERRY(ITEM_CHESTO_BERRY), ITEM_TO_BERRY(ITEM_PERSIM_BERRY), ITEM_TO_BERRY(ITEM_KELPSY_BERRY)}, {ITEM_TO_BERRY(ITEM_ASPEAR_BERRY), ITEM_TO_BERRY(ITEM_LEPPA_BERRY), ITEM_TO_BERRY(ITEM_HONDEW_BERRY)}, {ITEM_TO_BERRY(ITEM_AGUAV_BERRY), ITEM_TO_BERRY(ITEM_FIGY_BERRY), ITEM_TO_BERRY(ITEM_GREPA_BERRY)}, {ITEM_TO_BERRY(ITEM_LUM_BERRY), ITEM_TO_BERRY(ITEM_SITRUS_BERRY), ITEM_TO_BERRY(ITEM_TAMATO_BERRY)}, From dd21d8fae4438b7a6c2c8f6c22009fd19223f3ec Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Wed, 28 Jan 2026 14:50:45 +0000 Subject: [PATCH 14/36] Fixes Fling being usable with reusable TMs (#8906) --- src/battle_util.c | 1 + test/battle/ability/cheek_pouch.c | 2 +- test/battle/ability/corrosion.c | 31 ++------------------------ test/battle/move_effect/fling.c | 36 +++++++++---------------------- 4 files changed, 14 insertions(+), 56 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 37280e12b6..bc97de9362 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9810,6 +9810,7 @@ bool32 CanFling(u32 battler) || (GetConfig(CONFIG_KLUTZ_FLING_INTERACTION) >= GEN_5 && GetBattlerAbility(battler) == ABILITY_KLUTZ) || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM || gBattleMons[battler].volatiles.embargo + || (GetItemTMHMIndex(item) != 0 && GetItemImportance(item) == 1) // don't fling reusable TMs || GetFlingPowerFromItemId(item) == 0 || !CanBattlerGetOrLoseItem(battler, item)) return FALSE; diff --git a/test/battle/ability/cheek_pouch.c b/test/battle/ability/cheek_pouch.c index 0e52ca3fe3..8109dbe17a 100644 --- a/test/battle/ability/cheek_pouch.c +++ b/test/battle/ability/cheek_pouch.c @@ -119,7 +119,7 @@ SINGLE_BATTLE_TEST("Cheek Pouch doesn't activate when using Natural Gift") } } -SINGLE_BATTLE_TEST("Cheek Pouch doesn't activate when using Fling") +SINGLE_BATTLE_TEST("Cheek Pouch doesn't activate when user uses Fling") { GIVEN { ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); diff --git a/test/battle/ability/corrosion.c b/test/battle/ability/corrosion.c index 75ac0fc4bb..c1e56ac596 100644 --- a/test/battle/ability/corrosion.c +++ b/test/battle/ability/corrosion.c @@ -66,34 +66,7 @@ SINGLE_BATTLE_TEST("Corrosion does not effect poison type damaging moves if the } } -SINGLE_BATTLE_TEST("Corrosion can poison Poison- and Steel-type targets if it uses Fling while holding a Toxic Orb or a Poison Barb") -{ - u16 heldItem; - - PARAMETRIZE { heldItem = ITEM_POISON_BARB; } - PARAMETRIZE { heldItem = ITEM_TOXIC_ORB; } - - GIVEN { - ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); - ASSUME(gItemsInfo[ITEM_POISON_BARB].holdEffect == HOLD_EFFECT_TYPE_POWER); - ASSUME(gItemsInfo[ITEM_POISON_BARB].secondaryId == TYPE_POISON); - ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB); - PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(heldItem); } - OPPONENT(SPECIES_ODDISH); - } WHEN { - TURN { MOVE(player, MOVE_FLING); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); - HP_BAR(opponent); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); - if (heldItem == ITEM_POISON_BARB) - STATUS_ICON(opponent, poison: TRUE); - else - STATUS_ICON(opponent, badPoison: TRUE); - } -} - -SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion holds a Toxic Orb, it will badly poison itself") +SINGLE_BATTLE_TEST("Corrosion badly poisons its Poison/Steel-type user who holds a Toxic Orb") { GIVEN { ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB); @@ -107,7 +80,7 @@ SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion holds a T } } -SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion poisons a target with Synchronize, Synchronize will not poison Poison- or Steel-type Pokémon") +SINGLE_BATTLE_TEST("Corrosion can poison a target with Synchronize and Synchronize will not poison Poison- or Steel-type Pokémon") { u16 move; PARAMETRIZE { move = MOVE_TOXIC; } diff --git a/test/battle/move_effect/fling.c b/test/battle/move_effect/fling.c index 595938bef5..440d43ccb6 100644 --- a/test/battle/move_effect/fling.c +++ b/test/battle/move_effect/fling.c @@ -507,7 +507,7 @@ SINGLE_BATTLE_TEST("Fling deals damage based on items fling power") } } -SINGLE_BATTLE_TEST("Fling deals damage based on a TM's move power") +SINGLE_BATTLE_TEST("Fling deals damage based on a TM's move power if reusable or fails if breakable") { s16 damage[2]; @@ -520,33 +520,17 @@ SINGLE_BATTLE_TEST("Fling deals damage based on a TM's move power") TURN { MOVE(player, MOVE_FLING); } TURN { MOVE(player, MOVE_EGG_BOMB); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); - HP_BAR(opponent, captureDamage: &damage[0]); + if (GetItemImportance(ITEM_TM_EARTHQUAKE) == 0) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent, captureDamage: &damage[0]); + } else { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + MESSAGE("But it failed!"); + } ANIMATION(ANIM_TYPE_MOVE, MOVE_EGG_BOMB, player); HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - EXPECT_EQ(damage[0], damage[1]); - } -} - -SINGLE_BATTLE_TEST("Fling deals damage based on a TM's move power") -{ - s16 damage[2]; - - GIVEN { - ASSUME(GetMovePower(MOVE_EARTHQUAKE) == GetMovePower(MOVE_EGG_BOMB)); - ASSUME(!IsSpeciesOfType(SPECIES_WOBBUFFET, TYPE_DARK)); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_TM_EARTHQUAKE); } - OPPONENT(SPECIES_HIPPOWDON); - } WHEN { - TURN { MOVE(player, MOVE_FLING); } - TURN { MOVE(player, MOVE_EGG_BOMB); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); - HP_BAR(opponent, captureDamage: &damage[0]); - ANIMATION(ANIM_TYPE_MOVE, MOVE_EGG_BOMB, player); - HP_BAR(opponent, captureDamage: &damage[1]); - } THEN { - EXPECT_EQ(damage[0], damage[1]); + if (GetItemImportance(ITEM_TM_EARTHQUAKE) == 0) + EXPECT_EQ(damage[0], damage[1]); } } From 4198a5cb859ba7ea1720ddac1fb7fcd67e0baa5e Mon Sep 17 00:00:00 2001 From: GGbond Date: Thu, 29 Jan 2026 20:54:28 +0800 Subject: [PATCH 15/36] Fix Forewarn edge cases and random selection (#9049) --- include/random.h | 1 + src/battle_util.c | 41 ++++++++++++++--- test/battle/ability/forewarn.c | 82 +++++++++++++++++++++++++++++++++- 3 files changed, 118 insertions(+), 6 deletions(-) diff --git a/include/random.h b/include/random.h index 84318bedc0..df3d1c20be 100644 --- a/include/random.h +++ b/include/random.h @@ -167,6 +167,7 @@ enum RandomTag RNG_QUICK_DRAW, RNG_QUICK_CLAW, RNG_TRACE, + RNG_FOREWARN, RNG_FICKLE_BEAM, RNG_AI_ABILITY, RNG_AI_SWITCH_HASBADODDS, diff --git a/src/battle_util.c b/src/battle_util.c index bc97de9362..f79e0cee7b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3335,12 +3335,43 @@ static void ForewarnChooseMove(u32 battler) } } - for (bestId = 0, i = 1; i < count; i++) + if (count == 0) { - if (data[i].power > data[bestId].power) - bestId = i; - else if (data[i].power == data[bestId].power && Random() & 1) + Free(data); + return; + } + + u32 tieCount = 1; + u8 bestPower = data[0].power; + + bestId = 0; + for (i = 1; i < count; i++) + { + if (data[i].power > bestPower) + { + bestPower = data[i].power; bestId = i; + tieCount = 1; + } + else if (data[i].power == bestPower) + { + tieCount++; + } + } + + if (tieCount > 1) + { + u32 tieIndex = RandomUniform(RNG_FOREWARN, 0, tieCount - 1); + for (i = 0, bestId = 0; i < count; i++) + { + if (data[i].power != bestPower) + continue; + if (tieIndex-- == 0) + { + bestId = i; + break; + } + } } gEffectBattler = data[bestId].battler; @@ -4155,7 +4186,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } return effect; // Note: It returns effect as to not record the ability if Frisk does not activate. case ABILITY_FOREWARN: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (!gSpecialStatuses[battler].switchInAbilityDone && !IsOpposingSideEmpty(battler)) { ForewarnChooseMove(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_FOREWARN; diff --git a/test/battle/ability/forewarn.c b/test/battle/ability/forewarn.c index 810fcd975f..dd1c99da99 100644 --- a/test/battle/ability/forewarn.c +++ b/test/battle/ability/forewarn.c @@ -1,4 +1,84 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Forewarn (Ability) test titles") +DOUBLE_BATTLE_TEST("Forewarn warns about the highest power move among all opposing battlers") +{ + GIVEN { + PLAYER(SPECIES_MUSHARNA) { Ability(ABILITY_FOREWARN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ZUBAT) { Moves(MOVE_CRUNCH, MOVE_CELEBRATE); } + OPPONENT(SPECIES_EXCADRILL) { Moves(MOVE_FISSURE, MOVE_CELEBRATE); } + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_FOREWARN); + MESSAGE("Forewarn alerted Musharna to the opposing Excadrill's Fissure!"); + } +} + +SINGLE_BATTLE_TEST("Forewarn randomly chooses between same-power moves on one opponent") +{ + PASSES_RANDOMLY(1, 3, RNG_FOREWARN); + GIVEN { + ASSUME(GetMovePower(MOVE_TACKLE) == GetMovePower(MOVE_POUND)); + ASSUME(GetMovePower(MOVE_TACKLE) == GetMovePower(MOVE_SCRATCH)); + PLAYER(SPECIES_MUSHARNA) { Ability(ABILITY_FOREWARN); } + OPPONENT(SPECIES_ZUBAT) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_CELEBRATE); } + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(player, ABILITY_FOREWARN); + MESSAGE("Forewarn alerted Musharna to the opposing Zubat's Tackle!"); + } +} + +DOUBLE_BATTLE_TEST("Forewarn randomly chooses between opponents with same-power moves") +{ + PASSES_RANDOMLY(1, 4, RNG_FOREWARN); + GIVEN { + ASSUME(GetMovePower(MOVE_TACKLE) == GetMovePower(MOVE_POUND)); + ASSUME(GetMovePower(MOVE_TACKLE) == GetMovePower(MOVE_SCRATCH)); + ASSUME(GetMovePower(MOVE_TACKLE) == GetMovePower(MOVE_QUICK_ATTACK)); + PLAYER(SPECIES_MUSHARNA) { Ability(ABILITY_FOREWARN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ZUBAT) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_PECK, MOVE_CELEBRATE); } + OPPONENT(SPECIES_EXCADRILL) { Moves(MOVE_SCRATCH, MOVE_QUICK_ATTACK, MOVE_ABSORB, MOVE_CELEBRATE); } + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_FOREWARN); + MESSAGE("Forewarn alerted Musharna to the opposing Zubat's Tackle!"); + } +} + +DOUBLE_BATTLE_TEST("Forewarn does not trigger if a mon switches in while the opposing field is empty") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveEffect(MOVE_HEALING_WISH) == EFFECT_HEALING_WISH); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_MUSHARNA) { Ability(ABILITY_FOREWARN); } + OPPONENT(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TREECKO); + OPPONENT(SPECIES_TORCHIC); + } WHEN { + TURN { + MOVE(opponentRight, MOVE_HEALING_WISH); + MOVE(playerLeft, MOVE_U_TURN, target: opponentLeft); + SEND_OUT(playerLeft, 2); + SEND_OUT(opponentLeft, 2); + SEND_OUT(opponentRight, 3); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEALING_WISH, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, playerLeft); + HP_BAR(opponentLeft); + NOT ABILITY_POPUP(playerLeft, ABILITY_FOREWARN); + MESSAGE("2 sent out Treecko!"); + MESSAGE("2 sent out Torchic!"); + NOT ABILITY_POPUP(playerLeft, ABILITY_FOREWARN); + } +} From 08dd7da30cfbd22919de70d2a4a39fee088e6a0c Mon Sep 17 00:00:00 2001 From: GGbond Date: Fri, 30 Jan 2026 01:33:36 +0800 Subject: [PATCH 16/36] Fix AI wakeup-turn detection to consider Early Bird (#9053) --- src/battle_ai_util.c | 27 ++++++++--------- test/battle/ability/early_bird.c | 47 ++++++++++++++++++++++++++++- test/battle/ai/ai_check_viability.c | 19 ++++++++++++ 3 files changed, 77 insertions(+), 16 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 70683fc420..6bb814b66f 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3829,24 +3829,21 @@ bool32 HasChoiceEffect(u32 battler) } } -static u32 FindMoveUsedXTurnsAgo(u32 battlerId, u32 x) -{ - s32 i, index = gBattleHistory->moveHistoryIndex[battlerId]; - for (i = 0; i < x; i++) - { - if (--index < 0) - index = AI_MOVE_HISTORY_COUNT - 1; - } - return gBattleHistory->moveHistory[battlerId][index]; -} - bool32 IsWakeupTurn(u32 battler) { - // Check if rest was used 2 turns ago - if ((gBattleMons[battler].status1 & STATUS1_SLEEP) == 1 && GetMoveEffect(FindMoveUsedXTurnsAgo(battler, 2)) == EFFECT_REST) - return TRUE; - else // no way to know + u32 sleepTurns = gBattleMons[battler].status1 & STATUS1_SLEEP; + u32 toSub; + + if (sleepTurns == 0) return FALSE; + + // Early Bird reduces the sleep timer twice as fast. + if (gAiLogicData->abilities[battler] == ABILITY_EARLY_BIRD) + toSub = 2; + else + toSub = 1; + + return sleepTurns <= toSub; } bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) diff --git a/test/battle/ability/early_bird.c b/test/battle/ability/early_bird.c index 9b368970f6..0f41fffc03 100644 --- a/test/battle/ability/early_bird.c +++ b/test/battle/ability/early_bird.c @@ -1,4 +1,49 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Early Bird (Ability) test titles") +SINGLE_BATTLE_TEST("Early Bird wakes up if 1 sleep turn is preset") +{ + GIVEN { + PLAYER(SPECIES_DODUO) { Ability(ABILITY_EARLY_BIRD); Status1(STATUS1_SLEEP_TURN(1)); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Doduo woke up!"); + STATUS_ICON(player, none: TRUE); + MESSAGE("Doduo used Celebrate!"); + } +} + +SINGLE_BATTLE_TEST("Early Bird turns a 3-turn sleep into one missed turn") +{ + GIVEN { + PLAYER(SPECIES_DODUO) { Ability(ABILITY_EARLY_BIRD); Status1(STATUS1_SLEEP_TURN(3)); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Doduo is fast asleep."); + MESSAGE("Doduo woke up!"); + STATUS_ICON(player, none: TRUE); + MESSAGE("Doduo used Celebrate!"); + } +} + +SINGLE_BATTLE_TEST("Early Bird reduces Rest sleep to one turn") +{ + GIVEN { + PLAYER(SPECIES_DODUO) { Ability(ABILITY_EARLY_BIRD); MaxHP(99); HP(66); Moves(MOVE_REST, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_REST); } + TURN { MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Doduo is fast asleep."); + MESSAGE("Doduo woke up!"); + STATUS_ICON(player, none: TRUE); + MESSAGE("Doduo used Celebrate!"); + } +} diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 0e6170b5fa..f5bd39b27b 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -135,6 +135,25 @@ AI_SINGLE_BATTLE_TEST("AI will only use Dream Eater if target is asleep") } } +AI_SINGLE_BATTLE_TEST("AI chooses Sleep Talk only when it will not wake up with Early Bird") +{ + enum Ability ability; + + PARAMETRIZE { ability = ABILITY_RUN_AWAY; } + PARAMETRIZE { ability = ABILITY_EARLY_BIRD; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_DODRIO) { Ability(ability); Status1(STATUS1_SLEEP_TURN(2)); Moves(MOVE_SLEEP_TALK, MOVE_TACKLE); } + } WHEN { + if (ability == ABILITY_EARLY_BIRD) + TURN { EXPECT_MOVE(opponent, MOVE_TACKLE); } + else + TURN { EXPECT_MOVE(opponent, MOVE_SLEEP_TALK); } + } +} + AI_SINGLE_BATTLE_TEST("AI sees increased base power of Spit Up") { GIVEN { From 6928d54d4646a4cf62517f4d3e976d9c29f3ebf8 Mon Sep 17 00:00:00 2001 From: GGbond Date: Fri, 30 Jan 2026 02:02:35 +0800 Subject: [PATCH 17/36] Fix Pickpocket moveend target checks and Thief/Covet handoff (#9037) --- src/battle_script_commands.c | 28 ++- test/battle/ability/pickpocket.c | 310 ++++++++++++++++++++++++++++++- 2 files changed, 332 insertions(+), 6 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d81760a442..6cfeafa626 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7003,11 +7003,21 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_PICKPOCKET: + { + u16 attackerItem = gBattleMons[gBattlerAttacker].item; + bool32 hasPendingStolenItem = FALSE; + + if (attackerItem == ITEM_NONE + && GetMoveEffect(gCurrentMove) == EFFECT_STEAL_ITEM + && gBattleStruct->changedItems[gBattlerAttacker] != ITEM_NONE) + { + attackerItem = gBattleStruct->changedItems[gBattlerAttacker]; + hasPendingStolenItem = TRUE; + } + if (IsBattlerAlive(gBattlerAttacker) - && gBattleMons[gBattlerAttacker].item != ITEM_NONE // Attacker must be holding an item - && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerAttacker)] & (1u << gBattlerPartyIndexes[gBattlerAttacker])) // But not knocked off - && IsMoveMakingContact(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) // Pickpocket requires contact - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) // Obviously attack needs to have worked + && attackerItem != ITEM_NONE // Attacker must have an item (including pending stolen item) + && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerAttacker)] & (1u << gBattlerPartyIndexes[gBattlerAttacker]))) // But not knocked off { u8 battlers[4] = {0, 1, 2, 3}; SortBattlersBySpeed(battlers, FALSE); // Pickpocket activates for fastest mon without item @@ -7018,12 +7028,19 @@ static void Cmd_moveend(void) if (battler != gBattlerAttacker // Cannot pickpocket yourself && GetBattlerAbility(battler) == ABILITY_PICKPOCKET // Target must have pickpocket ability && IsBattlerTurnDamaged(battler) // Target needs to have been damaged + && IsMoveMakingContact(gBattlerAttacker, battler, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) // Pickpocket requires contact + && !(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) // Move needs to have affected this battler && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) // Subsitute unaffected && IsBattlerAlive(battler) // Battler must be alive to pickpocket && gBattleMons[battler].item == ITEM_NONE // Pickpocketer can't have an item already - && CanStealItem(battler, gBattlerAttacker, gBattleMons[gBattlerAttacker].item)) // Cannot steal plates, mega stones, etc + && CanStealItem(battler, gBattlerAttacker, attackerItem)) // Cannot steal plates, mega stones, etc { gBattlerTarget = gBattlerAbility = battler; + if (hasPendingStolenItem) + { + gBattleMons[gBattlerAttacker].item = attackerItem; + gBattleStruct->changedItems[gBattlerAttacker] = ITEM_NONE; + } // Battle scripting is super brittle so we shall do the item exchange now (if possible) if (GetBattlerAbility(gBattlerAttacker) != ABILITY_STICKY_HOLD) StealTargetItem(gBattlerTarget, gBattlerAttacker); // Target takes attacker's item @@ -7037,6 +7054,7 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; + } case MOVEEND_THIRD_MOVE_BLOCK: switch (moveEffect) { diff --git a/test/battle/ability/pickpocket.c b/test/battle/ability/pickpocket.c index 1e8ec6a526..e6b92a6e8e 100644 --- a/test/battle/ability/pickpocket.c +++ b/test/battle/ability/pickpocket.c @@ -1,4 +1,312 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Pickpocket (Ability) test titles") +ASSUMPTIONS +{ + ASSUME(MoveMakesContact(MOVE_BREAKING_SWIPE)); + ASSUME(MoveMakesContact(MOVE_SCRATCH)); +} + +DOUBLE_BATTLE_TEST("Pickpocket checks contact/effect per target for spread moves") +{ + GIVEN { + ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY); + ASSUME(GetMoveType(MOVE_BREAKING_SWIPE) == TYPE_DRAGON); + ASSUME(GetMoveTarget(MOVE_BREAKING_SWIPE) == MOVE_TARGET_BOTH); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MAGOST_BERRY); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); } + OPPONENT(SPECIES_CLEFAIRY); + } WHEN { + TURN { MOVE(playerLeft, MOVE_BREAKING_SWIPE); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's Magost Berry!"); + } THEN { + EXPECT(opponentLeft->item == ITEM_MAGOST_BERRY); + EXPECT(playerLeft->item == ITEM_NONE); + } +} + +DOUBLE_BATTLE_TEST("Pickpocket activates for the fastest itemless target when both are hit by a contact spread move") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_BREAKING_SWIPE) == MOVE_TARGET_BOTH); + PLAYER(SPECIES_WOBBUFFET) { Speed(20); Item(ITEM_MAGOST_BERRY); } + PLAYER(SPECIES_WYNAUT) { Speed(10); } + OPPONENT(SPECIES_SNEASEL) { Speed(40); Ability(ABILITY_PICKPOCKET); } + OPPONENT(SPECIES_SNEASEL) { Speed(30); Ability(ABILITY_PICKPOCKET); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_BREAKING_SWIPE); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's Magost Berry!"); + } THEN { + EXPECT(opponentLeft->item == ITEM_MAGOST_BERRY); + EXPECT(opponentRight->item == ITEM_NONE); + EXPECT(playerLeft->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickpocket steals the attacker's item unless it already has one") +{ + bool32 targetHasItem; + PARAMETRIZE { targetHasItem = FALSE; } + PARAMETRIZE { targetHasItem = TRUE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MAGOST_BERRY); } + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); Item(targetHasItem ? ITEM_EVIOLITE : ITEM_NONE); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + if (targetHasItem) { + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's Magost Berry!"); + } + } else { + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's Magost Berry!"); + } + } THEN { + if (targetHasItem) { + EXPECT(opponent->item == ITEM_EVIOLITE); + EXPECT(player->item == ITEM_MAGOST_BERRY); + } else { + EXPECT(opponent->item == ITEM_MAGOST_BERRY); + EXPECT(player->item == ITEM_NONE); + } + } +} + +SINGLE_BATTLE_TEST("Pickpocket does not activate if the user faints") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MAGOST_BERRY); } + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's Magost Berry!"); + } + MESSAGE("The opposing Sneasel fainted!"); + } THEN { + EXPECT(opponent->item == ITEM_NONE); + EXPECT(player->item == ITEM_MAGOST_BERRY); + } +} + +SINGLE_BATTLE_TEST("Pickpocket cannot steal from Sticky Hold") +{ + GIVEN { + PLAYER(SPECIES_GRIMER) { Ability(ABILITY_STICKY_HOLD); Item(ITEM_MAGOST_BERRY); } + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + ABILITY_POPUP(player, ABILITY_STICKY_HOLD); + MESSAGE("Grimer's item cannot be removed!"); + } THEN { + EXPECT(opponent->item == ITEM_NONE); + EXPECT(player->item == ITEM_MAGOST_BERRY); + } +} + +SINGLE_BATTLE_TEST("Pickpocket cannot steal restricted held items") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_NORMALIUM_Z].holdEffect == HOLD_EFFECT_Z_CRYSTAL); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + } + } THEN { + EXPECT(opponent->item == ITEM_NONE); + EXPECT(player->item == ITEM_NORMALIUM_Z); + } +} + +SINGLE_BATTLE_TEST("Pickpocket activates after the final hit of a multi-strike move") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FURY_SWIPES) == EFFECT_MULTI_HIT); + ASSUME(MoveMakesContact(MOVE_FURY_SWIPES)); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MAGOST_BERRY); } + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); } + } WHEN { + TURN { MOVE(player, MOVE_FURY_SWIPES, WITH_RNG(RNG_HITS, 3)); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, player); + MESSAGE("The Pokémon was hit 3 time(s)!"); + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's Magost Berry!"); + } THEN { + EXPECT(opponent->item == ITEM_MAGOST_BERRY); + EXPECT(player->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickpocket activates after Magician steals an item") +{ + GIVEN { + PLAYER(SPECIES_DELPHOX) { Ability(ABILITY_MAGICIAN); } + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); Item(ITEM_MAGOST_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + ABILITY_POPUP(player, ABILITY_MAGICIAN); + MESSAGE("Delphox stole the opposing Sneasel's Magost Berry!"); + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Delphox's Magost Berry!"); + } THEN { + EXPECT(opponent->item == ITEM_MAGOST_BERRY); + EXPECT(player->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickpocket activates after Sticky Barb transfers") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_STICKY_BARB].holdEffect == HOLD_EFFECT_STICKY_BARB); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); Item(ITEM_STICKY_BARB); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + MESSAGE("The Sticky Barb attached itself to Wobbuffet!"); + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's Sticky Barb!"); + } THEN { + EXPECT(opponent->item == ITEM_STICKY_BARB); + EXPECT(player->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickpocket activates after Thief or Covet steals an item") +{ + u16 move; + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_COVET; } + GIVEN { + ASSUME(GetMoveEffect(move) == EFFECT_STEAL_ITEM); + ASSUME(MoveMakesContact(move)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); Item(ITEM_MAGOST_BERRY); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + MESSAGE("Wobbuffet stole the opposing Sneasel's Magost Berry!"); + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's Magost Berry!"); + } THEN { + EXPECT(opponent->item == ITEM_MAGOST_BERRY); + EXPECT(player->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickpocket activates after Focus Sash is consumed") +{ + GIVEN { + ASSUME(MoveMakesContact(MOVE_SEISMIC_TOSS)); + ASSUME(gItemsInfo[ITEM_FOCUS_SASH].holdEffect == HOLD_EFFECT_FOCUS_SASH); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MAGOST_BERRY); Level(100); } + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); Item(ITEM_FOCUS_SASH); MaxHP(6); HP(6); } + } WHEN { + TURN { MOVE(player, MOVE_SEISMIC_TOSS); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SEISMIC_TOSS, player); + MESSAGE("The opposing Sneasel hung on using its Focus Sash!"); + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's Magost Berry!"); + } THEN { + EXPECT(opponent->item == ITEM_MAGOST_BERRY); + EXPECT(player->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickpocket activates after Knock Off, Bug Bite, or Pluck") +{ + u16 move; + PARAMETRIZE { move = MOVE_KNOCK_OFF; } + PARAMETRIZE { move = MOVE_BUG_BITE; } + PARAMETRIZE { move = MOVE_PLUCK; } + GIVEN { + ASSUME(MoveMakesContact(move)); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MAGOST_BERRY); } + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); Item(ITEM_ORAN_BERRY); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's Magost Berry!"); + } THEN { + EXPECT(opponent->item == ITEM_MAGOST_BERRY); + EXPECT(player->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickpocket steals Life Orb after it activates") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_LIFE_ORB].holdEffect == HOLD_EFFECT_LIFE_ORB); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + MESSAGE("Wobbuffet was hurt by the Life Orb!"); + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's Life Orb!"); + } THEN { + EXPECT(opponent->item == ITEM_LIFE_ORB); + EXPECT(player->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickpocket steals Shell Bell after it heals the user") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_SHELL_BELL].holdEffect == HOLD_EFFECT_SHELL_BELL); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SHELL_BELL); MaxHP(100); HP(66); } + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + HP_BAR(opponent); + HP_BAR(player); + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's Shell Bell!"); + } THEN { + EXPECT(opponent->item == ITEM_SHELL_BELL); + EXPECT(player->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickpocket does not prevent King's Rock or Razor Fang flinches") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_KINGS_ROCK].holdEffect == HOLD_EFFECT_FLINCH); + PLAYER(SPECIES_WOBBUFFET) { Speed(20); Item(ITEM_KINGS_ROCK); } + OPPONENT(SPECIES_SNEASEL) { Speed(10); Ability(ABILITY_PICKPOCKET); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH, WITH_RNG(RNG_HOLD_EFFECT_FLINCH, 1)); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_PICKPOCKET); + MESSAGE("The opposing Sneasel stole Wobbuffet's King's Rock!"); + MESSAGE("The opposing Sneasel flinched and couldn't move!"); + } THEN { + EXPECT(opponent->item == ITEM_KINGS_ROCK); + EXPECT(player->item == ITEM_NONE); + } +} From ee1e02b2ef131c26464e337e7adf674a42ef24c6 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Thu, 29 Jan 2026 20:11:04 -0500 Subject: [PATCH 18/36] Corrected Stone Axe and Ceaseless Edge descriptions (#9062) --- src/data/moves_info.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/data/moves_info.h b/src/data/moves_info.h index fe61bd32d1..809c6ec94c 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -19328,8 +19328,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Stone Axe"), .description = COMPOUND_STRING( - "High critical hit ratio. Sets\n" - "Splinters that hurt the foe."), + "Sets sharp rocks that hurt\n" + "the foe."), .effect = EFFECT_STONE_AXE, .power = 65, .type = TYPE_ROCK, @@ -19665,8 +19665,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Ceaseless Edge"), .description = COMPOUND_STRING( - "High critical hit ratio. Sets\n" - "Splinters that hurt the foe."), + "Sets Spikes that hurt the\n" + "foe."), .effect = EFFECT_CEASELESS_EDGE, .power = 65, .type = TYPE_DARK, From 022f5eb52ec3b0f2204abbddd2f3a6962f032683 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Fri, 30 Jan 2026 13:14:35 +0000 Subject: [PATCH 19/36] Fixes Infiltrator and adds config for Substitute interaction (#9073) --- include/battle_util.h | 1 + include/config/battle.h | 1 + include/constants/generational_changes.h | 1 + src/battle_script_commands.c | 11 +- src/battle_util.c | 15 +- test/battle/ability/illusion.c | 1 + test/battle/ability/infiltrator.c | 236 ++++++++++++++++++++++- 7 files changed, 260 insertions(+), 6 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index bb81da042b..edd303f6df 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -383,6 +383,7 @@ bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect secondaryMoveEffect, enum FunctionCallOption option); bool32 CanBeConfused(u32 battler); +bool32 IsSafeguardProtected(u32 battlerAtk, u32 battlerDef, u32 abilityAtk); u32 GetBattlerAffectionHearts(u32 battler); void TryToRevertMimicryAndFlags(void); bool32 BattleArenaTurnEnd(void); diff --git a/include/config/battle.h b/include/config/battle.h index 0d02e2873a..965174d579 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -172,6 +172,7 @@ #define B_ATE_MULTIPLIER GEN_LATEST // In Gen7+, -ate abilities (Aerilate, Galvanize, Normalize, Pixilate, Refrigerate) multiply damage by 1.2. Otherwise, it's 1.3, except Normalize which has no multiplier. #define B_DEFIANT_STICKY_WEB GEN_LATEST // In Gen9+, Defiant activates on Sticky Web regardless of who set it up. In Gen8, Defiant does not activate on Sticky Web set up by an ally after Court Change swaps its side. #define B_POWDER_OVERCOAT GEN_LATEST // In Gen6+, Overcoat blocks powder and spore moves from affecting the user. +#define B_INFILTRATOR_SUBSTITUTE GEN_LATEST // In Gen6+, Infiltrator bypasses Substitute when using a move, excluding Transform and Sky Drop. // Item settings #define B_CONFUSE_BERRIES_HEAL GEN_LATEST // In Gens3-6, Figy and similar berries restore 1/8th of HP and trigger at half HP. In Gen7 they restore half HP, triggering at 25% HP. In Gen8 they heal 1/3rd of HP. diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index 37b2b3f357..09724839b0 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -157,6 +157,7 @@ F(BATTLE_BOND, battleBond, (u32, GEN_COUNT - 1)) \ F(ATE_MULTIPLIER, ateMultiplier, (u32, GEN_COUNT - 1)) \ F(DEFIANT_STICKY_WEB, defiantStickyWeb, (u32, GEN_COUNT - 1)) \ + F(INFILTRATOR_SUBSTITUTE, infiltratorSubstitute, (u32, GEN_COUNT - 1)) \ /* Item settings */ \ F(CONFUSE_BERRIES_HEAL, confuseBerriesHeal, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ F(X_ITEMS_BUFF, xItemsBuff, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6cfeafa626..130037f7b7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3094,7 +3094,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c case MOVE_EFFECT_PARALYSIS: case MOVE_EFFECT_TOXIC: case MOVE_EFFECT_FROSTBITE: - if (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !primary) + if (IsSafeguardProtected(gBattlerAttacker, gEffectBattler, GetBattlerAbility(gBattlerAttacker)) && !primary) gBattlescriptCurrInstr = battleScript; else if (CanSetNonVolatileStatus( gBattlerAttacker, @@ -3108,7 +3108,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c case MOVE_EFFECT_CONFUSION: if (!CanBeConfused(gEffectBattler) || gBattleMons[gEffectBattler].volatiles.confusionTurns - || (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !primary)) + || (IsSafeguardProtected(gBattlerAttacker, gEffectBattler, GetBattlerAbility(gBattlerAttacker)) && !primary)) { gBattlescriptCurrInstr = battleScript; } @@ -10322,7 +10322,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union St { if (gSideTimers[GetBattlerSide(battler)].mistTimer && !flags.certain && gCurrentMove != MOVE_CURSE - && !(battler == gBattlerTarget && GetBattlerAbility(gBattlerAttacker) == ABILITY_INFILTRATOR)) + && !(battler == gBattlerTarget && GetBattlerAbility(gBattlerAttacker) == ABILITY_INFILTRATOR && !IsBattlerAlly(gBattlerAttacker, battler))) { if (flags.allowPtr) { @@ -11265,6 +11265,7 @@ static void Cmd_transformdataexecution(void) gChosenMove = MOVE_UNAVAILABLE; gBattlescriptCurrInstr = cmd->nextInstr; if (gBattleMons[gBattlerTarget].volatiles.transformed + || DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) || gBattleStruct->illusion[gBattlerTarget].state == ILLUSION_ON || IsSemiInvulnerable(gBattlerTarget, EXCLUDE_COMMANDER)) { @@ -13402,6 +13403,10 @@ bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move) return FALSE; else if (MoveIgnoresSubstitute(move)) return FALSE; + else if (GetConfig(CONFIG_INFILTRATOR_SUBSTITUTE) < GEN_6) + return TRUE; + else if (GetMoveEffect(move) == EFFECT_TRANSFORM || GetMoveEffect(move) == EFFECT_SKY_DROP) + return TRUE; else if (IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_INFILTRATOR)) return FALSE; else diff --git a/src/battle_util.c b/src/battle_util.c index f79e0cee7b..bcff0c4aee 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6114,6 +6114,17 @@ bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) return FALSE; } +bool32 IsSafeguardProtected(u32 battlerAtk, u32 battlerDef, u32 abilityAtk) +{ + if (!(gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD)) + return FALSE; + if (IsBattlerAlly(battlerAtk, battlerDef)) + return TRUE; + if (abilityAtk == ABILITY_INFILTRATOR) + return FALSE; + return TRUE; +} + bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect effect, enum FunctionCallOption option) { const u8 *battleScript = NULL; @@ -6268,7 +6279,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abil abilityDef = ABILITY_FLOWER_VEIL; battleScript = BattleScript_FlowerVeilProtects; } - else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD) + else if (IsSafeguardProtected(battlerAtk, battlerDef, abilityAtk)) { battleScript = BattleScript_SafeguardProtected; } @@ -8294,7 +8305,7 @@ static inline uq4_12_t GetScreensModifier(struct DamageContext *ctx) { return UQ_4_12(1.0); } - if (ctx->abilityAtk == ABILITY_INFILTRATOR) + if (ctx->abilityAtk == ABILITY_INFILTRATOR && !IsBattlerAlly(ctx->battlerAtk, ctx->battlerDef)) { if (ctx->updateFlags) RecordAbilityBattle(ctx->battlerAtk, ctx->abilityDef); diff --git a/test/battle/ability/illusion.c b/test/battle/ability/illusion.c index 46d99c7741..21ecafc154 100644 --- a/test/battle/ability/illusion.c +++ b/test/battle/ability/illusion.c @@ -117,6 +117,7 @@ SINGLE_BATTLE_TEST("Illusion breaks if user loses Illusion due to Worry Seed") SINGLE_BATTLE_TEST("Illusion breaks when attacked behind a substitute") { GIVEN { + WITH_CONFIG(CONFIG_INFILTRATOR_SUBSTITUTE, GEN_6); PLAYER(SPECIES_DRAGAPULT) { Ability(ABILITY_INFILTRATOR); Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_ZOROARK) { Speed(2); } diff --git a/test/battle/ability/infiltrator.c b/test/battle/ability/infiltrator.c index faf00ee113..09e5a92a66 100644 --- a/test/battle/ability/infiltrator.c +++ b/test/battle/ability/infiltrator.c @@ -1,4 +1,238 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Infiltrator (Ability) test titles") +SINGLE_BATTLE_TEST("Infiltrator bypasses the opponent's Light Screen/Reflect/Aurora Veil", s16 damage) +{ + u32 screenMove, attackingMove, ability; + + PARAMETRIZE { screenMove = MOVE_LIGHT_SCREEN; attackingMove = MOVE_WATER_GUN; ability = ABILITY_INFILTRATOR; } + PARAMETRIZE { screenMove = MOVE_LIGHT_SCREEN; attackingMove = MOVE_WATER_GUN; ability = ABILITY_CLEAR_BODY; } + PARAMETRIZE { screenMove = MOVE_REFLECT; attackingMove = MOVE_SCRATCH; ability = ABILITY_INFILTRATOR; } + PARAMETRIZE { screenMove = MOVE_REFLECT; attackingMove = MOVE_SCRATCH; ability = ABILITY_CLEAR_BODY; } + PARAMETRIZE { screenMove = MOVE_AURORA_VEIL; attackingMove = MOVE_WATER_GUN; ability = ABILITY_INFILTRATOR; } + PARAMETRIZE { screenMove = MOVE_AURORA_VEIL; attackingMove = MOVE_WATER_GUN; ability = ABILITY_CLEAR_BODY; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_LIGHT_SCREEN) == EFFECT_LIGHT_SCREEN); + ASSUME(GetMoveEffect(MOVE_REFLECT) == EFFECT_REFLECT); + ASSUME(GetMoveEffect(MOVE_AURORA_VEIL) == EFFECT_AURORA_VEIL); + ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_DRAGAPULT) { Ability(ability); } + OPPONENT(SPECIES_ABOMASNOW) { Ability(ABILITY_SNOW_WARNING); } + } WHEN { + TURN { MOVE(opponent, screenMove); MOVE(player, attackingMove); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, screenMove, opponent); + ANIMATION(ANIM_TYPE_MOVE, attackingMove, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, UQ_4_12(0.5), results[1].damage); + EXPECT_MUL_EQ(results[2].damage, UQ_4_12(0.5), results[3].damage); + EXPECT_MUL_EQ(results[4].damage, UQ_4_12(0.5), results[5].damage); + } +} + +DOUBLE_BATTLE_TEST("Infiltrator doesn't bypass an ally's Light Screen/Reflect/Aurora Veil", s16 damage) +{ + u32 screenMove, attackingMove, ability; + + PARAMETRIZE { screenMove = MOVE_LIGHT_SCREEN; attackingMove = MOVE_WATER_GUN; ability = ABILITY_INFILTRATOR; } + PARAMETRIZE { screenMove = MOVE_LIGHT_SCREEN; attackingMove = MOVE_WATER_GUN; ability = ABILITY_CLEAR_BODY; } + PARAMETRIZE { screenMove = MOVE_REFLECT; attackingMove = MOVE_SCRATCH; ability = ABILITY_INFILTRATOR; } + PARAMETRIZE { screenMove = MOVE_REFLECT; attackingMove = MOVE_SCRATCH; ability = ABILITY_CLEAR_BODY; } + PARAMETRIZE { screenMove = MOVE_AURORA_VEIL; attackingMove = MOVE_WATER_GUN; ability = ABILITY_INFILTRATOR; } + PARAMETRIZE { screenMove = MOVE_AURORA_VEIL; attackingMove = MOVE_WATER_GUN; ability = ABILITY_CLEAR_BODY; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_LIGHT_SCREEN) == EFFECT_LIGHT_SCREEN); + ASSUME(GetMoveEffect(MOVE_REFLECT) == EFFECT_REFLECT); + ASSUME(GetMoveEffect(MOVE_AURORA_VEIL) == EFFECT_AURORA_VEIL); + ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_DRAGAPULT) { Ability(ability); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ABOMASNOW) { Ability(ABILITY_SNOW_WARNING); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerRight, screenMove); MOVE(playerLeft, attackingMove, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, screenMove, playerRight); + ANIMATION(ANIM_TYPE_MOVE, attackingMove, playerLeft); + HP_BAR(playerRight, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + EXPECT_EQ(results[2].damage, results[3].damage); + EXPECT_EQ(results[4].damage, results[5].damage); + } +} + +SINGLE_BATTLE_TEST("Infiltrator bypasses the opponent's Mist") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } + PARAMETRIZE { ability = ABILITY_INFILTRATOR; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_MIST) == EFFECT_MIST); + ASSUME(GetMoveEffect(MOVE_SCREECH) == EFFECT_DEFENSE_DOWN_2); + PLAYER(SPECIES_DRAGAPULT) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_MIST); MOVE(player, MOVE_SCREECH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIST, opponent); + if (ability == ABILITY_INFILTRATOR) + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, player); + else + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, player); + } +} + +DOUBLE_BATTLE_TEST("Infiltrator doesn't bypass an ally's Mist") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } + PARAMETRIZE { ability = ABILITY_INFILTRATOR; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_MIST) == EFFECT_MIST); + ASSUME(GetMoveEffect(MOVE_SCREECH) == EFFECT_DEFENSE_DOWN_2); + PLAYER(SPECIES_DRAGAPULT) { Ability(ability); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerRight, MOVE_MIST); MOVE(playerLeft, MOVE_SCREECH, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIST, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, playerLeft); + } +} + +SINGLE_BATTLE_TEST("Infiltrator bypasses the opponent's Safeguard") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } + PARAMETRIZE { ability = ABILITY_INFILTRATOR; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SAFEGUARD) == EFFECT_SAFEGUARD); + ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_NON_VOLATILE_STATUS); + PLAYER(SPECIES_DRAGAPULT) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SAFEGUARD); MOVE(player, MOVE_THUNDER_WAVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SAFEGUARD, opponent); + if (ability == ABILITY_INFILTRATOR) + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_WAVE, player); + else + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_WAVE, player); + } +} + +DOUBLE_BATTLE_TEST("Infiltrator doesn't bypass an ally's Safeguard") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } + PARAMETRIZE { ability = ABILITY_INFILTRATOR; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SAFEGUARD) == EFFECT_SAFEGUARD); + ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_NON_VOLATILE_STATUS); + PLAYER(SPECIES_DRAGAPULT) { Ability(ability); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerRight, MOVE_SAFEGUARD); MOVE(playerLeft, MOVE_THUNDER_WAVE, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SAFEGUARD, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_WAVE, playerLeft); + } +} + +SINGLE_BATTLE_TEST("Infiltrator bypasses the opponent's Substitute (Gen 6+)") +{ + u32 ability, config; + + PARAMETRIZE { ability = ABILITY_CLEAR_BODY; config = GEN_5; } + PARAMETRIZE { ability = ABILITY_INFILTRATOR; config = GEN_5; } + PARAMETRIZE { ability = ABILITY_CLEAR_BODY; config = GEN_6; } + PARAMETRIZE { ability = ABILITY_INFILTRATOR; config = GEN_6; } + + GIVEN { + WITH_CONFIG(CONFIG_INFILTRATOR_SUBSTITUTE, config); + ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); + ASSUME(!MoveIgnoresSubstitute(MOVE_SCRATCH)); + PLAYER(SPECIES_DRAGAPULT) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent); + if (ability == ABILITY_INFILTRATOR && config >= GEN_6) { + NOT SUB_HIT(opponent); + } else { + SUB_HIT(opponent); + } + } +} + +DOUBLE_BATTLE_TEST("Infiltrator bypasses an ally's Substitute (Gen 6+)") +{ + u32 ability, config; + + PARAMETRIZE { ability = ABILITY_CLEAR_BODY; config = GEN_5; } + PARAMETRIZE { ability = ABILITY_INFILTRATOR; config = GEN_5; } + PARAMETRIZE { ability = ABILITY_CLEAR_BODY; config = GEN_6; } + PARAMETRIZE { ability = ABILITY_INFILTRATOR; config = GEN_6; } + + GIVEN { + WITH_CONFIG(CONFIG_INFILTRATOR_SUBSTITUTE, config); + ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); + ASSUME(!MoveIgnoresSubstitute(MOVE_SCRATCH)); + PLAYER(SPECIES_DRAGAPULT) { Ability(ability); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerRight, MOVE_SUBSTITUTE); MOVE(playerLeft, MOVE_SCRATCH, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, playerRight); + if (ability == ABILITY_INFILTRATOR && config == GEN_6) { + NOT SUB_HIT(playerRight); + } else { + SUB_HIT(playerRight); + } + } +} + +SINGLE_BATTLE_TEST("Infiltrator doesn't ignore a battler's Substitute when using Transform or Sky Drop") +{ + u32 ability, move; + + PARAMETRIZE { ability = ABILITY_CLEAR_BODY; move = MOVE_TRANSFORM; } + PARAMETRIZE { ability = ABILITY_INFILTRATOR; move = MOVE_TRANSFORM; } + PARAMETRIZE { ability = ABILITY_CLEAR_BODY; move = MOVE_SKY_DROP; } + PARAMETRIZE { ability = ABILITY_INFILTRATOR; move = MOVE_SKY_DROP; } + + GIVEN { + WITH_CONFIG(CONFIG_INFILTRATOR_SUBSTITUTE, GEN_6); + ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); + ASSUME(GetMoveEffect(MOVE_TRANSFORM) == EFFECT_TRANSFORM); + ASSUME(GetMoveEffect(MOVE_SKY_DROP) == EFFECT_SKY_DROP); + PLAYER(SPECIES_DRAGAPULT) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, move, player); + } +} From e620a0a0017db7c0ac40ac19c9bd490e07e197b0 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Fri, 30 Jan 2026 22:19:51 +0100 Subject: [PATCH 20/36] Add aif2pcm to gitignore (#9077) Co-authored-by: Hedara --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 686677dac2..66cf272e5f 100644 --- a/.gitignore +++ b/.gitignore @@ -52,6 +52,7 @@ src/data/debug_trainers.h test/battle/trainer_control.h tools/compresSmol/compresSmol tools/compresSmol/compresSmolTilemap +tools/aif2pcm/aif2pcm *.Identifier *.smol *.fastSmol From 0cb34d3605ebd308358cb70592c6d7745c56e044 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 30 Jan 2026 16:23:37 -0500 Subject: [PATCH 21/36] add ChrispyChris27 as a contributor for code (#9067) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CREDITS.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ee9a9c49f7..8ae6daf62c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -633,6 +633,15 @@ "contributions": [ "design" ] + }, + { + "login": "ChrispyChris27", + "name": "ChrispyChris27", + "avatar_url": "https://avatars.githubusercontent.com/u/173648816?v=4", + "profile": "https://github.com/ChrispyChris27", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/CREDITS.md b/CREDITS.md index 10786eff5d..7d9e48d70e 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -91,6 +91,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d SabataLunar
SabataLunar

🎨 PacFire
PacFire

🎨 + ChrispyChris27
ChrispyChris27

💻 From 95d3258ef11a69bb5928b8d75bb514e5acedfce1 Mon Sep 17 00:00:00 2001 From: ChrispyChris27 Date: Fri, 30 Jan 2026 16:42:51 -0500 Subject: [PATCH 22/36] Fixes creation of certain overworld sprites in object_event_pic_tables_followers.h (#9065) --- .../object_event_pic_tables_followers.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/data/object_events/object_event_pic_tables_followers.h b/src/data/object_events/object_event_pic_tables_followers.h index 13f9d17316..4339d4c683 100644 --- a/src/data/object_events/object_event_pic_tables_followers.h +++ b/src/data/object_events/object_event_pic_tables_followers.h @@ -796,13 +796,13 @@ static const struct SpriteFrameImage sPicTable_Steelix[] = { }; #if P_GENDER_DIFFERENCES static const struct SpriteFrameImage sPicTable_SteelixF[] = { - overworld_ascending_frames(gObjectEventPic_SteelixF, 4, 4), + overworld_ascending_frames(gObjectEventPic_SteelixF, 8, 8), }; #endif //P_GENDER_DIFFERENCES #if OW_BATTLE_ONLY_FORMS #if P_MEGA_EVOLUTIONS static const struct SpriteFrameImage sPicTable_SteelixMega[] = { - overworld_ascending_frames(gObjectEventPic_SteelixMega, 4, 4), + overworld_ascending_frames(gObjectEventPic_SteelixMega, 8, 8), }; #endif // P_MEGA_EVOLUTIONS #endif // OW_BATTLE_ONLY_FORMS @@ -2994,7 +2994,7 @@ static const struct SpriteFrameImage sPicTable_Latias[] = { #if OW_BATTLE_ONLY_FORMS #if P_MEGA_EVOLUTIONS static const struct SpriteFrameImage sPicTable_LatiasMega[] = { - overworld_ascending_frames(gObjectEventPic_LatiasMega, 4, 4), + overworld_ascending_frames(gObjectEventPic_LatiasMega, 8, 8), }; #endif // P_MEGA_EVOLUTIONS #endif // OW_BATTLE_ONLY_FORMS @@ -3007,7 +3007,7 @@ static const struct SpriteFrameImage sPicTable_Latios[] = { #if OW_BATTLE_ONLY_FORMS #if P_MEGA_EVOLUTIONS static const struct SpriteFrameImage sPicTable_LatiosMega[] = { - overworld_ascending_frames(gObjectEventPic_LatiosMega, 4, 4), + overworld_ascending_frames(gObjectEventPic_LatiosMega, 8, 8), }; #endif // P_MEGA_EVOLUTIONS #endif // OW_BATTLE_ONLY_FORMS @@ -3020,7 +3020,7 @@ static const struct SpriteFrameImage sPicTable_Kyogre[] = { #if OW_BATTLE_ONLY_FORMS #if P_PRIMAL_REVERSIONS static const struct SpriteFrameImage sPicTable_KyogrePrimal[] = { - overworld_ascending_frames(gObjectEventPic_KyogrePrimal, 4, 4), + overworld_ascending_frames(gObjectEventPic_KyogrePrimal, 8, 8), }; #endif // P_PRIMAL_REVERSIONS #endif // OW_BATTLE_ONLY_FORMS @@ -3033,7 +3033,7 @@ static const struct SpriteFrameImage sPicTable_Groudon[] = { #if OW_BATTLE_ONLY_FORMS #if P_PRIMAL_REVERSIONS static const struct SpriteFrameImage sPicTable_GroudonPrimal[] = { - overworld_ascending_frames(gObjectEventPic_GroudonPrimal, 4, 4), + overworld_ascending_frames(gObjectEventPic_GroudonPrimal, 8, 8), }; #endif // P_PRIMAL_REVERSIONS #endif // OW_BATTLE_ONLY_FORMS @@ -3046,7 +3046,7 @@ static const struct SpriteFrameImage sPicTable_Rayquaza[] = { #if OW_BATTLE_ONLY_FORMS #if P_MEGA_EVOLUTIONS static const struct SpriteFrameImage sPicTable_RayquazaMega[] = { - overworld_ascending_frames(gObjectEventPic_RayquazaMega, 4, 4), + overworld_ascending_frames(gObjectEventPic_RayquazaMega, 8, 8), }; #endif // P_MEGA_EVOLUTIONS #endif // OW_BATTLE_ONLY_FORMS From d6aac051fb494aa6b489e44d0de835bd9af152fe Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Sat, 31 Jan 2026 09:19:59 +0100 Subject: [PATCH 23/36] Fix debug menu using female icon with male palette (#9092) --- src/debug.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/debug.c b/src/debug.c index fdeaa8813e..dd1b853ddc 100644 --- a/src/debug.c +++ b/src/debug.c @@ -2255,7 +2255,7 @@ static void DebugAction_Give_PokemonSimple(u8 taskId) gTasks[taskId].tIsComplex = FALSE; FreeMonIconPalettes(); - LoadMonIconPalette(gTasks[taskId].tInput); + LoadMonIconPalettePersonality(gTasks[taskId].tInput, 0); gTasks[taskId].tSpriteId = CreateMonIcon(gTasks[taskId].tInput, SpriteCB_MonIcon, DEBUG_NUMBER_ICON_X, DEBUG_NUMBER_ICON_Y, 4, 0); gSprites[gTasks[taskId].tSpriteId].oam.priority = 0; } @@ -2289,7 +2289,7 @@ static void DebugAction_Give_PokemonComplex(u8 taskId) gTasks[taskId].tIsComplex = TRUE; FreeMonIconPalettes(); - LoadMonIconPalette(gTasks[taskId].tInput); + LoadMonIconPalettePersonality(gTasks[taskId].tInput, 0); gTasks[taskId].tSpriteId = CreateMonIcon(gTasks[taskId].tInput, SpriteCB_MonIcon, DEBUG_NUMBER_ICON_X, DEBUG_NUMBER_ICON_Y, 4, 0); gSprites[gTasks[taskId].tSpriteId].oam.priority = 0; gTasks[taskId].tIterator = 0; @@ -2313,7 +2313,7 @@ static void DebugAction_Give_Pokemon_SelectId(u8 taskId) Debug_Display_SpeciesInfo(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); FreeAndDestroyMonIconSprite(&gSprites[gTasks[taskId].tSpriteId]); FreeMonIconPalettes(); - LoadMonIconPalette(gTasks[taskId].tInput); + LoadMonIconPalettePersonality(gTasks[taskId].tInput, 0); gTasks[taskId].tSpriteId = CreateMonIcon(gTasks[taskId].tInput, SpriteCB_MonIcon, DEBUG_NUMBER_ICON_X, DEBUG_NUMBER_ICON_Y, 4, 0); gSprites[gTasks[taskId].tSpriteId].oam.priority = 0; } From 5d5f655b807709810188374ffe1a8e7f6391b677 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sat, 31 Jan 2026 17:36:56 +0000 Subject: [PATCH 24/36] Fixes Infiltrator test battler not using intended move (#9096) --- test/battle/ability/infiltrator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/battle/ability/infiltrator.c b/test/battle/ability/infiltrator.c index 09e5a92a66..bd85b7d5b8 100644 --- a/test/battle/ability/infiltrator.c +++ b/test/battle/ability/infiltrator.c @@ -230,7 +230,7 @@ SINGLE_BATTLE_TEST("Infiltrator doesn't ignore a battler's Substitute when using PLAYER(SPECIES_DRAGAPULT) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_SCRATCH); } + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, move); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent); NOT ANIMATION(ANIM_TYPE_MOVE, move, player); From 4d5296078033ce2f6452c332e566da495f568b38 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 1 Feb 2026 12:52:53 -0300 Subject: [PATCH 25/36] Fix Tranformed mon changing forms when fainting (#9106) --- src/battle_main.c | 2 ++ test/battle/move_effect/transform.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/battle_main.c b/src/battle_main.c index c823f61634..8607e22e06 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3304,8 +3304,10 @@ const u8* FaintClearSetData(u32 battler) gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; bool32 keepGastroAcid = gBattleMons[battler].volatiles.gastroAcid; + bool32 keepTransformed = gBattleMons[battler].volatiles.transformed; memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); gBattleMons[battler].volatiles.gastroAcid = keepGastroAcid; // Edge case: Keep Gastro Acid if pokemon's ability can have effect after fainting, for example Innards Out. + gBattleMons[battler].volatiles.transformed = keepTransformed; // Edge case: Keep Transformed status to prevent triggering FORM_CHANGE_FAINT on transformed mons. for (i = 0; i < gBattlersCount; i++) { diff --git a/test/battle/move_effect/transform.c b/test/battle/move_effect/transform.c index bf2bd66143..de98de70a6 100644 --- a/test/battle/move_effect/transform.c +++ b/test/battle/move_effect/transform.c @@ -28,3 +28,17 @@ SINGLE_BATTLE_TEST("(TERA) Transform does not copy the target's Tera Type, and i NOT { HP_BAR(opponent); } } } + +SINGLE_BATTLE_TEST("Transform returns the user to normal at the end of the battle after fainting") +{ + GIVEN { + PLAYER(SPECIES_DITTO) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PIDGEOT) { Item(ITEM_PIDGEOTITE); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); MOVE(player, MOVE_TRANSFORM); } + TURN { MOVE(opponent, MOVE_SCRATCH); SEND_OUT(player, 1); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_DITTO); + } +} From ac37c963ae9179ff3fa466b695e159f8cd0ca5b1 Mon Sep 17 00:00:00 2001 From: GGbond Date: Sun, 1 Feb 2026 23:55:40 +0800 Subject: [PATCH 26/36] Prevent Incinerate from burning items under Sticky Hold (#9068) --- src/battle_script_commands.c | 5 +++-- test/battle/ability/sticky_hold.c | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 130037f7b7..759fcaee92 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3497,8 +3497,9 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c gBattlescriptCurrInstr = battleScript; break; case MOVE_EFFECT_INCINERATE: - if ((gBattleMons[gEffectBattler].item >= FIRST_BERRY_INDEX && gBattleMons[gEffectBattler].item <= LAST_BERRY_INDEX) - || (B_INCINERATE_GEMS >= GEN_6 && GetBattlerHoldEffect(gEffectBattler) == HOLD_EFFECT_GEMS)) + if (((gBattleMons[gEffectBattler].item >= FIRST_BERRY_INDEX && gBattleMons[gEffectBattler].item <= LAST_BERRY_INDEX) + || (B_INCINERATE_GEMS >= GEN_6 && GetBattlerHoldEffect(gEffectBattler) == HOLD_EFFECT_GEMS)) + && battlerAbility != ABILITY_STICKY_HOLD) { gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = 0; diff --git a/test/battle/ability/sticky_hold.c b/test/battle/ability/sticky_hold.c index d6aee1ee51..b4fb047cbe 100644 --- a/test/battle/ability/sticky_hold.c +++ b/test/battle/ability/sticky_hold.c @@ -16,3 +16,27 @@ SINGLE_BATTLE_TEST("Sticky Hold prevents item theft") } } +SINGLE_BATTLE_TEST("Sticky Hold prevents Incinerate from destroying berries") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_INCINERATE); } + OPPONENT(SPECIES_GASTRODON) { Ability(ABILITY_STICKY_HOLD); Item(ITEM_CHERI_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_INCINERATE); } + } THEN { + EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].item, ITEM_CHERI_BERRY); + } +} + +SINGLE_BATTLE_TEST("Sticky Hold prevents Incinerate from destroying gems") +{ + GIVEN { + WITH_CONFIG(CONFIG_INCINERATE_GEMS, GEN_6); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_INCINERATE); } + OPPONENT(SPECIES_GASTRODON) { Ability(ABILITY_STICKY_HOLD); Item(ITEM_GHOST_GEM); } + } WHEN { + TURN { MOVE(player, MOVE_INCINERATE); } + } THEN { + EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].item, ITEM_GHOST_GEM); + } +} From 2d17ad27f921ebda03ad35e8dd00d40b6ac29114 Mon Sep 17 00:00:00 2001 From: Hedara Date: Sun, 1 Feb 2026 17:13:23 +0100 Subject: [PATCH 27/36] Expansion 1.14.3 release --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 3 +- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 3 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 3 +- README.md | 2 +- docs/SUMMARY.md | 1 + docs/changelogs/1.14.x/1.14.3.md | 170 ++++++++++++++++++ include/constants/expansion.h | 4 +- 7 files changed, 180 insertions(+), 6 deletions(-) create mode 100644 docs/changelogs/1.14.x/1.14.3.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 0c918c334b..03c9151c06 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.14.2 (Latest release) + - 1.14.3 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.14.2 - 1.14.1 - 1.14.0 - 1.13.4 diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index b172a867aa..395f0d590c 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.14.2 (Latest release) + - 1.14.3 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.14.2 - 1.14.1 - 1.14.0 - 1.13.4 diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index c69e2c1052..732281edca 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.14.2 (Latest release) + - 1.14.3 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.14.2 - 1.14.1 - 1.14.0 - 1.13.4 diff --git a/README.md b/README.md index c9a538c49a..11666a16a5 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity. ``` -Based off RHH's pokeemerald-expansion 1.14.2 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.14.3 https://github.com/rh-hideout/pokeemerald-expansion/ ``` Please consider [crediting all contributors](CREDITS.md) involved in the project! diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index ebf3e7727b..97130374bf 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -44,6 +44,7 @@ - [Vs. Seeker](tutorials/vs_seeker.md) - [Changelog](./CHANGELOG.md) - [1.14.x]() + - [Version 1.14.3](changelogs/1.14.x/1.14.3.md) - [Version 1.14.2](changelogs/1.14.x/1.14.2.md) - [Version 1.14.1](changelogs/1.14.x/1.14.1.md) - [Version 1.14.0](changelogs/1.14.x/1.14.0.md) diff --git a/docs/changelogs/1.14.x/1.14.3.md b/docs/changelogs/1.14.x/1.14.3.md new file mode 100644 index 0000000000..2ad269b714 --- /dev/null +++ b/docs/changelogs/1.14.x/1.14.3.md @@ -0,0 +1,170 @@ +```md +## How to update +- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`. +- Once you have your remote set up, run the command `git pull RHH expansion/1.14.3 +`. +``` + + +## 🧬 General 🧬 +### Changed +* Misc style and whitespace cleanup by @grintoul1 in [#8681](https://github.com/rh-hideout/pokeemerald-expansion/pull/8681) +* Disable L button config (throw ball shortcut or move description) when there is overlap with L=A option by @FosterProgramming in [#8332](https://github.com/rh-hideout/pokeemerald-expansion/pull/8332) +* Update CONTRIBUTING.md by @pkmnsnfrn in [#8879](https://github.com/rh-hideout/pokeemerald-expansion/pull/8879) +* Deleted unnecessary files by @Bassoonian in [#8899](https://github.com/rh-hideout/pokeemerald-expansion/pull/8899) +* Fix Metronome bans by @amiosi in [#8834](https://github.com/rh-hideout/pokeemerald-expansion/pull/8834) +* Move CMD_ARGS to battle_script_commands by @hedara90 in [#8974](https://github.com/rh-hideout/pokeemerald-expansion/pull/8974) + - `CMD_ARGS` for battle scripts now only exist in `src/battle_script_commands.c` +* Pret merge (20th of January, 2026) by @hedara90 in [#8973](https://github.com/rh-hideout/pokeemerald-expansion/pull/8973) +* Remove trailing whitespace - Master by @AsparagusEduardo in [#9011](https://github.com/rh-hideout/pokeemerald-expansion/pull/9011) +* fix: updated rulings about big feature label by @pkmnsnfrn in [#9027](https://github.com/rh-hideout/pokeemerald-expansion/pull/9027) +* Add aif2pcm to gitignore by @hedara90 in [#9077](https://github.com/rh-hideout/pokeemerald-expansion/pull/9077) + +### Fixed +* Add check to warn of a non-working config setup by @FosterProgramming in [#8686](https://github.com/rh-hideout/pokeemerald-expansion/pull/8686) +* Various sprite visualizer fixes if configs disabled by @kittenchilly in [#8697](https://github.com/rh-hideout/pokeemerald-expansion/pull/8697) +* Fix trade evo with partner by @FosterProgramming in [#8857](https://github.com/rh-hideout/pokeemerald-expansion/pull/8857) +* Fixed Acc value shadow cut off when Accuracy = 100 by @montmoguri in [#8886](https://github.com/rh-hideout/pokeemerald-expansion/pull/8886) +* Fix vivillon icy snow icon by @FosterProgramming in [#8970](https://github.com/rh-hideout/pokeemerald-expansion/pull/8970) +* Fix premier ball wrong data size by @FosterProgramming in [#8979](https://github.com/rh-hideout/pokeemerald-expansion/pull/8979) +* Fixes creation of certain overworld sprites in object_event_pic_tables_followers.h by @ChrispyChris27 in [#9065](https://github.com/rh-hideout/pokeemerald-expansion/pull/9065) + +## 🗺️ Overworld 🗺️ +### Fixed +* Fix teleport location by @cawtds in [#8941](https://github.com/rh-hideout/pokeemerald-expansion/pull/8941) +* Fix substitute follower appearing with dead party by @FosterProgramming in [#9028](https://github.com/rh-hideout/pokeemerald-expansion/pull/9028) +* Fix berry tree spawning with max yield when OW_BERRY_ALWAYS_WATERABLE is active by @FosterProgramming in [#8976](https://github.com/rh-hideout/pokeemerald-expansion/pull/8976) +* Fix debug menu using female icon with male palette by @FosterProgramming in [#9092](https://github.com/rh-hideout/pokeemerald-expansion/pull/9092) + +## 🐉 Pokémon 🐉 +### Changed +* Miscellaneous species_info Changes by @amiosi in [#8462](https://github.com/rh-hideout/pokeemerald-expansion/pull/8462) + +### Fixed +* Fix in-battle form changes always reverting by @AsparagusEduardo in [#8810](https://github.com/rh-hideout/pokeemerald-expansion/pull/8810) +* Fix typo in Salazzle form species ID table reference by @ostomachion in [#8904](https://github.com/rh-hideout/pokeemerald-expansion/pull/8904) +* Mega Gardevoir should always be Fairy-type by @amiosi in [#8955](https://github.com/rh-hideout/pokeemerald-expansion/pull/8955) + +## ⚔️ Battle General ⚔️ +### Changed +* Add enum for battle script commands by @AlexOn1ine in [#8778](https://github.com/rh-hideout/pokeemerald-expansion/pull/8778) +* Miscellaneous fixes to configs and other values by @amiosi in [#8662](https://github.com/rh-hideout/pokeemerald-expansion/pull/8662) +* Updating IsNonVolatileStatusBlocked by @bassforte123 in [#8728](https://github.com/rh-hideout/pokeemerald-expansion/pull/8728) + +### Fixed +* Fix berry activation timing for Yawn sleep and Leech Seed damage by @moostoet in [#8776](https://github.com/rh-hideout/pokeemerald-expansion/pull/8776) + - Fix Chesto/Sitrus berry activation timing for status and damage +* Fix Cheek Pouch not activating for Bug Bite, Pluck, and Fling berry effects by @Cle-bit in [#8782](https://github.com/rh-hideout/pokeemerald-expansion/pull/8782) +* Fix wrongly getting a battler position in the type effectiveness functions by @Bassoonian in [#8787](https://github.com/rh-hideout/pokeemerald-expansion/pull/8787) +* fix crash damage implementation and incorrect memento generation by @amiosi in [#8804](https://github.com/rh-hideout/pokeemerald-expansion/pull/8804) +* Fix Sticky Hold blocking user's own Trick or Bestow by @Cle-bit in [#8860](https://github.com/rh-hideout/pokeemerald-expansion/pull/8860) +* Fixes Nightmare not affecting Comatose and adds various missing tests by @Cle-bit in [#8859](https://github.com/rh-hideout/pokeemerald-expansion/pull/8859) +* Fix Protosynthesis/Quark Drive defensive boost calculation by @hedara90 in [#8875](https://github.com/rh-hideout/pokeemerald-expansion/pull/8875) +* Fix wrong cases of DamageContext by @Bassoonian in [#8895](https://github.com/rh-hideout/pokeemerald-expansion/pull/8895) +* Fix misaligned shadows of transformed mons when `B_ENEMY_MON_SHADOW_STYLE <= GEN_3` by @estellarc in [#8887](https://github.com/rh-hideout/pokeemerald-expansion/pull/8887) +* fix ITEM_NONE being considered a form change item by DoesSpeciesUseHoldItemToChangeForm by @phexmiau in [#8915](https://github.com/rh-hideout/pokeemerald-expansion/pull/8915) +* Fix Memento and Block regressions by @amiosi in [#8942](https://github.com/rh-hideout/pokeemerald-expansion/pull/8942) +* Fixed several issues with Parting Shot by @Cle-bit in [#8928](https://github.com/rh-hideout/pokeemerald-expansion/pull/8928) +* Align Crafty Shield with wiki and refine IsAllyProtectingFromMove by @Cle-bit in [#8990](https://github.com/rh-hideout/pokeemerald-expansion/pull/8990) +* Fixes Hyperspace Fury not breaking protection by @PhallenTree in [#8999](https://github.com/rh-hideout/pokeemerald-expansion/pull/8999) +* Fix Magnetic Flux target handling in singles by @Cle-bit in [#9007](https://github.com/rh-hideout/pokeemerald-expansion/pull/9007) +* fix: IsDoubleBattle() return value by @khbsd in [#9012](https://github.com/rh-hideout/pokeemerald-expansion/pull/9012) +* Remove player party shiny bit setting in CreateFrontierBrainPokemon by @grintoul1 in [#9022](https://github.com/rh-hideout/pokeemerald-expansion/pull/9022) +* Fix Foresight/Miracle Eye repeated-use behavior by @Cle-bit in [#9025](https://github.com/rh-hideout/pokeemerald-expansion/pull/9025) +* Fix Crafty Shield consecutive-use failure by @Cle-bit in [#9023](https://github.com/rh-hideout/pokeemerald-expansion/pull/9023) +* Fixes Beak Blast burning attacker when charging 2 turn move by @PhallenTree in [#9026](https://github.com/rh-hideout/pokeemerald-expansion/pull/9026) +* Fix Synchronoise typeless behavior in Gen7+ by @Cle-bit in [#9031](https://github.com/rh-hideout/pokeemerald-expansion/pull/9031) +* Fix Psych Up wrong battler message and Gen 6+ crit ratio copying by @Cle-bit in [#9015](https://github.com/rh-hideout/pokeemerald-expansion/pull/9015) +* Add accuracy check to BattleScript_EffectNightmare by @AlexOn1ine in [#9032](https://github.com/rh-hideout/pokeemerald-expansion/pull/9032) +* Fixes to Commander and Emergency Exit by @AlexOn1ine in [#9040](https://github.com/rh-hideout/pokeemerald-expansion/pull/9040) +* Fixes Fling being usable with reusable TMs by @PhallenTree in [#8906](https://github.com/rh-hideout/pokeemerald-expansion/pull/8906) +* Fix Forewarn edge cases and random selection by @Cle-bit in [#9049](https://github.com/rh-hideout/pokeemerald-expansion/pull/9049) +* Fix Pickpocket moveend target checks and Thief/Covet handoff by @Cle-bit in [#9037](https://github.com/rh-hideout/pokeemerald-expansion/pull/9037) +* Fixes Infiltrator and adds config for Substitute interaction by @PhallenTree in [#9073](https://github.com/rh-hideout/pokeemerald-expansion/pull/9073) +* Fix Tranformed mon changing forms when fainting by @AsparagusEduardo in [#9106](https://github.com/rh-hideout/pokeemerald-expansion/pull/9106) +* Prevent Incinerate from burning items under Sticky Hold by @Cle-Bit in [#9068](https://github.com/rh-hideout/pokeemerald-expansion/pull/9068) + +## 🤹 Moves 🤹 +### Changed +* Corrected Stone Axe and Ceaseless Edge descriptions by @fdeblasio in [#9062](https://github.com/rh-hideout/pokeemerald-expansion/pull/9062) + +### Fixed +* Fix Hyper Beam animation by @hedara90 in [#8872](https://github.com/rh-hideout/pokeemerald-expansion/pull/8872) +* Fixed instances of COMBO_STARTER_CHARGE used incorrectly by @fdeblasio in [#9034](https://github.com/rh-hideout/pokeemerald-expansion/pull/9034) + +## 🧶 Items 🧶 +### Changed +* Miscellaneous Item Changes by @amiosi in [#8461](https://github.com/rh-hideout/pokeemerald-expansion/pull/8461) +* add the type boost value for gen 3 sea incense by @amiosi in [#8826](https://github.com/rh-hideout/pokeemerald-expansion/pull/8826) +* Changes to Item icons and palettes by @amiosi in [#8614](https://github.com/rh-hideout/pokeemerald-expansion/pull/8614) + +## 🤖 Battle AI 🤖 +### Fixed +* Fix Sticky Hold blocking user's own Trick or Bestow by @Cle-bit in [#8860](https://github.com/rh-hideout/pokeemerald-expansion/pull/8860) +* Fix AI absorber switching for edge cases by @Cle-bit in [#8964](https://github.com/rh-hideout/pokeemerald-expansion/pull/8964) +* Fix the speed scoring of Tailwind for AI by @Cle-bit in [#8968](https://github.com/rh-hideout/pokeemerald-expansion/pull/8968) +* Fix AI wakeup-turn detection to consider Early Bird by @Cle-bit in [#9053](https://github.com/rh-hideout/pokeemerald-expansion/pull/9053) + +## 🧹 Other Cleanup 🧹 +* Misc style and whitespace cleanup by @grintoul1 in [#8681](https://github.com/rh-hideout/pokeemerald-expansion/pull/8681) +* Disable L button config (throw ball shortcut or move description) when there is overlap with L=A option by @FosterProgramming in [#8332](https://github.com/rh-hideout/pokeemerald-expansion/pull/8332) +* Various sprite visualizer fixes if configs disabled by @kittenchilly in [#8697](https://github.com/rh-hideout/pokeemerald-expansion/pull/8697) +* Updating IsNonVolatileStatusBlocked by @bassforte123 in [#8728](https://github.com/rh-hideout/pokeemerald-expansion/pull/8728) +* Deleted unnecessary files by @Bassoonian in [#8899](https://github.com/rh-hideout/pokeemerald-expansion/pull/8899) +* Fix Metronome bans by @amiosi in [#8834](https://github.com/rh-hideout/pokeemerald-expansion/pull/8834) +* Move CMD_ARGS to battle_script_commands by @hedara90 in [#8974](https://github.com/rh-hideout/pokeemerald-expansion/pull/8974) + - `CMD_ARGS` for battle scripts now only exist in `src/battle_script_commands.c` +* Remove trailing whitespace - Master by @AsparagusEduardo in [#9011](https://github.com/rh-hideout/pokeemerald-expansion/pull/9011) +* Corrected Stone Axe and Ceaseless Edge descriptions by @fdeblasio in [#9062](https://github.com/rh-hideout/pokeemerald-expansion/pull/9062) +* Add aif2pcm to gitignore by @hedara90 in [#9077](https://github.com/rh-hideout/pokeemerald-expansion/pull/9077) +* Fixes Infiltrator test battler not using intended move by @PhallenTree in [#9096](https://github.com/rh-hideout/pokeemerald-expansion/pull/9096) + +## 🧪 Test Runner 🧪 +### Changed +* Add inverse battle type matchup test by @izrofid in [#8779](https://github.com/rh-hideout/pokeemerald-expansion/pull/8779) +* `B_ABILITY_TRIGGER_CHANCE` config tests by @AsparagusEduardo in [#8594](https://github.com/rh-hideout/pokeemerald-expansion/pull/8594) +* Support end-of-battle party data check in tests by @AsparagusEduardo in [#8831](https://github.com/rh-hideout/pokeemerald-expansion/pull/8831) + - If you added tests that checks for party data (`gPlayerParty`), make sure that you're not using a species which changes form at the end of the battle, as its data could be overriten by the form change. +* Only test if move name fits on the bag screen for moves names within a TM/HM by @estellarc in [#8882](https://github.com/rh-hideout/pokeemerald-expansion/pull/8882) +* Added tests for fainting form changes by @AsparagusEduardo in [#8912](https://github.com/rh-hideout/pokeemerald-expansion/pull/8912) +* Add tests for type-changing abilities by @Cle-bit in [#8794](https://github.com/rh-hideout/pokeemerald-expansion/pull/8794) +* Fixes Infiltrator test battler not using intended move by @PhallenTree in [#9096](https://github.com/rh-hideout/pokeemerald-expansion/pull/9096) + +### Fixed +* Fix Sticky Hold blocking user's own Trick or Bestow by @Cle-bit in [#8860](https://github.com/rh-hideout/pokeemerald-expansion/pull/8860) +* Fixes Nightmare not affecting Comatose and adds various missing tests by @Cle-bit in [#8859](https://github.com/rh-hideout/pokeemerald-expansion/pull/8859) +* Fixes Hyperspace Fury not breaking protection by @PhallenTree in [#8999](https://github.com/rh-hideout/pokeemerald-expansion/pull/8999) +* Fix Magnetic Flux target handling in singles by @Cle-bit in [#9007](https://github.com/rh-hideout/pokeemerald-expansion/pull/9007) +* Fix Foresight/Miracle Eye repeated-use behavior by @Cle-bit in [#9025](https://github.com/rh-hideout/pokeemerald-expansion/pull/9025) +* Fixes Beak Blast burning attacker when charging 2 turn move by @PhallenTree in [#9026](https://github.com/rh-hideout/pokeemerald-expansion/pull/9026) +* Fix Psych Up wrong battler message and Gen 6+ crit ratio copying by @Cle-bit in [#9015](https://github.com/rh-hideout/pokeemerald-expansion/pull/9015) +* Fix Pickpocket moveend target checks and Thief/Covet handoff by @Cle-bit in [#9037](https://github.com/rh-hideout/pokeemerald-expansion/pull/9037) + +## 📚 Documentation 📚 +* Add enum for battle script commands by @AlexOn1ine in [#8778](https://github.com/rh-hideout/pokeemerald-expansion/pull/8778) +* Port old list of credits to modern system by @Bassoonian in [#7887](https://github.com/rh-hideout/pokeemerald-expansion/pull/7887) +* Miscellaneous fixes to configs and other values by @amiosi in [#8662](https://github.com/rh-hideout/pokeemerald-expansion/pull/8662) +* Remove credits from code by @Bassoonian in [#8748](https://github.com/rh-hideout/pokeemerald-expansion/pull/8748) +* Miscellaneous species_info Changes by @amiosi in [#8462](https://github.com/rh-hideout/pokeemerald-expansion/pull/8462) +* Update CONTRIBUTING.md by @pkmnsnfrn in [#8879](https://github.com/rh-hideout/pokeemerald-expansion/pull/8879) +* Amend "SS Item" category of scope doc by @Pawkkie in [#8966](https://github.com/rh-hideout/pokeemerald-expansion/pull/8966) +* fix: updated rulings about big feature label by @pkmnsnfrn in [#9027](https://github.com/rh-hideout/pokeemerald-expansion/pull/9027) + +## 👻 Sprites 👻 +### Changed +* Changes to Item icons and palettes by @amiosi in [#8614](https://github.com/rh-hideout/pokeemerald-expansion/pull/8614) + +### Fixed +* Fix vivillon icy snow icon by @FosterProgramming in [#8970](https://github.com/rh-hideout/pokeemerald-expansion/pull/8970) +* Fix premier ball wrong data size by @FosterProgramming in [#8979](https://github.com/rh-hideout/pokeemerald-expansion/pull/8979) +* Fixes creation of certain overworld sprites in object_event_pic_tables_followers.h by @ChrispyChris27 in [#9065](https://github.com/rh-hideout/pokeemerald-expansion/pull/9065) + +## New Contributors +* @ostomachion made their first contribution in [#8904](https://github.com/rh-hideout/pokeemerald-expansion/pull/8904) +* @ChrispyChris27 made their first contribution in [#9065](https://github.com/rh-hideout/pokeemerald-expansion/pull/9065) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.14.2...expansion/1.14.3 + + + + diff --git a/include/constants/expansion.h b/include/constants/expansion.h index b280aefacc..ec46bd5df5 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,13 +1,13 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// Last version: 1.14.2 +// Last version: 1.14.3 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 14 #define EXPANSION_VERSION_PATCH 3 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE FALSE +#define EXPANSION_TAGGED_RELEASE TRUE #endif From c8b0d1b08c29e8a3a090aff5da15c4cb7e51a958 Mon Sep 17 00:00:00 2001 From: Hedara Date: Sun, 1 Feb 2026 17:13:46 +0100 Subject: [PATCH 28/36] 1.14.4 cycle start --- include/constants/expansion.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/expansion.h b/include/constants/expansion.h index ec46bd5df5..83ed2a13d6 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -4,10 +4,10 @@ // Last version: 1.14.3 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 14 -#define EXPANSION_VERSION_PATCH 3 +#define EXPANSION_VERSION_PATCH 4 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE TRUE +#define EXPANSION_TAGGED_RELEASE FALSE #endif From 65b1b5dd06102d3c8992552833f0653b3e2a0ad0 Mon Sep 17 00:00:00 2001 From: Estellar <137097857+estellarc@users.noreply.github.com> Date: Mon, 2 Feb 2026 05:40:26 -0300 Subject: [PATCH 29/36] `sPlayerAvatarGfxToStateFlag`'s graphics id to `u16` (#9101) --- src/field_player_avatar.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 56fe5868e5..3c4a1786cf 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -277,9 +277,9 @@ static const u8 sRSAvatarGfxIds[GENDER_COUNT] = [FEMALE] = OBJ_EVENT_GFX_LINK_RS_MAY }; -static const struct __attribute__((packed)) +static const struct PACKED { - u8 graphicsId; + u16 graphicsId; u8 playerFlag; } sPlayerAvatarGfxToStateFlag[GENDER_COUNT][5] = { From 69fc0925899b68b43a5560600bfc97381a47bd90 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 2 Feb 2026 14:12:15 +0100 Subject: [PATCH 30/36] Adds Parabolic Charge spread damage healing test (#9094) --- test/battle/move_effect/absorb.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test/battle/move_effect/absorb.c b/test/battle/move_effect/absorb.c index 922d16fa0c..101cb0af7b 100644 --- a/test/battle/move_effect/absorb.c +++ b/test/battle/move_effect/absorb.c @@ -132,3 +132,33 @@ SINGLE_BATTLE_TEST("Absorb does not drain any HP if the move is blocked by Disgu EXPECT_EQ(player->hp, 1); } } + +DOUBLE_BATTLE_TEST("Spread Move: Heals the correct amount from all Pokemon") +{ + s16 damage[3]; + s16 healed[3]; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_PARABOLIC_CHARGE) == EFFECT_ABSORB); + PLAYER(SPECIES_RAICHU) { HP(1); } + PLAYER(SPECIES_SQUIRTLE); + OPPONENT(SPECIES_SQUIRTLE); + OPPONENT(SPECIES_SQUIRTLE); + } WHEN { + TURN { MOVE(playerLeft, MOVE_PARABOLIC_CHARGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PARABOLIC_CHARGE, playerLeft); + + HP_BAR(opponentLeft, captureDamage: &damage[0]); + HP_BAR(playerRight, captureDamage: &damage[1]); + HP_BAR(opponentRight, captureDamage: &damage[2]); + + HP_BAR(playerLeft, captureDamage: &healed[0]); + HP_BAR(playerLeft, captureDamage: &healed[1]); + HP_BAR(playerLeft, captureDamage: &healed[2]); + } THEN { + EXPECT_MUL_EQ(damage[0], Q_4_12(-0.5), healed[0]); + EXPECT_MUL_EQ(damage[1], Q_4_12(-0.5), healed[1]); + EXPECT_MUL_EQ(damage[2], Q_4_12(-0.5), healed[2]); + } +} From 03c63f5e4a10a7ad82b161d2b8d99eb8ae08fd16 Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Mon, 2 Feb 2026 10:35:58 -0800 Subject: [PATCH 31/36] NO_WHITEOUT now prevent forfeits from B_RUN_TRAINER_BATTLE (#9112) --- src/battle_setup.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_setup.c b/src/battle_setup.c index 1ad284d05e..9b8a669255 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -940,6 +940,7 @@ static bool32 IsPlayerDefeated(u32 battleOutcome) { case B_OUTCOME_LOST: case B_OUTCOME_DREW: + case B_OUTCOME_FORFEITED: return TRUE; case B_OUTCOME_WON: case B_OUTCOME_RAN: From 4bf88de66945adcd69b34872766483be14b8b924 Mon Sep 17 00:00:00 2001 From: GGbond Date: Tue, 3 Feb 2026 03:49:49 +0800 Subject: [PATCH 32/36] Fix Leppa Berry PP restore target under forced-consumption effects (#9108) --- src/battle_hold_effects.c | 83 ++++++++++++++++++---------- test/battle/hold_effect/restore_pp.c | 28 ++++++++++ 2 files changed, 81 insertions(+), 30 deletions(-) diff --git a/src/battle_hold_effects.c b/src/battle_hold_effects.c index 9f363ea120..27b6f0247b 100644 --- a/src/battle_hold_effects.c +++ b/src/battle_hold_effects.c @@ -891,43 +891,66 @@ static u32 ItemRestorePp(u32 battler, u32 itemId, ActivationTiming timing) { enum ItemEffect effect = ITEM_NO_EFFECT; struct Pokemon *mon = GetBattlerMon(battler); - u32 i, changedPP = 0; + u32 changedPP = 0; + u32 restoreMove = MAX_MON_MOVES; + u32 missingMove = MAX_MON_MOVES; + u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); + bool32 override = gBattleScripting.overrideBerryRequirements; enum Ability ability = GetBattlerAbility(battler); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 i = 0; i < MAX_MON_MOVES; i++) { u32 move = GetMonData(mon, MON_DATA_MOVE1 + i); u32 currentPP = GetMonData(mon, MON_DATA_PP1 + i); - u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); - u32 maxPP = CalculatePPWithBonus(move, ppBonuses, i); - if (move && (currentPP == 0 || (gBattleScripting.overrideBerryRequirements && currentPP != maxPP))) + if (move == MOVE_NONE) + continue; + + if (currentPP == 0) { - u32 ppRestored = GetItemHoldEffectParam(itemId); - - if (ability == ABILITY_RIPEN) - { - ppRestored *= 2; - gBattlerAbility = battler; - } - if (currentPP + ppRestored > maxPP) - changedPP = maxPP; - else - changedPP = currentPP + ppRestored; - - PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); - - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_BerryPPHealEnd2); - else - BattleScriptCall(BattleScript_BerryPPHealRet); - - gBattleScripting.battler = battler; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); - MarkBattlerForControllerExec(battler); - if (MOVE_IS_PERMANENT(battler, i)) - gBattleMons[battler].pp[i] = changedPP; - effect = ITEM_PP_CHANGE; + restoreMove = i; + break; } + + if (override && missingMove == MAX_MON_MOVES) + { + u32 maxPP = CalculatePPWithBonus(move, ppBonuses, i); + if (currentPP < maxPP) + missingMove = i; + } + } + + if (restoreMove == MAX_MON_MOVES && override) + restoreMove = missingMove; + + if (restoreMove != MAX_MON_MOVES) + { + u32 move = GetMonData(mon, MON_DATA_MOVE1 + restoreMove); + u32 currentPP = GetMonData(mon, MON_DATA_PP1 + restoreMove); + u32 maxPP = CalculatePPWithBonus(move, ppBonuses, restoreMove); + u32 ppRestored = GetItemHoldEffectParam(itemId); + + if (ability == ABILITY_RIPEN) + { + ppRestored *= 2; + gBattlerAbility = battler; + } + changedPP = currentPP + ppRestored; + if (changedPP > maxPP) + changedPP = maxPP; + + PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); + + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryPPHealEnd2); + else + BattleScriptCall(BattleScript_BerryPPHealRet); + + gBattleScripting.battler = battler; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, restoreMove + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); + MarkBattlerForControllerExec(battler); + if (MOVE_IS_PERMANENT(battler, restoreMove)) + gBattleMons[battler].pp[restoreMove] = changedPP; + effect = ITEM_PP_CHANGE; } return effect; } diff --git a/test/battle/hold_effect/restore_pp.c b/test/battle/hold_effect/restore_pp.c index c3810652a4..8b3ae83141 100644 --- a/test/battle/hold_effect/restore_pp.c +++ b/test/battle/hold_effect/restore_pp.c @@ -21,3 +21,31 @@ SINGLE_BATTLE_TEST("Restore PP berry activates immediately on switch in") EXPECT(player->item == ITEM_NONE); } } + +SINGLE_BATTLE_TEST("Forced Leppa Berry consumption restores a move at 0 PP before other missing PP") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); Moves(MOVE_FLING); } + OPPONENT(SPECIES_WYNAUT) { MovesWithPP({MOVE_SCRATCH, 6}, {MOVE_CELEBRATE, 0}, {MOVE_POUND, 35}); } + } WHEN { + TURN { MOVE(player, MOVE_FLING); MOVE(opponent, MOVE_POUND); } + } THEN { + EXPECT_EQ(opponent->pp[0], 6); + EXPECT_EQ(opponent->pp[1], 10); + } +} + +SINGLE_BATTLE_TEST("Forced Leppa Berry consumption restores the first move found missing PP when none are at 0") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); Moves(MOVE_FLING); } + OPPONENT(SPECIES_WYNAUT) { MovesWithPP({MOVE_SCRATCH, 6}, {MOVE_CELEBRATE, 6}, {MOVE_POUND, 35}); } + } WHEN { + TURN { MOVE(player, MOVE_FLING); MOVE(opponent, MOVE_POUND); } + } THEN { + EXPECT_EQ(opponent->pp[0], 16); + EXPECT_EQ(opponent->pp[1], 6); + } +} From 564cc3e73ecd73d61ef0be4fb6b6ec185a73e73c Mon Sep 17 00:00:00 2001 From: GGbond Date: Wed, 4 Feb 2026 01:32:39 +0800 Subject: [PATCH 33/36] Fix Instruct failing improperly when the instructed move isn't in the target's moveset (#9113) --- src/battle_script_commands.c | 11 ++++++++--- test/battle/move_effect/instruct.c | 23 ++++++++++++++++++++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 759fcaee92..64073dbadd 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -17391,21 +17391,26 @@ void BS_TryInstruct(void) gSpecialStatuses[gBattlerTarget].instructedChosenTarget = gBattleStruct->moveTarget[gBattlerTarget] | 0x4; gCalledMove = move; u32 moveIndex; + bool32 foundMove = FALSE; for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { if (gBattleMons[gBattlerTarget].moves[moveIndex] == gCalledMove) { - gCurrMovePos = moveIndex; - moveIndex = MAX_MON_MOVES; + foundMove = TRUE; break; } } - if (moveIndex != MAX_MON_MOVES || gBattleMons[gBattlerTarget].pp[gCurrMovePos] == 0) + if (!foundMove) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (gBattleMons[gBattlerTarget].pp[moveIndex] == 0) { gBattlescriptCurrInstr = cmd->failInstr; } else { + gCurrMovePos = moveIndex; gBattleScripting.battler = gBattlerAttacker; // for message gEffectBattler = gBattleStruct->lastMoveTarget[gBattlerTarget]; gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/test/battle/move_effect/instruct.c b/test/battle/move_effect/instruct.c index 04f5558155..2f97cda162 100644 --- a/test/battle/move_effect/instruct.c +++ b/test/battle/move_effect/instruct.c @@ -97,7 +97,7 @@ DOUBLE_BATTLE_TEST("Instruct fails if target doesn't know the last move it used" GIVEN { ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_ORICORIO) { Moves(MOVE_SCRATCH, MOVE_POUND, MOVE_SCRATCH, MOVE_CELEBRATE); } + PLAYER(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Moves(MOVE_SCRATCH, MOVE_POUND, MOVE_SCRATCH, MOVE_CELEBRATE); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -113,6 +113,27 @@ DOUBLE_BATTLE_TEST("Instruct fails if target doesn't know the last move it used" } } +DOUBLE_BATTLE_TEST("Instruct fails if the instructed move's PP is depleted") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(20); Moves(MOVE_INSTRUCT, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Speed(30); MovesWithPP({MOVE_SCRATCH, 1}, {MOVE_CELEBRATE, 10}); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + } WHEN { + TURN { MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); } + TURN { MOVE(playerLeft, MOVE_INSTRUCT, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerRight); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerRight); + } + } THEN { + EXPECT_EQ(playerRight->pp[0], 0); + } +} + DOUBLE_BATTLE_TEST("Instruct-called move fails if it can only be used on the first turn but consumes PP") { GIVEN { From 83be28dc37ce857a1abc2b1f95fbd47f802a2a61 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Fri, 6 Feb 2026 11:53:41 +0100 Subject: [PATCH 34/36] Fix migration script output from move anim documentation (#9140) Co-authored-by: Hedara --- data/battle_anim_scripts.s | 104 ++++++++++++++++++++++++------------- 1 file changed, 69 insertions(+), 35 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 4c213d37bf..78f45c1c61 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2434,32 +2434,39 @@ gBattleAnimMove_DracoMeteor:: call DracoMeteor2 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=40, y=32@; For Meteor 1 createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=40, y=32@; For Meteor 1 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 delay 7 call DracoMeteor3 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=-8, y=32@; For Meteor 2 delay 7 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=-8, y=32@; For Meteor 2 + delay 7 call DracoMeteor4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=32@; For Meteor 3 delay 7 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=32@; For Meteor 3 + delay 7 call DracoMeteor1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=-8, y=32@; For Meteor 4 createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=-8, y=32@; For Meteor 4 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 delay 7 call DracoMeteor2 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=40, y=32@; For Meteor 1 delay 7 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=40, y=32@; For Meteor 1 + delay 7 call DracoMeteor3 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=32@; For Meteor 3 delay 15 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=32@; For Meteor 3 + delay 15 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=32@; For Meteor 3 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 2, 1 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=32@; For Meteor 3 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 2, 1 delay 7 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB(1, 2, 11) waitforvisualfinish @@ -4918,7 +4925,8 @@ gBattleAnimMove_Hex:: createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 2, 0, 37, 1 playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET delay 32 - blend_color_cycle selector=F_PAL_TARGET, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(10, 2, 19)@;Deep purple createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 4 + blend_color_cycle selector=F_PAL_TARGET, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(10, 2, 19)@;Deep purple + createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 4 waitforvisualfinish clearmonbg ANIM_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 16, 0, RGB(10, 2, 19) @;Deep purple @@ -7706,7 +7714,8 @@ gBattleAnimMove_TrickOrTreat:: createvisualtask AnimTask_ScaryFace, 5 delay 13 waitforvisualfinish - blend_color_cycle selector=F_PAL_TARGET, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(10, 2, 19)@;Deep purple playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET + blend_color_cycle selector=F_PAL_TARGET, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(10, 2, 19)@;Deep purple + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 14, 1 waitforvisualfinish @@ -9278,7 +9287,8 @@ gBattleAnimMove_OblivionWing:: call OblivionWingBeam call OblivionWingBeam createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 40, 1 - blend_color_cycle selector=F_PAL_TARGET, delay=2, num_blends=4, initial_blend_y=0, target_blend_y=12, color=RGB(31, 4, 10)@Pinkish Red call OblivionWingBeam + blend_color_cycle selector=F_PAL_TARGET, delay=2, num_blends=4, initial_blend_y=0, target_blend_y=12, color=RGB(31, 4, 10)@Pinkish Red + call OblivionWingBeam call OblivionWingBeam call OblivionWingBeam call OblivionWingBeam @@ -13183,7 +13193,8 @@ gBattleAnimMove_DynamaxCannon:: createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 2, 15, 0, 0 fadetobg BG_DYNAMAX_CANNON waitbgfadein - blend_color_cycle selector=F_PAL_TARGET, delay=4, num_blends=4, initial_blend_y=0, target_blend_y=12, color=RGB(31, 4, 10)@Pinkish Red panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER SOUND_PAN_TARGET 2 0 + blend_color_cycle selector=F_PAL_TARGET, delay=4, num_blends=4, initial_blend_y=0, target_blend_y=12, color=RGB(31, 4, 10)@Pinkish Red + panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER SOUND_PAN_TARGET 2 0 shake_mon_or_platform velocity=4, shake_timer=1, shake_duration=180, type=1 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 87, 1 call DynamaxCannonLaunch @@ -13316,7 +13327,8 @@ gBattleAnimMove_TarShot:: playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 15 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 - blend_color_cycle selector=F_PAL_TARGET, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK@;Black createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xffe6, 0xffe8, 0x0, 0xf, 0x37 + blend_color_cycle selector=F_PAL_TARGET, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK@;Black + createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xffe6, 0xffe8, 0x0, 0xf, 0x37 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xf, 0xffe5, 0x0, 0xC, 0x32 @@ -14288,7 +14300,8 @@ gBattleAnimMove_Eternabeam:: call OblivionWingBeam call OblivionWingBeam createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 - blend_color_cycle selector=F_PAL_TARGET, delay=2, num_blends=4, initial_blend_y=0, target_blend_y=12, color=RGB(31, 4, 10)@Pinkish Red call OblivionWingBeam + blend_color_cycle selector=F_PAL_TARGET, delay=2, num_blends=4, initial_blend_y=0, target_blend_y=12, color=RGB(31, 4, 10)@Pinkish Red + call OblivionWingBeam call OblivionWingBeam call OblivionWingBeam call OblivionWingBeam @@ -15039,7 +15052,8 @@ gBattleAnimMove_CorrosiveGas:: monbg ANIM_ATTACKER loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER, 0x8, 0x3 delay 0 - blend_color_cycle selector=F_PAL_ATTACKER, delay=1, num_blends=2, initial_blend_y=0, target_blend_y=15, color=RGB(15, 15, 6)@;Garbage green createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x7a, 0x3, 0xfff2, 0x12, 0x2e + blend_color_cycle selector=F_PAL_ATTACKER, delay=1, num_blends=2, initial_blend_y=0, target_blend_y=15, color=RGB(15, 15, 6)@;Garbage green + createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x7a, 0x3, 0xfff2, 0x12, 0x2e delay 0 createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x79, 0x3, 0xe, 0xfff2, 0x2e delay 0 @@ -15052,7 +15066,8 @@ gBattleAnimMove_CorrosiveGas:: createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x7b, 0x3, 0x4, 0x4, 0x1e waitforvisualfinish playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET - blend_color_cycle selector=(F_PAL_BG | F_PAL_TARGET | F_PAL_ATK_PARTNER | F_PAL_DEF_PARTNER), delay=1, num_blends=2, initial_blend_y=0, target_blend_y=14, color=RGB(15, 15, 6)@;Garbage green waitforvisualfinish + blend_color_cycle selector=(F_PAL_BG | F_PAL_TARGET | F_PAL_ATK_PARTNER | F_PAL_DEF_PARTNER), delay=1, num_blends=2, initial_blend_y=0, target_blend_y=14, color=RGB(15, 15, 6)@;Garbage green + waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -15432,7 +15447,8 @@ gBattleAnimMove_DragonEnergy:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(30, 2, 11) @;Regidrago Reddish Reddish, Purple monbg ANIM_TARGET playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER - blend_color_cycle selector=F_PAL_ATTACKER, delay=0, num_blends=4, initial_blend_y=0, target_blend_y=11, color=RGB(31, 28, 31)@;Pinkish White waitforvisualfinish + blend_color_cycle selector=F_PAL_ATTACKER, delay=0, num_blends=4, initial_blend_y=0, target_blend_y=11, color=RGB(31, 28, 31)@;Pinkish White + waitforvisualfinish playsewithpan SE_M_DETECT, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 16, 0, RGB(30, 2, 11) @;Regidrago Reddish Reddish, Purple createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -120, 0, 0, 1 @;Slide off off, screen @@ -15494,7 +15510,8 @@ gBattleAnimMove_FreezingGlare:: createvisualtask AnimTask_GlareEyeDots, 0x5, 0x0 playsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER waitforvisualfinish - blend_color_cycle selector=F_PAL_TARGET, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(12, 26, 31)@;Ice blue createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 28, 1 + blend_color_cycle selector=F_PAL_TARGET, delay=2, num_blends=2, initial_blend_y=0, target_blend_y=12, color=RGB(12, 26, 31)@;Ice blue + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 28, 1 call IceCrystalEffectShort waitforvisualfinish call UnsetPsychicBg @@ -19776,28 +19793,34 @@ TeraBlastRock: call TeraBlastRock2 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=40, y=16@; For Meteor 1 createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=40, y=16@; For Meteor 1 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 delay 3 call TeraBlastRock3 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=-8, y=16@; For Meteor 2 delay 3 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=-8, y=16@; For Meteor 2 + delay 3 call TeraBlastRock4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=16@; For Meteor 3 delay 3 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=16@; For Meteor 3 + delay 3 call TeraBlastRock1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=-8, y=16@; For Meteor 4 createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=-8, y=16@; For Meteor 4 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 delay 3 call TeraBlastRock2 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=40, y=16@; For Meteor 1 delay 3 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=40, y=16@; For Meteor 1 + delay 3 call TeraBlastRock3 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=16@; For Meteor 3 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=16@; For Meteor 3 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 call EternabeamGeyser delay 5 call EternabeamGeyser @@ -20229,28 +20252,34 @@ TeraBlastWater: call TeraBlastWater2 playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=40, y=16@; For Meteor 1 createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=40, y=16@; For Meteor 1 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 delay 3 call TeraBlastWater3 playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=-8, y=16@; For Meteor 2 delay 3 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=-8, y=16@; For Meteor 2 + delay 3 call TeraBlastWater4 playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=16@; For Meteor 3 delay 3 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=16@; For Meteor 3 + delay 3 call TeraBlastWater1 playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=-8, y=16@; For Meteor 4 createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=-8, y=16@; For Meteor 4 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 delay 3 call TeraBlastWater2 playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=40, y=16@; For Meteor 1 delay 3 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=40, y=16@; For Meteor 1 + delay 3 call TeraBlastWater3 playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET - create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=16@; For Meteor 3 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + create_dragon_rage_fire_plume_sprite ANIM_ATTACKER, 2, relative_to=ANIM_TARGET, x=21, y=16@; For Meteor 3 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 call EternabeamGeyser delay 5 call EternabeamGeyser @@ -34851,7 +34880,8 @@ gBattleAnimMove_10000000VoltThunderbolt:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 delay 16 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - invert_screen_color scenery=0x101@thunder flash createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER @ charge + invert_screen_color scenery=0x101@thunder flash + createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER @ charge createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 64, -36 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 64, -20 @@ -34865,7 +34895,8 @@ gBattleAnimMove_10000000VoltThunderbolt:: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 delay 20 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - invert_screen_color scenery=0x101@thunder flash createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -64, -36 + invert_screen_color scenery=0x101@thunder flash + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -64, -36 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -64, -20 delay 1 @@ -34878,7 +34909,8 @@ gBattleAnimMove_10000000VoltThunderbolt:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 delay 20 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - invert_screen_color scenery=0x101@thunder flash createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -112, -36 + invert_screen_color scenery=0x101@thunder flash + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -112, -36 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -112, -20 delay 1 @@ -34891,7 +34923,8 @@ gBattleAnimMove_10000000VoltThunderbolt:: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 delay 16 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - invert_screen_color scenery=0x101@thunder flash createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -48, -36 + invert_screen_color scenery=0x101@thunder flash + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -48, -36 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -48, -20 delay 1 @@ -34912,7 +34945,7 @@ gBattleAnimMove_10000000VoltThunderbolt:: loadspritegfx ANIM_TAG_POISON_BUBBLE @purple loopsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER, 0x5, 0xA createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 -flash_anim_tag_with_color tag=ANIM_TAG_ORBS, delay=1, num_blends=12, color1=RGB_RED, blend_y1=16, color2=0, blend_y2=0 + @flash_anim_tag_with_color tag=ANIM_TAG_ORBS, delay=1, num_blends=12, color1=RGB_RED, blend_y1=16, color2=0, blend_y2=0 call TenMillionVoltThunderboltBeamRed call TenMillionVoltThunderboltBeamBlue createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 @@ -35400,7 +35433,8 @@ PulverizingPancakeFinish: createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 delay 7 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - create_basic_hitsplat_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0@big hit marker delay 0 + create_basic_hitsplat_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0@big hit marker + delay 0 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 4, 44 createsprite gPulverizingPancakeYellowRingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x100, 0x0 delay 5 From 32d1777b7a48d52cd2f029bfc53111e43d3259f3 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 6 Feb 2026 07:57:33 -0300 Subject: [PATCH 35/36] Use direct config names instead of enum names (#8824) --- data/battle_scripts_1.s | 26 +- include/constants/generational_changes.h | 362 +++++++++--------- include/generational_changes.h | 4 +- include/test/battle.h | 4 +- src/battle_ai_main.c | 12 +- src/battle_ai_switch_items.c | 18 +- src/battle_ai_util.c | 34 +- src/battle_end_turn.c | 6 +- src/battle_main.c | 12 +- src/battle_pike.c | 2 +- src/battle_script_commands.c | 100 ++--- src/battle_util.c | 118 +++--- src/generational_changes.c | 4 +- test/battle/ability/aerilate.c | 2 +- test/battle/ability/arena_trap.c | 6 +- test/battle/ability/battle_bond.c | 10 +- test/battle/ability/competitive.c | 4 +- test/battle/ability/cute_charm.c | 2 +- test/battle/ability/dancer.c | 4 +- test/battle/ability/dauntless_shield.c | 4 +- test/battle/ability/defiant.c | 4 +- test/battle/ability/disguise.c | 4 +- test/battle/ability/drizzle.c | 6 +- test/battle/ability/drought.c | 6 +- test/battle/ability/effect_spore.c | 8 +- test/battle/ability/flame_body.c | 2 +- test/battle/ability/gale_wings.c | 2 +- test/battle/ability/galvanize.c | 2 +- test/battle/ability/heatproof.c | 3 +- test/battle/ability/illusion.c | 2 +- test/battle/ability/infiltrator.c | 6 +- test/battle/ability/inner_focus.c | 4 +- test/battle/ability/intrepid_sword.c | 4 +- test/battle/ability/keen_eye.c | 12 +- test/battle/ability/leaf_guard.c | 4 +- test/battle/ability/lightning_rod.c | 6 +- test/battle/ability/liquid_ooze.c | 4 +- test/battle/ability/magic_bounce.c | 2 +- test/battle/ability/moody.c | 6 +- test/battle/ability/normalize.c | 8 +- test/battle/ability/oblivious.c | 6 +- test/battle/ability/overcoat.c | 4 +- test/battle/ability/own_tempo.c | 4 +- test/battle/ability/parental_bond.c | 10 +- test/battle/ability/pickup.c | 2 +- test/battle/ability/pixilate.c | 2 +- test/battle/ability/poison_point.c | 2 +- test/battle/ability/prankster.c | 10 +- test/battle/ability/protean.c | 4 +- test/battle/ability/protosynthesis.c | 2 +- test/battle/ability/rattled.c | 4 +- test/battle/ability/refrigerate.c | 4 +- test/battle/ability/sand_stream.c | 6 +- test/battle/ability/scrappy.c | 4 +- test/battle/ability/shed_skin.c | 2 +- test/battle/ability/snow_warning.c | 20 +- test/battle/ability/stalwart.c | 2 +- test/battle/ability/static.c | 2 +- test/battle/ability/sticky_hold.c | 2 +- test/battle/ability/storm_drain.c | 4 +- test/battle/ability/sturdy.c | 2 +- test/battle/ability/super_luck.c | 2 +- test/battle/ability/symbiosis.c | 4 +- test/battle/ability/synchronize.c | 4 +- test/battle/ability/weak_armor.c | 8 +- test/battle/ai/ai.c | 6 +- test/battle/ai/ai_check_viability.c | 6 +- test/battle/ai/ai_doubles.c | 2 +- test/battle/ai/ai_flag_predict_switch.c | 2 +- test/battle/ai/ai_switching.c | 12 +- test/battle/ai/check_bad_move.c | 2 +- test/battle/badge_boost.c | 10 +- test/battle/crit_chance.c | 4 +- test/battle/damage_formula.c | 4 +- test/battle/exp.c | 2 +- test/battle/form_change/end_battle.c | 4 +- test/battle/form_change/mega_evolution.c | 6 +- test/battle/form_change/ultra_burst.c | 2 +- test/battle/gimmick/dynamax.c | 8 +- test/battle/gimmick/zmove.c | 6 +- test/battle/hold_effect/booster_energy.c | 2 +- test/battle/hold_effect/critical_up.c | 2 +- test/battle/hold_effect/iron_ball.c | 2 +- test/battle/hold_effect/leek.c | 2 +- test/battle/hold_effect/life_orb.c | 2 +- test/battle/hold_effect/light_ball.c | 2 +- test/battle/hold_effect/lucky_punch.c | 2 +- test/battle/hold_effect/safety_goggles.c | 2 +- test/battle/hold_effect/scope_lens.c | 2 +- test/battle/item_effect/dire_hit.c | 2 +- test/battle/move.c | 2 +- test/battle/move_effect/after_you.c | 4 +- test/battle/move_effect/ally_switch.c | 4 +- test/battle/move_effect/beat_up.c | 28 +- test/battle/move_effect/conversion_2.c | 20 +- test/battle/move_effect/copycat.c | 2 +- test/battle/move_effect/court_change.c | 4 +- test/battle/move_effect/defog.c | 18 +- test/battle/move_effect/destiny_bond.c | 8 +- test/battle/move_effect/dragon_cheer.c | 7 +- test/battle/move_effect/encore.c | 4 +- .../battle/move_effect/fail_if_not_arg_type.c | 2 +- test/battle/move_effect/fell_stinger.c | 2 +- test/battle/move_effect/fling.c | 2 +- test/battle/move_effect/focus_energy.c | 8 +- test/battle/move_effect/foresight.c | 4 +- test/battle/move_effect/heal_bell.c | 10 +- test/battle/move_effect/healing_wish.c | 8 +- test/battle/move_effect/instruct.c | 4 +- test/battle/move_effect/lunar_dance.c | 8 +- test/battle/move_effect/metronome.c | 2 +- test/battle/move_effect/minimize.c | 2 +- test/battle/move_effect/miracle_eye.c | 4 +- test/battle/move_effect/mirror_move.c | 2 +- test/battle/move_effect/moonlight.c | 6 +- test/battle/move_effect/morning_sun.c | 6 +- test/battle/move_effect/mud_sport.c | 2 +- test/battle/move_effect/multi_hit.c | 8 +- test/battle/move_effect/parting_shot.c | 20 +- test/battle/move_effect/pledge.c | 2 +- test/battle/move_effect/powder.c | 8 +- test/battle/move_effect/protect.c | 4 +- test/battle/move_effect/psych_up.c | 8 +- test/battle/move_effect/psychic_terrain.c | 2 +- test/battle/move_effect/pursuit.c | 2 +- test/battle/move_effect/quash.c | 4 +- test/battle/move_effect/rage_fist.c | 4 +- test/battle/move_effect/recoil_if_miss.c | 2 +- test/battle/move_effect/sheer_cold.c | 4 +- test/battle/move_effect/sleep_talk.c | 4 +- test/battle/move_effect/steal_item.c | 2 +- test/battle/move_effect/synthesis.c | 6 +- test/battle/move_effect/tailwind.c | 6 +- test/battle/move_effect/teatime.c | 2 +- test/battle/move_effect/teleport.c | 10 +- test/battle/move_effect/toxic.c | 2 +- test/battle/move_effect/upper_hand.c | 2 +- test/battle/move_effect/water_sport.c | 2 +- test/battle/move_effect/wish.c | 6 +- test/battle/move_effect_secondary/dire_claw.c | 2 +- test/battle/move_effect_secondary/paralysis.c | 2 +- .../battle/move_effect_secondary/tri_attack.c | 2 +- test/battle/move_effect_secondary/wrap.c | 6 +- .../move_effects_combined/triple_arrows.c | 2 +- test/battle/move_flags/cant_use_twice.c | 2 +- test/battle/move_flags/critical_hit_stage.c | 2 +- test/battle/move_flags/powder.c | 2 +- test/battle/sleep_clause.c | 20 +- test/battle/spread_moves.c | 4 +- test/battle/status1/burn.c | 2 +- test/battle/status1/frostbite.c | 2 +- test/battle/status1/paralysis.c | 6 +- test/battle/status1/sleep.c | 4 +- test/battle/trainer_slides.c | 2 +- test/battle/volatiles/confusion.c | 4 +- test/battle/weather/sandstorm.c | 2 +- 156 files changed, 694 insertions(+), 696 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4f0645838b..25262692d7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1185,7 +1185,7 @@ BattleScript_EffectPartingShotTrySpAtk: statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectPartingShotMaybeSwitch call BattleScript_EffectPartingShotMaybePrintStat BattleScript_EffectPartingShotMaybeSwitch: - jumpifgenconfiglowerthan CONFIG_PARTING_SHOT_SWITCH, GEN_7, BattleScript_EffectPartingShotSwitch + jumpifgenconfiglowerthan CONFIG_B_PARTING_SHOT_SWITCH, GEN_7, BattleScript_EffectPartingShotSwitch jumpifbyte CMP_NOT_EQUAL, sB_ANIM_TARGETS_HIT, 0, BattleScript_EffectPartingShotSwitch goto BattleScript_MoveEnd @@ -1534,7 +1534,7 @@ BattleScript_EffectHitEnemyHealAlly:: BattleScript_EffectDefog:: setstatchanger STAT_EVASION, 1, TRUE attackcanceler - jumpifgenconfiglowerthan CONFIG_DEFOG_EFFECT_CLEARING, GEN_5, BattleScript_DefogAfterSubstituteCheck + jumpifgenconfiglowerthan CONFIG_B_DEFOG_EFFECT_CLEARING, GEN_5, BattleScript_DefogAfterSubstituteCheck jumpifsubstituteblocks BattleScript_DefogIfCanClearHazards BattleScript_DefogAfterSubstituteCheck: jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_EVASION, MIN_STAT_STAGE, BattleScript_DefogWorks @@ -1542,7 +1542,7 @@ BattleScript_DefogIfCanClearHazards: trydefog FALSE, BattleScript_ButItFailed BattleScript_DefogWorks: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - jumpifgenconfiglowerthan CONFIG_DEFOG_EFFECT_CLEARING, GEN_5, BattleScript_DefogWorksAfterSubstituteCheck + jumpifgenconfiglowerthan CONFIG_B_DEFOG_EFFECT_CLEARING, GEN_5, BattleScript_DefogWorksAfterSubstituteCheck jumpifsubstituteblocks BattleScript_DefogTryHazardsWithAnim BattleScript_DefogWorksAfterSubstituteCheck: statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefogTryHazardsWithAnim @@ -2071,7 +2071,7 @@ BattleScript_EffectHealingWish:: setatkhptozero tryfaintmon BS_ATTACKER storehealingwish BS_ATTACKER - jumpifgenconfiglowerthan CONFIG_HEALING_WISH_SWITCH, GEN_5, BattleScript_EffectHealingWishGen4 + jumpifgenconfiglowerthan CONFIG_B_HEALING_WISH_SWITCH, GEN_5, BattleScript_EffectHealingWishGen4 BattleScript_EffectHealingWishEnd: moveendall end @@ -2357,7 +2357,7 @@ BattleScript_TryTailwindAbilitiesLoop_WindPower: BattleScript_EffectMiracleEye:: attackcanceler accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - jumpifgenconfiglowerthan CONFIG_MIRACLE_EYE_FAIL, GEN_5, BattleScript_MiracleEyeSet + jumpifgenconfiglowerthan CONFIG_B_MIRACLE_EYE_FAIL, GEN_5, BattleScript_MiracleEyeSet jumpifvolatile BS_TARGET, VOLATILE_MIRACLE_EYE, BattleScript_ButItFailed BattleScript_MiracleEyeSet: setvolatile BS_TARGET, VOLATILE_MIRACLE_EYE @@ -3380,7 +3380,7 @@ BattleScript_EffectMeanLook:: accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifvolatile BS_TARGET, VOLATILE_ESCAPE_PREVENTION, BattleScript_ButItFailed jumpifsubstituteblocks BattleScript_ButItFailed - jumpifgenconfiglowerthan CONFIG_GHOSTS_ESCAPE, GEN_6, BattleScript_EffectMeanLookGen5 + jumpifgenconfiglowerthan CONFIG_B_GHOSTS_ESCAPE, GEN_6, BattleScript_EffectMeanLookGen5 jumpiftype BS_TARGET, TYPE_GHOST, BattleScript_ButItFailed BattleScript_EffectMeanLookGen5: attackanimation @@ -3409,7 +3409,7 @@ BattleScript_NightmareWorked:: BattleScript_EffectMinimize:: attackcanceler setvolatile BS_ATTACKER, VOLATILE_MINIMIZE - jumpifgenconfiglowerthan CONFIG_MINIMIZE_EVASION, GEN_5, BattleScript_EffectMinimizeGen4 + jumpifgenconfiglowerthan CONFIG_B_MINIMIZE_EVASION, GEN_5, BattleScript_EffectMinimizeGen4 setstatchanger STAT_EVASION, 2, FALSE goto BattleScript_EffectStatUpAfterAtkCanceler BattleScript_EffectMinimizeGen4: @@ -3483,8 +3483,8 @@ BattleScript_EffectSpikes:: BattleScript_EffectForesight:: attackcanceler accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON - jumpifgenconfiglowerthan CONFIG_FORESIGHT_FAIL, GEN_3, BattleScript_ForesightFailCheck - jumpifgenconfiglowerthan CONFIG_FORESIGHT_FAIL, GEN_5, BattleScript_ForesightSet + jumpifgenconfiglowerthan CONFIG_B_FORESIGHT_FAIL, GEN_3, BattleScript_ForesightFailCheck + jumpifgenconfiglowerthan CONFIG_B_FORESIGHT_FAIL, GEN_5, BattleScript_ForesightSet BattleScript_ForesightFailCheck: jumpifvolatile BS_TARGET, VOLATILE_FORESIGHT, BattleScript_ButItFailed BattleScript_ForesightSet: @@ -3795,7 +3795,7 @@ BattleScript_EffectFutureSight:: goto BattleScript_MoveEnd BattleScript_EffectTeleport:: - jumpifgenconfiglowerthan CONFIG_TELEPORT_BEHAVIOR, GEN_8, BattleScript_EffectTeleportGen7 + jumpifgenconfiglowerthan CONFIG_B_TELEPORT_BEHAVIOR, GEN_8, BattleScript_EffectTeleportGen7 jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_EffectBatonPass jumpifside BS_ATTACKER, B_SIDE_PLAYER, BattleScript_EffectBatonPass goto BattleScript_DoEffectTeleport @@ -3814,7 +3814,7 @@ BattleScript_DoEffectTeleport:: goto BattleScript_MoveEnd BattleScript_EffectBeatUp:: - jumpifgenconfiglowerthan CONFIG_BEAT_UP, GEN_5, BattleScript_EffectBeatUpGen3 + jumpifgenconfiglowerthan CONFIG_B_BEAT_UP, GEN_5, BattleScript_EffectBeatUpGen3 goto BattleScript_EffectHit BattleScript_EffectBeatUpGen3: @@ -5974,7 +5974,7 @@ BattleScript_CudChewActivates:: end2 BattleScript_ApplyDisguiseFormChangeHPLoss:: - jumpifgenconfiglowerthan CONFIG_DISGUISE_HP_LOSS, GEN_8, BattleScript_ApplyDisguiseFormChangeHPLossReturn + jumpifgenconfiglowerthan CONFIG_B_DISGUISE_HP_LOSS, GEN_8, BattleScript_ApplyDisguiseFormChangeHPLossReturn healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE BattleScript_ApplyDisguiseFormChangeHPLossReturn: @@ -7338,7 +7338,7 @@ BattleScript_WeakArmorDefPrintString: printstring STRINGID_TARGETABILITYSTATLOWER waitmessage B_WAIT_TIME_LONG BattleScript_WeakArmorActivatesSpeed: - jumpifgenconfiglowerthan CONFIG_WEAK_ARMOR_SPEED, GEN_7, BattleScript_WeakArmorSetSpeedGen6 + jumpifgenconfiglowerthan CONFIG_B_WEAK_ARMOR_SPEED, GEN_7, BattleScript_WeakArmorSetSpeedGen6 setstatchanger STAT_SPEED, 2, FALSE goto BattleScript_WeakArmorDoSpeed BattleScript_WeakArmorSetSpeedGen6: diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index 09724839b0..0a5331c342 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -4,202 +4,202 @@ /* Config definitions */ #define CONFIG_DEFINITIONS(F) \ /* Calculation settings */ \ - F(CRIT_CHANCE, critChance, (u32, GEN_COUNT - 1)) \ - F(CRIT_MULTIPLIER, critMultiplier, (u32, GEN_COUNT - 1)) \ - F(PARALYSIS_SPEED, paralysisSpeed, (u32, GEN_COUNT - 1)) \ - F(CONFUSION_SELF_DMG_CHANCE, confusionSelfDmgChance, (u32, GEN_COUNT - 1)) \ - F(MULTI_HIT_CHANCE, multiHitChance, (u32, GEN_COUNT - 1)) \ - F(WHITEOUT_MONEY, whiteoutMoney, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(LIGHT_BALL_ATTACK_BOOST, lightBallAttackBoost, (u32, GEN_COUNT - 1)) \ + F(B_CRIT_CHANCE, critChance, (u32, GEN_COUNT - 1)) \ + F(B_CRIT_MULTIPLIER, critMultiplier, (u32, GEN_COUNT - 1)) \ + F(B_PARALYSIS_SPEED, paralysisSpeed, (u32, GEN_COUNT - 1)) \ + F(B_CONFUSION_SELF_DMG_CHANCE, confusionSelfDmgChance, (u32, GEN_COUNT - 1)) \ + F(B_MULTI_HIT_CHANCE, multiHitChance, (u32, GEN_COUNT - 1)) \ + F(B_WHITEOUT_MONEY, whiteoutMoney, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_LIGHT_BALL_ATTACK_BOOST, lightBallAttackBoost, (u32, GEN_COUNT - 1)) \ /* Experience settings */ \ - F(EXP_CATCH, expCatch, (u32, GEN_COUNT - 1)) \ - F(TRAINER_EXP_MULTIPLIER, trainerExpMultiplier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SPLIT_EXP, splitExp, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SCALED_EXP, scaledExp, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(UNEVOLVED_EXP_MULTIPLIER, unevolvedExpMultiplier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(LEVEL_UP_NOTIFICATION, levelUpNotification, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_EXP_CATCH, expCatch, (u32, GEN_COUNT - 1)) \ + F(B_TRAINER_EXP_MULTIPLIER, trainerExpMultiplier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SPLIT_EXP, splitExp, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SCALED_EXP, scaledExp, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_UNEVOLVED_EXP_MULTIPLIER, unevolvedExpMultiplier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_LEVEL_UP_NOTIFICATION, levelUpNotification, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ /* Stat settings */ \ - F(BADGE_BOOST, badgeBoost, (u32, GEN_COUNT - 1)) \ - F(FRIENDSHIP_BOOST, friendshipBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(MAX_LEVEL_EV_GAINS, maxLevelEvGains, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(RECALCULATE_STATS, recalculateStats, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_BADGE_BOOST, badgeBoost, (u32, GEN_COUNT - 1)) \ + F(B_FRIENDSHIP_BOOST, friendshipBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_MAX_LEVEL_EV_GAINS, maxLevelEvGains, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_RECALCULATE_STATS, recalculateStats, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ /* Damage settings */ \ - F(BURN_DAMAGE, burnDamage, (u32, GEN_COUNT - 1)) \ - F(BURN_FACADE_DMG, burnFacadeDmg, (u32, GEN_COUNT - 1)) \ - F(BINDING_DAMAGE, bindingDamage, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(PSYWAVE_DMG, psywaveDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(PAYBACK_SWITCH_BOOST, paybackSwitchBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(HIDDEN_POWER_DMG, hiddenPowerDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(ROUGH_SKIN_DMG, roughSkinDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(KNOCK_OFF_DMG, knockOffDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SPORT_DMG_REDUCTION, sportDmgReduction, (u32, GEN_COUNT - 1)) \ - F(EXPLOSION_DEFENSE, explosionDefense, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(PARENTAL_BOND_DMG, parentalBondDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(MULTIPLE_TARGETS_DMG, multipleTargetsDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_BURN_DAMAGE, burnDamage, (u32, GEN_COUNT - 1)) \ + F(B_BURN_FACADE_DMG, burnFacadeDmg, (u32, GEN_COUNT - 1)) \ + F(B_BINDING_DAMAGE, bindingDamage, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_PSYWAVE_DMG, psywaveDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_PAYBACK_SWITCH_BOOST, paybackSwitchBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_HIDDEN_POWER_DMG, hiddenPowerDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_ROUGH_SKIN_DMG, roughSkinDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_KNOCK_OFF_DMG, knockOffDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SPORT_DMG_REDUCTION, sportDmgReduction, (u32, GEN_COUNT - 1)) \ + F(B_EXPLOSION_DEFENSE, explosionDefense, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_PARENTAL_BOND_DMG, parentalBondDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_MULTIPLE_TARGETS_DMG, multipleTargetsDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ /* Type settings */ \ - F(GHOSTS_ESCAPE, ghostsEscape, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(PARALYZE_ELECTRIC, paralyzeElectric, (u32, GEN_COUNT - 1)) \ - F(POWDER_GRASS, powderGrass, (u32, GEN_COUNT - 1)) \ - F(POWDER_OVERCOAT, powderOvercoat, (u32, GEN_COUNT - 1)) \ - F(UPDATED_TYPE_MATCHUPS, updatedTypeMatchups, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(PRANKSTER_DARK_TYPES, pranksterDarkTypes, (u32, GEN_COUNT - 1)) \ - F(SHEER_COLD_IMMUNITY, sheerColdImmunity, (u32, GEN_COUNT - 1)) \ - F(ROOST_PURE_FLYING, roostPureFlying, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(STATUS_TYPE_IMMUNITY, statusTypeImmunity, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_GHOSTS_ESCAPE, ghostsEscape, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_PARALYZE_ELECTRIC, paralyzeElectric, (u32, GEN_COUNT - 1)) \ + F(B_POWDER_GRASS, powderGrass, (u32, GEN_COUNT - 1)) \ + F(B_POWDER_OVERCOAT, powderOvercoat, (u32, GEN_COUNT - 1)) \ + F(B_UPDATED_TYPE_MATCHUPS, updatedTypeMatchups, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_PRANKSTER_DARK_TYPES, pranksterDarkTypes, (u32, GEN_COUNT - 1)) \ + F(B_SHEER_COLD_IMMUNITY, sheerColdImmunity, (u32, GEN_COUNT - 1)) \ + F(B_ROOST_PURE_FLYING, roostPureFlying, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_STATUS_TYPE_IMMUNITY, statusTypeImmunity, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ /* Turn settings */ \ - F(BINDING_TURNS, bindingTurns, (u32, GEN_COUNT - 1)) \ - F(UPROAR_TURNS, uproarTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(UPROAR_IGNORE_SOUNDPROOF, uproarIgnoreSoundproof, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(DISABLE_TURNS, disableTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(TAILWIND_TURNS, tailwindTurns, (u32, GEN_COUNT - 1)) \ - F(SLEEP_TURNS, sleepTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(TAUNT_TURNS, tauntTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SPORT_TURNS, sportTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(MEGA_EVO_TURN_ORDER, megaEvoTurnOrder, (u32, GEN_COUNT - 1)) \ - F(RECALC_TURN_AFTER_ACTIONS, recalcTurnAfterActions, (u32, GEN_COUNT - 1)) \ - F(FAINT_SWITCH_IN, faintSwitchIn, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_BINDING_TURNS, bindingTurns, (u32, GEN_COUNT - 1)) \ + F(B_UPROAR_TURNS, uproarTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_UPROAR_IGNORE_SOUNDPROOF, uproarIgnoreSoundproof, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_DISABLE_TURNS, disableTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_TAILWIND_TURNS, tailwindTurns, (u32, GEN_COUNT - 1)) \ + F(B_SLEEP_TURNS, sleepTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_TAUNT_TURNS, tauntTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SPORT_TURNS, sportTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_MEGA_EVO_TURN_ORDER, megaEvoTurnOrder, (u32, GEN_COUNT - 1)) \ + F(B_RECALC_TURN_AFTER_ACTIONS, recalcTurnAfterActions, (u32, GEN_COUNT - 1)) \ + F(B_FAINT_SWITCH_IN, faintSwitchIn, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ /* Move data settings */ \ - F(UPDATED_MOVE_DATA, updatedMoveData, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(UPDATED_MOVE_TYPES, updatedMoveTypes, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(UPDATED_MOVE_FLAGS, updatedMoveFlags, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(PHYSICAL_SPECIAL_SPLIT, physicalSpecialSplit, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(RECOIL_IF_MISS_DMG, recoilIfMissDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(KLUTZ_FLING_INTERACTION, klutzFlingInteraction, (u32, GEN_COUNT - 1)) \ - F(UPDATED_CONVERSION, updatedConversion, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(UPDATED_CONVERSION_2, updatedConversion2, (u32, GEN_COUNT - 1)) \ - F(PP_REDUCED_BY_SPITE, ppReducedBySpite, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(EXTRAPOLATED_MOVE_FLAGS, extrapolatedMoveFlags, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_UPDATED_MOVE_DATA, updatedMoveData, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_UPDATED_MOVE_TYPES, updatedMoveTypes, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_UPDATED_MOVE_FLAGS, updatedMoveFlags, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_PHYSICAL_SPECIAL_SPLIT, physicalSpecialSplit, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_RECOIL_IF_MISS_DMG, recoilIfMissDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_KLUTZ_FLING_INTERACTION, klutzFlingInteraction, (u32, GEN_COUNT - 1)) \ + F(B_UPDATED_CONVERSION, updatedConversion, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_UPDATED_CONVERSION_2, updatedConversion2, (u32, GEN_COUNT - 1)) \ + F(B_PP_REDUCED_BY_SPITE, ppReducedBySpite, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_EXTRAPOLATED_MOVE_FLAGS, extrapolatedMoveFlags, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ /* Ability data settings */ \ - F(UPDATED_ABILITY_DATA, updatedAbilityData, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_UPDATED_ABILITY_DATA, updatedAbilityData, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ /* Move accuracy settings */ \ - F(TOXIC_NEVER_MISS, toxicNeverMiss, (u32, GEN_COUNT - 1)) \ - F(MINIMIZE_DMG_ACC, minimizeDmgAcc, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(BLIZZARD_HAIL, blizzardHail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SHEER_COLD_ACC, sheerColdAcc, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_TOXIC_NEVER_MISS, toxicNeverMiss, (u32, GEN_COUNT - 1)) \ + F(B_MINIMIZE_DMG_ACC, minimizeDmgAcc, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_BLIZZARD_HAIL, blizzardHail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SHEER_COLD_ACC, sheerColdAcc, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ /* Move stat change settings */ \ - F(FELL_STINGER_STAT_RAISE, fellStingerStatRaise, (u32, GEN_COUNT - 1)) \ - F(KINGS_SHIELD_LOWER_ATK, kingsShieldLowerAtk, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SPEED_BUFFING_RAPID_SPIN, speedBuffingRapidSpin, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(CHARGE_SPDEF_RAISE, chargeSpDefRaise, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(MINIMIZE_EVASION, minimizeEvasion, (u32, GEN_COUNT - 1)) \ - F(GROWTH_STAT_RAISE, growthStatRaise, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(FOCUS_ENERGY_CRIT_RATIO, focusEnergyCritRatio, (u32, GEN_COUNT - 1)) \ - F(PSYCH_UP_CRIT_RATIO, psychUpCritRatio, (u32, GEN_COUNT - 1)) \ + F(B_FELL_STINGER_STAT_RAISE, fellStingerStatRaise, (u32, GEN_COUNT - 1)) \ + F(B_KINGS_SHIELD_LOWER_ATK, kingsShieldLowerAtk, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SPEED_BUFFING_RAPID_SPIN, speedBuffingRapidSpin, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_CHARGE_SPDEF_RAISE, chargeSpDefRaise, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_MINIMIZE_EVASION, minimizeEvasion, (u32, GEN_COUNT - 1)) \ + F(B_GROWTH_STAT_RAISE, growthStatRaise, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_FOCUS_ENERGY_CRIT_RATIO, focusEnergyCritRatio, (u32, GEN_COUNT - 1)) \ + F(B_PSYCH_UP_CRIT_RATIO, psychUpCritRatio, (u32, GEN_COUNT - 1)) \ /* Other move settings */ \ - F(INCINERATE_GEMS, incinerateGems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(CAN_SPITE_FAIL, canSpiteFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(CRASH_IF_TARGET_IMMUNE, crashIfTargetImmune, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(MEMENTO_FAIL, mementoFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(PARTING_SHOT_SWITCH, partingShotSwitch, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(GLARE_GHOST, glareGhost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SKILL_SWAP, skillSwap, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(BRICK_BREAK, brickBreak, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(WISH_HP_SOURCE, wishHpSource, (u32, GEN_COUNT - 1)) \ - F(RAMPAGE_CANCELLING, rampageCancelling, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(HEAL_BLOCKING, healBlocking, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(ROOTED_GROUNDING, rootedGrounding, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(METRONOME_MOVES, metronomeMoves, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(TELEPORT_BEHAVIOR, teleportBehavior, (u32, GEN_COUNT - 1)) \ - F(BEAT_UP, beatUp, (u32, GEN_COUNT - 1)) \ - F(DARK_VOID_FAIL, darkVoidFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(BURN_HIT_THAW, burnHitThaw, (u32, GEN_COUNT - 1)) \ - F(HEALING_WISH_SWITCH, healingWishSwitch, (u32, GEN_COUNT - 1)) \ - F(DEFOG_EFFECT_CLEARING, defogEffectClearing, (u32, GEN_COUNT - 1)) \ - F(STOCKPILE_RAISES_DEFS, stockpileRaisesDefs, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(TRANSFORM_SHINY, transformShiny, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(TRANSFORM_FORM_CHANGES, transformFormChanges, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(WIDE_GUARD, wideGuard, (u32, GEN_COUNT - 1)) \ - F(QUICK_GUARD, quickGuard, (u32, GEN_COUNT - 1)) \ - F(IMPRISON, imprison, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(ALLY_SWITCH_FAIL_CHANCE, allySwitchFailChance, (u32, GEN_COUNT - 1)) \ - F(SKETCH_BANS, sketchBans, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(KNOCK_OFF_REMOVAL, knockOffRemoval, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(HEAL_BELL_SOUNDPROOF, healBellSoundproof, (u32, GEN_COUNT - 1)) \ - F(CHARGE, charge, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(POWDER_RAIN, powderRain, (u32, GEN_COUNT - 1)) \ - F(AFTER_YOU_TURN_ORDER, afterYouTurnOrder, (u32, GEN_COUNT - 1)) \ - F(QUASH_TURN_ORDER, quashTurnOrder, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(DESTINY_BOND_FAIL, destinyBondFail, (u32, GEN_COUNT - 1)) \ - F(FORESIGHT_FAIL, foresightFail, (u32, GEN_COUNT - 1)) \ - F(MIRACLE_EYE_FAIL, miracleEyeFail, (u32, GEN_COUNT - 1)) \ - F(PURSUIT_TARGET, pursuitTarget, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SKIP_RECHARGE, skipRecharge, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(ENCORE_TARGET, encoreTarget, (u32, GEN_COUNT - 1)) \ - F(TIME_OF_DAY_HEALING_MOVES, timeOfDayHealingMoves, (u32, GEN_COUNT - 1)) \ - F(DREAM_EATER_LIQUID_OOZE, dreamEaterLiquidOoze, (u32, GEN_COUNT - 1)) \ + F(B_INCINERATE_GEMS, incinerateGems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_CAN_SPITE_FAIL, canSpiteFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_CRASH_IF_TARGET_IMMUNE, crashIfTargetImmune, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_MEMENTO_FAIL, mementoFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_PARTING_SHOT_SWITCH, partingShotSwitch, (u32, GEN_COUNT - 1)) \ + F(B_GLARE_GHOST, glareGhost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SKILL_SWAP, skillSwap, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_BRICK_BREAK, brickBreak, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_WISH_HP_SOURCE, wishHpSource, (u32, GEN_COUNT - 1)) \ + F(B_RAMPAGE_CANCELLING, rampageCancelling, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_HEAL_BLOCKING, healBlocking, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_ROOTED_GROUNDING, rootedGrounding, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_METRONOME_MOVES, metronomeMoves, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_TELEPORT_BEHAVIOR, teleportBehavior, (u32, GEN_COUNT - 1)) \ + F(B_BEAT_UP, beatUp, (u32, GEN_COUNT - 1)) \ + F(B_DARK_VOID_FAIL, darkVoidFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_BURN_HIT_THAW, burnHitThaw, (u32, GEN_COUNT - 1)) \ + F(B_HEALING_WISH_SWITCH, healingWishSwitch, (u32, GEN_COUNT - 1)) \ + F(B_DEFOG_EFFECT_CLEARING, defogEffectClearing, (u32, GEN_COUNT - 1)) \ + F(B_STOCKPILE_RAISES_DEFS, stockpileRaisesDefs, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_TRANSFORM_SHINY, transformShiny, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_TRANSFORM_FORM_CHANGES, transformFormChanges, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_WIDE_GUARD, wideGuard, (u32, GEN_COUNT - 1)) \ + F(B_QUICK_GUARD, quickGuard, (u32, GEN_COUNT - 1)) \ + F(B_IMPRISON, imprison, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_ALLY_SWITCH_FAIL_CHANCE, allySwitchFailChance, (u32, GEN_COUNT - 1)) \ + F(B_SKETCH_BANS, sketchBans, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_KNOCK_OFF_REMOVAL, knockOffRemoval, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_HEAL_BELL_SOUNDPROOF, healBellSoundproof, (u32, GEN_COUNT - 1)) \ + F(B_CHARGE, charge, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_POWDER_RAIN, powderRain, (u32, GEN_COUNT - 1)) \ + F(B_AFTER_YOU_TURN_ORDER, afterYouTurnOrder, (u32, GEN_COUNT - 1)) \ + F(B_QUASH_TURN_ORDER, quashTurnOrder, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_DESTINY_BOND_FAIL, destinyBondFail, (u32, GEN_COUNT - 1)) \ + F(B_FORESIGHT_FAIL, foresightFail, (u32, GEN_COUNT - 1)) \ + F(B_MIRACLE_EYE_FAIL, miracleEyeFail, (u32, GEN_COUNT - 1)) \ + F(B_PURSUIT_TARGET, pursuitTarget, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SKIP_RECHARGE, skipRecharge, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_ENCORE_TARGET, encoreTarget, (u32, GEN_COUNT - 1)) \ + F(B_TIME_OF_DAY_HEALING_MOVES, timeOfDayHealingMoves, (u32, GEN_COUNT - 1)) \ + F(B_DREAM_EATER_LIQUID_OOZE, dreamEaterLiquidOoze, (u32, GEN_COUNT - 1)) \ /* Ability settings */ \ - F(GALE_WINGS, galeWings, (u32, GEN_COUNT - 1)) \ - F(STANCE_CHANGE_FAIL, stanceChangeFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SHADOW_TAG_ESCAPE, shadowTagEscape, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(MOODY_ACC_EVASION, moodyAccEvasion, (u32, GEN_COUNT - 1)) \ - F(FLASH_FIRE_FROZEN, flashFireFrozen, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SYNCHRONIZE_TOXIC, synchronizeToxic, (u32, GEN_COUNT - 1)) \ - F(UPDATED_INTIMIDATE, updatedIntimidate, (u32, GEN_COUNT - 1)) \ - F(OBLIVIOUS_TAUNT, obliviousTaunt, (u32, GEN_COUNT - 1)) \ - F(STURDY, sturdy, (u32, GEN_COUNT - 1)) \ - F(PLUS_MINUS_INTERACTION, plusMinusInteraction, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(WEATHER_FORMS, weatherForms, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SYMBIOSIS_GEMS, symbiosisGems, (u32, GEN_COUNT - 1)) \ - F(ABSORBING_ABILITY_STRING, absorbingAbilityString, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(REDIRECT_ABILITY_IMMUNITY, redirectAbilityImmunity, (u32, GEN_COUNT - 1)) \ - F(REDIRECT_ABILITY_ALLIES, redirectAbilityAllies, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(LEAF_GUARD_PREVENTS_REST, leafGuardPreventsRest, (u32, GEN_COUNT - 1)) \ - F(TRANSISTOR_BOOST, transistorBoost, (u32, GEN_COUNT - 1)) \ - F(ILLUMINATE_EFFECT, illuminateEffect, (u32, GEN_COUNT - 1)) \ - F(WEAK_ARMOR_SPEED, weakArmorSpeed, (u32, GEN_COUNT - 1)) \ - F(PROTEAN_LIBERO, proteanLibero, (u32, GEN_COUNT - 1)) \ - F(INTREPID_SWORD, intrepidSword, (u32, GEN_COUNT - 1)) \ - F(DAUNTLESS_SHIELD, dauntlessShield, (u32, GEN_COUNT - 1)) \ - F(DISGUISE_HP_LOSS, disguiseHpLoss, (u32, GEN_COUNT - 1)) \ - F(ABILITY_TRIGGER_CHANCE, abilityTriggerChance, (u32, GEN_COUNT - 1)) \ - F(PICKUP_WILD, pickupWild, (u32, GEN_COUNT - 1)) \ - F(MAGIC_GUARD, magicGuard, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(BATTLE_BOND, battleBond, (u32, GEN_COUNT - 1)) \ - F(ATE_MULTIPLIER, ateMultiplier, (u32, GEN_COUNT - 1)) \ - F(DEFIANT_STICKY_WEB, defiantStickyWeb, (u32, GEN_COUNT - 1)) \ - F(INFILTRATOR_SUBSTITUTE, infiltratorSubstitute, (u32, GEN_COUNT - 1)) \ + F(B_GALE_WINGS, galeWings, (u32, GEN_COUNT - 1)) \ + F(B_STANCE_CHANGE_FAIL, stanceChangeFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SHADOW_TAG_ESCAPE, shadowTagEscape, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_MOODY_ACC_EVASION, moodyAccEvasion, (u32, GEN_COUNT - 1)) \ + F(B_FLASH_FIRE_FROZEN, flashFireFrozen, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SYNCHRONIZE_TOXIC, synchronizeToxic, (u32, GEN_COUNT - 1)) \ + F(B_UPDATED_INTIMIDATE, updatedIntimidate, (u32, GEN_COUNT - 1)) \ + F(B_OBLIVIOUS_TAUNT, obliviousTaunt, (u32, GEN_COUNT - 1)) \ + F(B_STURDY, sturdy, (u32, GEN_COUNT - 1)) \ + F(B_PLUS_MINUS_INTERACTION, plusMinusInteraction, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_WEATHER_FORMS, weatherForms, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SYMBIOSIS_GEMS, symbiosisGems, (u32, GEN_COUNT - 1)) \ + F(B_ABSORBING_ABILITY_STRING, absorbingAbilityString, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_REDIRECT_ABILITY_IMMUNITY, redirectAbilityImmunity, (u32, GEN_COUNT - 1)) \ + F(B_REDIRECT_ABILITY_ALLIES, redirectAbilityAllies, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_LEAF_GUARD_PREVENTS_REST, leafGuardPreventsRest, (u32, GEN_COUNT - 1)) \ + F(B_TRANSISTOR_BOOST, transistorBoost, (u32, GEN_COUNT - 1)) \ + F(B_ILLUMINATE_EFFECT, illuminateEffect, (u32, GEN_COUNT - 1)) \ + F(B_WEAK_ARMOR_SPEED, weakArmorSpeed, (u32, GEN_COUNT - 1)) \ + F(B_PROTEAN_LIBERO, proteanLibero, (u32, GEN_COUNT - 1)) \ + F(B_INTREPID_SWORD, intrepidSword, (u32, GEN_COUNT - 1)) \ + F(B_DAUNTLESS_SHIELD, dauntlessShield, (u32, GEN_COUNT - 1)) \ + F(B_DISGUISE_HP_LOSS, disguiseHpLoss, (u32, GEN_COUNT - 1)) \ + F(B_ABILITY_TRIGGER_CHANCE, abilityTriggerChance, (u32, GEN_COUNT - 1)) \ + F(B_PICKUP_WILD, pickupWild, (u32, GEN_COUNT - 1)) \ + F(B_MAGIC_GUARD, magicGuard, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_BATTLE_BOND, battleBond, (u32, GEN_COUNT - 1)) \ + F(B_ATE_MULTIPLIER, ateMultiplier, (u32, GEN_COUNT - 1)) \ + F(B_DEFIANT_STICKY_WEB, defiantStickyWeb, (u32, GEN_COUNT - 1)) \ + F(B_INFILTRATOR_SUBSTITUTE, infiltratorSubstitute, (u32, GEN_COUNT - 1)) \ /* Item settings */ \ - F(CONFUSE_BERRIES_HEAL, confuseBerriesHeal, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(X_ITEMS_BUFF, xItemsBuff, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(MENTAL_HERB, mentalHerb, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(TRAINERS_KNOCK_OFF_ITEMS, trainersKnockOffItems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(RETURN_STOLEN_NPC_ITEMS, returnStolenNpcItems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(STEAL_WILD_ITEMS, stealWildItems, (u32, GEN_COUNT - 1)) \ - F(RESTORE_HELD_BATTLE_ITEMS, restoreHeldBattleItems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SOUL_DEW_BOOST, soulDewBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(NET_BALL_MODIFIER, netBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(DIVE_BALL_MODIFIER, diveBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(NEST_BALL_MODIFIER, nestBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(REPEAT_BALL_MODIFIER, repeatBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(TIMER_BALL_MODIFIER, timerBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(DUSK_BALL_MODIFIER, duskBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(QUICK_BALL_MODIFIER, quickBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(LURE_BALL_MODIFIER, lureBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(HEAVY_BALL_MODIFIER, heavyBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(DREAM_BALL_MODIFIER, dreamBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SPORT_BALL_MODIFIER, sportBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SAFARI_BALL_MODIFIER, safariBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(FRIEND_BALL_MODIFIER, friendBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SERENE_GRACE_BOOST, sereneGraceBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(IRON_BALL, ironBall, (u32, GEN_COUNT - 1)) \ + F(B_CONFUSE_BERRIES_HEAL, confuseBerriesHeal, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_X_ITEMS_BUFF, xItemsBuff, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_MENTAL_HERB, mentalHerb, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_TRAINERS_KNOCK_OFF_ITEMS, trainersKnockOffItems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_RETURN_STOLEN_NPC_ITEMS, returnStolenNpcItems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_STEAL_WILD_ITEMS, stealWildItems, (u32, GEN_COUNT - 1)) \ + F(B_RESTORE_HELD_BATTLE_ITEMS, restoreHeldBattleItems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SOUL_DEW_BOOST, soulDewBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_NET_BALL_MODIFIER, netBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_DIVE_BALL_MODIFIER, diveBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_NEST_BALL_MODIFIER, nestBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_REPEAT_BALL_MODIFIER, repeatBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_TIMER_BALL_MODIFIER, timerBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_DUSK_BALL_MODIFIER, duskBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_QUICK_BALL_MODIFIER, quickBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_LURE_BALL_MODIFIER, lureBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_HEAVY_BALL_MODIFIER, heavyBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_DREAM_BALL_MODIFIER, dreamBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SPORT_BALL_MODIFIER, sportBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SAFARI_BALL_MODIFIER, safariBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_FRIEND_BALL_MODIFIER, friendBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SERENE_GRACE_BOOST, sereneGraceBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_IRON_BALL, ironBall, (u32, GEN_COUNT - 1)) \ /* Weather settings */ \ - F(ABILITY_WEATHER, abilityWeather, (u32, GEN_COUNT - 1)) \ - F(SANDSTORM_SPDEF_BOOST, sandstormSpDefBoost, (u32, GEN_COUNT - 1)) \ - F(OVERWORLD_FOG, overworldFog, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(OVERWORLD_SNOW, overworldSnow, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SNOW_WARNING, snowWarning, (u32, GEN_COUNT - 1)) \ - F(PREFERRED_ICE_WEATHER, preferredIceWeather, (u32, B_ICE_WEATHER_SNOW)) /* TODO: use in tests */ \ + F(B_ABILITY_WEATHER, abilityWeather, (u32, GEN_COUNT - 1)) \ + F(B_SANDSTORM_SPDEF_BOOST, sandstormSpDefBoost, (u32, GEN_COUNT - 1)) \ + F(B_OVERWORLD_FOG, overworldFog, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_OVERWORLD_SNOW, overworldSnow, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SNOW_WARNING, snowWarning, (u32, GEN_COUNT - 1)) \ + F(B_PREFERRED_ICE_WEATHER, preferredIceWeather, (u32, B_ICE_WEATHER_SNOW)) /* TODO: use in tests */ \ /* Terrain settings */ \ - F(TERRAIN_TYPE_BOOST, terrainTypeBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SECRET_POWER_EFFECT, secretPowerEffect, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(SECRET_POWER_ANIMATION, secretPowerAnimation, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(NATURE_POWER_MOVES, naturePowerMoves, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(CAMOUFLAGE_TYPES, camouflageTypes, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_TERRAIN_TYPE_BOOST, terrainTypeBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SECRET_POWER_EFFECT, secretPowerEffect, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_SECRET_POWER_ANIMATION, secretPowerAnimation, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_NATURE_POWER_MOVES, naturePowerMoves, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_CAMOUFLAGE_TYPES, camouflageTypes, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ /* Other settings */ \ - F(WILD_NATURAL_ENEMIES, wildNaturalEnemies, (u32, TRUE)) /* TODO: use in tests */ \ - F(AFFECTION_MECHANICS, affectionMechanics, (u32, TRUE)) /* TODO: use in tests */ \ - F(OBEDIENCE_MECHANICS, obedienceMechanics, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ - F(USE_FROSTBITE, useFrostbite, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_WILD_NATURAL_ENEMIES, wildNaturalEnemies, (u32, TRUE)) /* TODO: use in tests */ \ + F(B_AFFECTION_MECHANICS, affectionMechanics, (u32, TRUE)) /* TODO: use in tests */ \ + F(B_OBEDIENCE_MECHANICS, obedienceMechanics, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(B_USE_FROSTBITE, useFrostbite, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ #define GET_CONFIG_MAXIMUM(_typeMaxValue, ...) INVOKE_WITH_B(GET_CONFIG_MAXIMUM_, _typeMaxValue) diff --git a/include/generational_changes.h b/include/generational_changes.h index 2e6767ca84..fc1ed0132f 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -16,7 +16,9 @@ struct GenChanges // ... }; -u32 GetConfig(enum ConfigTag configTag); +#define GetConfig(name) GetConfigInternal(CONFIG_##name) + +u32 GetConfigInternal(enum ConfigTag configTag); void SetConfig(enum ConfigTag configTag, u32 value); #if TESTING diff --git a/include/test/battle.h b/include/test/battle.h index 7c4d285f6f..4c1784659c 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -309,7 +309,7 @@ * of `enum ConfigTag` * Example: * GIVEN { - * WITH_CONFIG(CONFIG_GALE_WINGS, GEN_6); + * WITH_CONFIG(B_GALE_WINGS, GEN_6); * } * The `value` may be inferred from a local variable, e.g. set by * PARAMETRIZE. @@ -970,7 +970,7 @@ struct moveWithPP { #define AI_LOG AILogScores(__LINE__) #define FLAG_SET(flagId) SetFlagForTest(__LINE__, flagId) -#define WITH_CONFIG(configTag, value) TestSetConfig(__LINE__, configTag, value) +#define WITH_CONFIG(configTag, value) TestSetConfig(__LINE__, CONFIG_##configTag, value) #define PLAYER(species) for (OpenPokemon(__LINE__, B_POSITION_PLAYER_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) #define OPPONENT(species) for (OpenPokemon(__LINE__, B_POSITION_OPPONENT_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index e0490b6712..68cf333b57 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1267,7 +1267,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // def partner ability checks // gen7+ dark type mons immune to priority->elevated moves from prankster - if (GetConfig(CONFIG_PRANKSTER_DARK_TYPES) >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK) + if (GetConfig(B_PRANKSTER_DARK_TYPES) >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK) && aiData->abilities[battlerAtk] == ABILITY_PRANKSTER && IsBattleMoveStatus(move) && !(moveTarget & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER))) RETURN_SCORE_MINUS(10); @@ -1729,7 +1729,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_SHEER_COLD: - if (GetConfig(CONFIG_SHEER_COLD_IMMUNITY) >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) + if (GetConfig(B_SHEER_COLD_IMMUNITY) >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) RETURN_SCORE_MINUS(20); // fallthrough case EFFECT_OHKO: @@ -3396,7 +3396,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_VOLT_ABSORB: if (moveType == TYPE_ELECTRIC) { - if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) < GEN_5 && atkPartnerAbility == ABILITY_LIGHTNING_ROD) + if (GetConfig(B_REDIRECT_ABILITY_IMMUNITY) < GEN_5 && atkPartnerAbility == ABILITY_LIGHTNING_ROD) { RETURN_SCORE_MINUS(10); } @@ -3442,7 +3442,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_STORM_DRAIN: if (moveType == TYPE_WATER) { - if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) < GEN_5 && atkPartnerAbility == ABILITY_STORM_DRAIN) + if (GetConfig(B_REDIRECT_ABILITY_IMMUNITY) < GEN_5 && atkPartnerAbility == ABILITY_STORM_DRAIN) { RETURN_SCORE_MINUS(10); } @@ -5395,7 +5395,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru case EFFECT_ION_DELUGE: if ((aiData->abilities[battlerAtk] == ABILITY_VOLT_ABSORB || aiData->abilities[battlerAtk] == ABILITY_MOTOR_DRIVE - || (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD)) + || (GetConfig(B_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD)) && predictedType == TYPE_NORMAL) ADJUST_SCORE(DECENT_EFFECT); break; @@ -5455,7 +5455,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru if (predictedMove != MOVE_NONE && (aiData->abilities[battlerAtk] == ABILITY_VOLT_ABSORB || aiData->abilities[battlerAtk] == ABILITY_MOTOR_DRIVE - || (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD))) + || (GetConfig(B_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD))) { ADJUST_SCORE(DECENT_EFFECT); } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index defc1c3c89..f5d105d04c 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -298,7 +298,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) // Check if mon gets one shot if (maxDamageTaken > gBattleMons[battler].hp - && !(gItemsInfo[gBattleMons[battler].item].holdEffect == HOLD_EFFECT_FOCUS_SASH || (!IsMoldBreakerTypeAbility(opposingBattler, gAiLogicData->abilities[opposingBattler]) && GetConfig(CONFIG_STURDY) >= GEN_5 && aiAbility == ABILITY_STURDY))) + && !(gItemsInfo[gBattleMons[battler].item].holdEffect == HOLD_EFFECT_FOCUS_SASH || (!IsMoldBreakerTypeAbility(opposingBattler, gAiLogicData->abilities[opposingBattler]) && GetConfig(B_STURDY) >= GEN_5 && aiAbility == ABILITY_STURDY))) { getsOneShot = TRUE; } @@ -534,14 +534,14 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_WATER_ABSORB; absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_DRY_SKIN; - if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5) + if (GetConfig(B_REDIRECT_ABILITY_IMMUNITY) >= GEN_5) absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_STORM_DRAIN; } if (incomingType == TYPE_ELECTRIC || (isOpposingBattlerChargingOrInvulnerable && incomingType == TYPE_ELECTRIC)) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_VOLT_ABSORB; absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_MOTOR_DRIVE; - if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5) + if (GetConfig(B_REDIRECT_ABILITY_IMMUNITY) >= GEN_5) absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_LIGHTNING_ROD; } if (incomingType == TYPE_GRASS || (isOpposingBattlerChargingOrInvulnerable && incomingType == TYPE_GRASS)) @@ -567,7 +567,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) } if (IsPowderMove(incomingMove) || (isOpposingBattlerChargingOrInvulnerable && IsPowderMove(incomingMove))) { - if (GetConfig(CONFIG_POWDER_OVERCOAT) >= GEN_6) + if (GetConfig(B_POWDER_OVERCOAT) >= GEN_6) absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_OVERCOAT; } if (numAbsorbingAbilities == 0) @@ -720,7 +720,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) && gAiLogicData->abilities[opposingBattler] != ABILITY_UNAWARE && gAiLogicData->abilities[opposingBattler] != ABILITY_KEEN_EYE && gAiLogicData->abilities[opposingBattler] != ABILITY_MINDS_EYE - && (GetConfig(CONFIG_ILLUMINATE_EFFECT) >= GEN_9 && gAiLogicData->abilities[opposingBattler] != ABILITY_ILLUMINATE) + && (GetConfig(B_ILLUMINATE_EFFECT) >= GEN_9 && gAiLogicData->abilities[opposingBattler] != ABILITY_ILLUMINATE) && !gBattleMons[battler].volatiles.foresight && !gBattleMons[battler].volatiles.miracleEye) switchMon = FALSE; @@ -1763,7 +1763,7 @@ static u32 GetSwitchinStatusDamage(u32 battler) { if (status & STATUS1_BURN) { - if (GetConfig(CONFIG_BURN_DAMAGE) >= GEN_7 || GetConfig(CONFIG_BURN_DAMAGE) == GEN_1) + if (GetConfig(B_BURN_DAMAGE) >= GEN_7 || GetConfig(B_BURN_DAMAGE) == GEN_1) statusDamage = maxHP / 16; else statusDamage = maxHP / 8; @@ -1774,7 +1774,7 @@ static u32 GetSwitchinStatusDamage(u32 battler) } else if (status & STATUS1_FROSTBITE) { - if (GetConfig(CONFIG_BURN_DAMAGE) >= GEN_7 || GetConfig(CONFIG_BURN_DAMAGE) == GEN_1) + if (GetConfig(B_BURN_DAMAGE) >= GEN_7 || GetConfig(B_BURN_DAMAGE) == GEN_1) statusDamage = maxHP / 16; else statusDamage = maxHP / 8; @@ -1858,7 +1858,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) currentHP = currentHP - damageTaken; // One shot prevention effects - if (damageTaken >= maxHP && startingHP == maxHP && (heldItemEffect == HOLD_EFFECT_FOCUS_SASH || (!opponentCanBreakMold && GetConfig(CONFIG_STURDY) >= GEN_5 && ability == ABILITY_STURDY)) && hitsToKO < 1) + if (damageTaken >= maxHP && startingHP == maxHP && (heldItemEffect == HOLD_EFFECT_FOCUS_SASH || (!opponentCanBreakMold && GetConfig(B_STURDY) >= GEN_5 && ability == ABILITY_STURDY)) && hitsToKO < 1) currentHP = 1; // If mon is still alive, apply weather impact first, as it might KO the mon before it can heal with its item (order is weather -> item -> status) @@ -2050,7 +2050,7 @@ static s32 GetMaxPriorityDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposi static bool32 CanAbilityTrapOpponent(enum Ability ability, u32 opponent) { - if ((GetConfig(CONFIG_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(opponent, TYPE_GHOST))) + if ((GetConfig(B_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(opponent, TYPE_GHOST))) return FALSE; else if (ability == ABILITY_SHADOW_TAG) { diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 6bb814b66f..c607450315 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -474,7 +474,7 @@ bool32 AI_CanBattlerEscape(u32 battler) { enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler]; - if (GetConfig(CONFIG_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + if (GetConfig(B_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; if (holdEffect == HOLD_EFFECT_SHED_SHELL) return TRUE; @@ -818,7 +818,7 @@ static inline void CalcDynamicMoveDamage(struct DamageContext *ctx, u16 *medianD median = maximum = minimum = max(0, gBattleMons[ctx->battlerDef].hp - gBattleMons[ctx->battlerAtk].hp); break; case EFFECT_BEAT_UP: - if (GetConfig(CONFIG_BEAT_UP) >= GEN_5) + if (GetConfig(B_BEAT_UP) >= GEN_5) { u32 partyCount = CalculatePartyCount(GetBattlerParty(ctx->battlerAtk)); u32 i; @@ -873,7 +873,7 @@ static inline bool32 ShouldCalcCritDamage(u32 battlerAtk, u32 battlerDef, u32 mo s32 critChanceIndex = 0; // Get crit chance - if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) + if (GetConfig(B_CRIT_CHANCE) == GEN_1) critChanceIndex = CalcCritChanceStageGen1(battlerAtk, battlerDef, move, FALSE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk]); else critChanceIndex = CalcCritChanceStage(battlerAtk, battlerDef, move, FALSE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk]); @@ -882,11 +882,11 @@ static inline bool32 ShouldCalcCritDamage(u32 battlerAtk, u32 battlerDef, u32 mo return TRUE; if (critChanceIndex >= RISKY_AI_CRIT_STAGE_THRESHOLD // Not guaranteed but above Risky threshold && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) - && GetConfig(CONFIG_CRIT_CHANCE) != GEN_1) + && GetConfig(B_CRIT_CHANCE) != GEN_1) return TRUE; if (critChanceIndex >= RISKY_AI_CRIT_THRESHOLD_GEN_1 // Not guaranteed but above Risky threshold && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) - && GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) + && GetConfig(B_CRIT_CHANCE) == GEN_1) return TRUE; return FALSE; } @@ -1476,7 +1476,7 @@ bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) if (!DoesBattlerIgnoreAbilityChecks(battler, gAiLogicData->abilities[battler], move)) { - if (GetConfig(CONFIG_STURDY) >= GEN_5 && gAiLogicData->abilities[battlerTarget] == ABILITY_STURDY) + if (GetConfig(B_STURDY) >= GEN_5 && gAiLogicData->abilities[battlerTarget] == ABILITY_STURDY) return TRUE; if (IsMimikyuDisguised(battlerTarget)) return TRUE; @@ -1830,7 +1830,7 @@ u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon) case ABILITY_SAND_STREAM: return B_WEATHER_SANDSTORM; case ABILITY_SNOW_WARNING: - return GetConfig(CONFIG_SNOW_WARNING) >= GEN_9 ? B_WEATHER_SNOW : B_WEATHER_HAIL; + return GetConfig(B_SNOW_WARNING) >= GEN_9 ? B_WEATHER_SNOW : B_WEATHER_HAIL; default: return gBattleWeather; } @@ -1931,7 +1931,7 @@ bool32 IsHazardClearingMove(u32 move) case EFFECT_TIDY_UP: return TRUE; case EFFECT_DEFOG: - if (GetConfig(CONFIG_DEFOG_EFFECT_CLEARING) >= GEN_6) + if (GetConfig(B_DEFOG_EFFECT_CLEARING) >= GEN_6) return TRUE; break; } @@ -2198,7 +2198,7 @@ bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, if (stat == STAT_DEF) return FALSE; case ABILITY_ILLUMINATE: - if (GetConfig(CONFIG_ILLUMINATE_EFFECT) < GEN_9) + if (GetConfig(B_ILLUMINATE_EFFECT) < GEN_9) break; case ABILITY_KEEN_EYE: case ABILITY_MINDS_EYE: @@ -2938,7 +2938,7 @@ bool32 IsSwitchOutEffect(enum BattleMoveEffects effect) switch (effect) { case EFFECT_TELEPORT: - if (GetConfig(CONFIG_TELEPORT_BEHAVIOR) >= GEN_8) + if (GetConfig(B_TELEPORT_BEHAVIOR) >= GEN_8) return TRUE; case EFFECT_HIT_ESCAPE: case EFFECT_PARTING_SHOT: @@ -3365,7 +3365,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Ability defAbility if (!IsBattleMoveStatus(move) && ((gAiLogicData->shouldSwitch & (1u << battlerAtk)) || (AI_BattlerAtMaxHp(battlerDef) && (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH - || (GetConfig(CONFIG_STURDY) >= GEN_5 && defAbility == ABILITY_STURDY) + || (GetConfig(B_STURDY) >= GEN_5 && defAbility == ABILITY_STURDY) || defAbility == ABILITY_MULTISCALE || defAbility == ABILITY_SHADOW_SHIELD)))) return SHOULD_PIVOT; // pivot to break sash/sturdy/multiscale @@ -3373,7 +3373,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Ability defAbility else if (!hasStatBoost) { if (!IsBattleMoveStatus(move) && (AI_BattlerAtMaxHp(battlerDef) && (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH - || (GetConfig(CONFIG_STURDY) >= GEN_5 && defAbility == ABILITY_STURDY) + || (GetConfig(B_STURDY) >= GEN_5 && defAbility == ABILITY_STURDY) || defAbility == ABILITY_MULTISCALE || defAbility == ABILITY_SHADOW_SHIELD))) return SHOULD_PIVOT; // pivot to break sash/sturdy/multiscale @@ -3859,7 +3859,7 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) battlerOnField1 = gBattlerPartyIndexes[battlerId]; battlerOnField2 = gBattlerPartyIndexes[GetPartnerBattler(battlerId)]; // Check partner's status - if ((GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + if ((GetConfig(B_HEAL_BELL_SOUNDPROOF) == GEN_5 || gAiLogicData->abilities[BATTLE_PARTNER(battlerId)] != ABILITY_SOUNDPROOF || !checkSoundproof) && GetMonData(&party[battlerOnField2], MON_DATA_STATUS) != STATUS1_NONE @@ -3873,8 +3873,8 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) } // Check attacker's status - if ((GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 - || GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 + if ((GetConfig(B_HEAL_BELL_SOUNDPROOF) == GEN_5 + || GetConfig(B_HEAL_BELL_SOUNDPROOF) >= GEN_8 || gAiLogicData->abilities[battlerId] != ABILITY_SOUNDPROOF || !checkSoundproof) && GetMonData(&party[battlerOnField1], MON_DATA_STATUS) != STATUS1_NONE && ShouldCureStatus(battlerId, battlerId, gAiLogicData)) @@ -3885,7 +3885,7 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) { if (i == battlerOnField1 || i == battlerOnField2) continue; - if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) < GEN_5 + if (GetConfig(B_HEAL_BELL_SOUNDPROOF) < GEN_5 && checkSoundproof && GetMonAbility(&party[i]) == ABILITY_SOUNDPROOF) continue; @@ -5780,7 +5780,7 @@ bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability { case ABILITY_LIGHTNING_ROD: case ABILITY_STORM_DRAIN: - if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) < GEN_5) + if (GetConfig(B_REDIRECT_ABILITY_IMMUNITY) < GEN_5) return FALSE; else return (BattlerStatCanRise(battlerDef, ability, STAT_SPATK) && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)); diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 096b307b8b..9a15a33c69 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -270,7 +270,7 @@ static bool32 HandleEndTurnWish(u32 battler) s32 wishHeal = 0; gBattlerTarget = battler; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, battler, gWishFutureKnock.wishPartyId[battler]) - if (GetConfig(CONFIG_WISH_HP_SOURCE) >= GEN_5) + if (GetConfig(B_WISH_HP_SOURCE) >= GEN_5) { if (IsOnPlayerSide(battler)) wishHeal = GetMonData(&gPlayerParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2; @@ -531,7 +531,7 @@ static bool32 HandleEndTurnBurn(u32 battler) && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { - s32 burnDamage = GetNonDynamaxMaxHP(battler) / ((GetConfig(CONFIG_BURN_DAMAGE) >= GEN_7 || GetConfig(CONFIG_BURN_DAMAGE) == GEN_1) ? 16 : 8); + s32 burnDamage = GetNonDynamaxMaxHP(battler) / ((GetConfig(B_BURN_DAMAGE) >= GEN_7 || GetConfig(B_BURN_DAMAGE) == GEN_1) ? 16 : 8); if (ability == ABILITY_HEATPROOF) { if (burnDamage > (burnDamage / 2) + 1) // Record ability if the burn takes less damage than it normally would. @@ -556,7 +556,7 @@ static bool32 HandleEndTurnFrostbite(u32 battler) && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / ((GetConfig(CONFIG_BURN_DAMAGE) >= GEN_7 || GetConfig(CONFIG_BURN_DAMAGE) == GEN_1) ? 16 : 8)); + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / ((GetConfig(B_BURN_DAMAGE) >= GEN_7 || GetConfig(B_BURN_DAMAGE) == GEN_1) ? 16 : 8)); BattleScriptExecute(BattleScript_FrostbiteTurnDmg); effect = TRUE; } diff --git a/src/battle_main.c b/src/battle_main.c index 8607e22e06..c10b3cafe1 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3010,7 +3010,7 @@ static void ClearSetBScriptingStruct(void) gBattleScripting.battleStyle = OPTIONS_BATTLE_STYLE_SET; else gBattleScripting.battleStyle = gSaveBlock2Ptr->optionsBattleStyle; - gBattleScripting.expOnCatch = (GetConfig(CONFIG_EXP_CATCH) >= GEN_6); + gBattleScripting.expOnCatch = (GetConfig(B_EXP_CATCH) >= GEN_6); gBattleScripting.specialTrainerBattleType = specialBattleType; } @@ -4108,7 +4108,7 @@ u8 IsRunningFromBattleImpossible(u32 battler) if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN) return BATTLE_RUN_SUCCESS; - if (GetConfig(CONFIG_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + if (GetConfig(B_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return BATTLE_RUN_SUCCESS; if (gBattleTypeFlags & BATTLE_TYPE_LINK) return BATTLE_RUN_SUCCESS; @@ -4275,7 +4275,7 @@ static void HandleTurnActionSelectionState(void) gBattleStruct->moveTarget[battler] = gBattleResources->bufferB[battler][3]; return; } - else if (GetConfig(CONFIG_ENCORE_TARGET) < GEN_5 && gDisableStructs[battler].encoredMove != MOVE_NONE) + else if (GetConfig(B_ENCORE_TARGET) < GEN_5 && gDisableStructs[battler].encoredMove != MOVE_NONE) { gChosenMoveByBattler[battler] = gDisableStructs[battler].encoredMove; gBattleStruct->chosenMovePositions[battler] = gDisableStructs[battler].encoredMovePos; @@ -4817,7 +4817,7 @@ u32 GetBattlerTotalSpeedStat(u32 battler, enum Ability ability, enum HoldEffect // paralysis drop if (gBattleMons[battler].status1 & STATUS1_PARALYSIS && ability != ABILITY_QUICK_FEET) - speed /= GetConfig(CONFIG_PARALYSIS_SPEED) >= GEN_7 ? 2 : 4; + speed /= GetConfig(B_PARALYSIS_SPEED) >= GEN_7 ? 2 : 4; if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SWAMP) speed /= 4; @@ -4856,7 +4856,7 @@ s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move) priority = -8; } else if (ability == ABILITY_GALE_WINGS - && (GetConfig(CONFIG_GALE_WINGS) < GEN_7 || IsBattlerAtMaxHp(battler)) + && (GetConfig(B_GALE_WINGS) < GEN_7 || IsBattlerAtMaxHp(battler)) && GetMoveType(move) == TYPE_FLYING) { priority++; @@ -5214,7 +5214,7 @@ static bool32 TryDoGimmicksBeforeMoves(void) } } - if (GetConfig(CONFIG_MEGA_EVO_TURN_ORDER) >= GEN_7) + if (GetConfig(B_MEGA_EVO_TURN_ORDER) >= GEN_7) TryChangeTurnOrder(); // This will just do nothing if no mon has mega evolved. return FALSE; } diff --git a/src/battle_pike.c b/src/battle_pike.c index 199a5eea50..de15310f66 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -862,7 +862,7 @@ static bool8 DoesTypePreventStatus(u16 species, u32 status) break; case STATUS1_PARALYSIS: if (GetSpeciesType(species, 0) == TYPE_GROUND || GetSpeciesType(species, 1) == TYPE_GROUND - || (GetConfig(CONFIG_PARALYZE_ELECTRIC) >= GEN_6 && (GetSpeciesType(species, 0) == TYPE_ELECTRIC || GetSpeciesType(species, 1) == TYPE_ELECTRIC))) + || (GetConfig(B_PARALYZE_ELECTRIC) >= GEN_6 && (GetSpeciesType(species, 0) == TYPE_ELECTRIC || GetSpeciesType(species, 1) == TYPE_ELECTRIC))) ret = TRUE; break; case STATUS1_BURN: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 64073dbadd..7a29f9c5b9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1584,11 +1584,11 @@ static const u32 sGen2CriticalHitOdds[] = {17, 32, 64, 85, 128}; // X/256 static inline u32 GetCriticalHitOdds(u32 critChance) { - if (GetConfig(CONFIG_CRIT_CHANCE) >= GEN_7) + if (GetConfig(B_CRIT_CHANCE) >= GEN_7) return sGen7CriticalHitOdds[critChance]; - if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_6) + if (GetConfig(B_CRIT_CHANCE) == GEN_6) return sGen6CriticalHitOdds[critChance]; - if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_2) + if (GetConfig(B_CRIT_CHANCE) == GEN_2) return sGen2CriticalHitOdds[critChance]; return sCriticalHitOdds[critChance]; @@ -1765,7 +1765,7 @@ static void Cmd_critcalc(void) enum Ability abilityDef = GetBattlerAbility(battlerDef); enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); - if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) + if (GetConfig(B_CRIT_CHANCE) == GEN_1) gBattleStruct->critChance[battlerDef] = CalcCritChanceStageGen1(gBattlerAttacker, battlerDef, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); else gBattleStruct->critChance[battlerDef] = CalcCritChanceStage(gBattlerAttacker, battlerDef, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); @@ -1778,9 +1778,9 @@ static void Cmd_critcalc(void) gSpecialStatuses[battlerDef].criticalHit = TRUE; else { - if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) + if (GetConfig(B_CRIT_CHANCE) == GEN_1) gSpecialStatuses[battlerDef].criticalHit = RandomChance(RNG_CRITICAL_HIT, gBattleStruct->critChance[battlerDef], 256); - else if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_2) + else if (GetConfig(B_CRIT_CHANCE) == GEN_2) gSpecialStatuses[battlerDef].criticalHit = RandomChance(RNG_CRITICAL_HIT, GetCriticalHitOdds(gBattleStruct->critChance[battlerDef]), 256); else gSpecialStatuses[battlerDef].criticalHit = RandomChance(RNG_CRITICAL_HIT, 1, GetCriticalHitOdds(gBattleStruct->critChance[battlerDef])); @@ -1949,7 +1949,7 @@ static void Cmd_adjustdamage(void) gLastUsedItem = gBattleMons[battlerDef].item; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_HUNG_ON; } - else if (GetConfig(CONFIG_STURDY) >= GEN_5 && GetBattlerAbility(battlerDef) == ABILITY_STURDY && IsBattlerAtMaxHp(battlerDef)) + else if (GetConfig(B_STURDY) >= GEN_5 && GetBattlerAbility(battlerDef) == ABILITY_STURDY && IsBattlerAtMaxHp(battlerDef)) { enduredHit |= 1u << battlerDef; RecordAbilityBattle(battlerDef, ABILITY_STURDY); @@ -2418,7 +2418,7 @@ static void MoveDamageDataHpUpdate(u32 battler, u32 scriptBattler, const u8 *nex gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED_TOTEM; else gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED; - if (GetConfig(CONFIG_DISGUISE_HP_LOSS) >= GEN_8) + if (GetConfig(B_DISGUISE_HP_LOSS) >= GEN_8) SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); BattleScriptPush(nextInstr); gBattlescriptCurrInstr = BattleScript_TargetFormChange; @@ -2882,7 +2882,7 @@ void StealTargetItem(u8 battlerStealer, u8 itemBattler) gLastUsedItem = gBattleMons[itemBattler].item; gBattleMons[itemBattler].item = ITEM_NONE; - if (GetConfig(CONFIG_STEAL_WILD_ITEMS) >= GEN_9 + if (GetConfig(B_STEAL_WILD_ITEMS) >= GEN_9 && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE)) && GetMoveEffect(gCurrentMove) == EFFECT_STEAL_ITEM && battlerStealer == gBattlerAttacker) // ensure that Pickpocket isn't activating this @@ -3236,9 +3236,9 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c else { if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_GRIP_CLAW) - gDisableStructs[gEffectBattler].wrapTurns = GetConfig(CONFIG_BINDING_TURNS) >= GEN_5 ? 7 : 5; + gDisableStructs[gEffectBattler].wrapTurns = GetConfig(B_BINDING_TURNS) >= GEN_5 ? 7 : 5; else - gDisableStructs[gEffectBattler].wrapTurns = GetConfig(CONFIG_BINDING_TURNS) >= GEN_5 ? RandomUniform(RNG_WRAP, 4, 5) : RandomUniform(RNG_WRAP, 2, 5); + gDisableStructs[gEffectBattler].wrapTurns = GetConfig(B_BINDING_TURNS) >= GEN_5 ? RandomUniform(RNG_WRAP, 4, 5) : RandomUniform(RNG_WRAP, 2, 5); gBattleMons[gEffectBattler].volatiles.wrapped = TRUE; gBattleMons[gEffectBattler].volatiles.wrappedMove = gCurrentMove; gBattleMons[gEffectBattler].volatiles.wrappedBy = gBattlerAttacker; @@ -3999,7 +3999,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c { gBattleMons[battler].volatiles.wrapped = TRUE; if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_GRIP_CLAW) - gDisableStructs[battler].wrapTurns = (GetConfig(CONFIG_BINDING_TURNS) >= GEN_5) ? 7 : 5; + gDisableStructs[battler].wrapTurns = (GetConfig(B_BINDING_TURNS) >= GEN_5) ? 7 : 5; else gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; // The Wrap effect does not expire when the user switches, so here's some cheese. @@ -5418,7 +5418,7 @@ static void Cmd_isdmgblockedbydisguise(void) gBattleMons[gBattlerAttacker].species = SPECIES_MIMIKYU_BUSTED_TOTEM; else gBattleMons[gBattlerAttacker].species = SPECIES_MIMIKYU_BUSTED; - if (GetConfig(CONFIG_DISGUISE_HP_LOSS) >= GEN_8) + if (GetConfig(B_DISGUISE_HP_LOSS) >= GEN_8) SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 8); BattleScriptPush(BattleScript_MoveEnd); gBattlescriptCurrInstr = BattleScript_TargetFormChange; @@ -5745,7 +5745,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move if (GetBattlerPartyState(battlerAtk)->battleBondBoost) break; - if (GetConfig(CONFIG_BATTLE_BOND) < GEN_9 && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_BATTLE_BOND) + if (GetConfig(B_BATTLE_BOND) < GEN_9 && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_BATTLE_BOND) { // TODO: Convert this to a proper FORM_CHANGE type. gLastUsedAbility = abilityAtk; @@ -5867,7 +5867,7 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) { StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item - if (!(GetConfig(CONFIG_STEAL_WILD_ITEMS) >= GEN_9 + if (!(GetConfig(B_STEAL_WILD_ITEMS) >= GEN_9 && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE)))) { gBattleMons[gBattlerAttacker].item = ITEM_NONE; // Item assigned later on with thief (see MOVEEND_CHANGED_ITEMS) @@ -6020,7 +6020,7 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) && !NoAliveMonsForEitherParty() && CompareStat(gBattlerAttacker, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(gBattlerAttacker))) { - SET_STATCHANGER(STAT_ATK, GetConfig(CONFIG_FELL_STINGER_STAT_RAISE) >= GEN_7 ? 3 : 2, FALSE); + SET_STATCHANGER(STAT_ATK, GetConfig(B_FELL_STINGER_STAT_RAISE) >= GEN_7 ? 3 : 2, FALSE); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_FellStingerRaisesStat; @@ -6241,7 +6241,7 @@ static void Cmd_moveend(void) s32 healAmount = (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100); healAmount = GetDrainedBigRootHp(gBattlerAttacker, healAmount); effect = TRUE; - if ((moveEffect == EFFECT_DREAM_EATER && GetConfig(CONFIG_DREAM_EATER_LIQUID_OOZE) < GEN_5) + if ((moveEffect == EFFECT_DREAM_EATER && GetConfig(B_DREAM_EATER_LIQUID_OOZE) < GEN_5) || GetBattlerAbility(gBattlerTarget) != ABILITY_LIQUID_OOZE) { SetHealAmount(gBattlerAttacker, healAmount); @@ -6334,7 +6334,7 @@ static void Cmd_moveend(void) for (i = 0; i < gBattlersCount; i++) { if ((gSpecialStatuses[i].berryReduced - || (GetConfig(CONFIG_SYMBIOSIS_GEMS) >= GEN_7 && gSpecialStatuses[i].gemBoost)) + || (GetConfig(B_SYMBIOSIS_GEMS) >= GEN_7 && gSpecialStatuses[i].gemBoost)) && TryTriggerSymbiosis(i, BATTLE_PARTNER(i))) { BestowItem(BATTLE_PARTNER(i), i); @@ -8004,7 +8004,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) // Starting from Gen8 - it heals only pokemon which can be healed. // In Gen5-7 the effect activates anyways. else if ((gBattleStruct->battlerState[battler].storedHealingWish) - && (GetConfig(CONFIG_HEALING_WISH_SWITCH) < GEN_8 + && (GetConfig(B_HEALING_WISH_SWITCH) < GEN_8 || gBattleMons[battler].hp != gBattleMons[battler].maxHP || gBattleMons[battler].status1 != 0)) { @@ -8013,7 +8013,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gBattleStruct->battlerState[battler].storedHealingWish = FALSE; } else if ((gBattleStruct->battlerState[battler].storedLunarDance) - && (GetConfig(CONFIG_HEALING_WISH_SWITCH) < GEN_8 + && (GetConfig(B_HEALING_WISH_SWITCH) < GEN_8 || gBattleMons[battler].hp != gBattleMons[battler].maxHP || gBattleMons[battler].status1 != 0 || gBattleMons[battler].pp[0] < CalculatePPWithBonus(gBattleMons[battler].moves[0], gBattleMons[battler].ppBonuses, 0) @@ -8869,7 +8869,7 @@ static bool32 TrySymbiosis(u32 battler, u32 itemId, bool32 moveEnd) && gBattleStruct->changedItems[battler] == ITEM_NONE && GetBattlerHoldEffect(battler) != HOLD_EFFECT_EJECT_BUTTON && GetBattlerHoldEffect(battler) != HOLD_EFFECT_EJECT_PACK - && (GetConfig(CONFIG_SYMBIOSIS_GEMS) < GEN_7 || !(gSpecialStatuses[battler].gemBoost)) + && (GetConfig(B_SYMBIOSIS_GEMS) < GEN_7 || !(gSpecialStatuses[battler].gemBoost)) && GetMoveEffect(gCurrentMove) != EFFECT_FLING //Fling and damage-reducing berries are handled separately. && !gSpecialStatuses[battler].berryReduced && TryTriggerSymbiosis(battler, BATTLE_PARTNER(battler))) @@ -9463,7 +9463,7 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) DEFOG_CLEAR(SIDE_STATUS_AURORA_VEIL, auroraVeilTimer, BattleScript_SideStatusWoreOffReturn, MOVE_AURORA_VEIL); DEFOG_CLEAR(SIDE_STATUS_SAFEGUARD, safeguardTimer, BattleScript_SideStatusWoreOffReturn, MOVE_SAFEGUARD); } - if (GetConfig(CONFIG_DEFOG_EFFECT_CLEARING) >= GEN_6) + if (GetConfig(B_DEFOG_EFFECT_CLEARING) >= GEN_6) { gBattlerAttacker = i; // For correct battle string. Ally's / Foe's if (DefogClearHazards(saveBattler, i, clear)) @@ -9478,7 +9478,7 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) } return TRUE; } - if (GetConfig(CONFIG_DEFOG_EFFECT_CLEARING) >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + if (GetConfig(B_DEFOG_EFFECT_CLEARING) >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) { if (clear) { @@ -9582,7 +9582,7 @@ static bool32 IsElectricAbilityAffected(u32 battler, enum Ability ability) moveType = GetMoveType(gCurrentMove); if (moveType == TYPE_ELECTRIC - && (ability != ABILITY_LIGHTNING_ROD || GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5) + && (ability != ABILITY_LIGHTNING_ROD || GetConfig(B_REDIRECT_ABILITY_IMMUNITY) >= GEN_5) && GetBattlerAbility(battler) == ability) return TRUE; else @@ -9712,7 +9712,7 @@ static bool32 ChangeOrderTargetAfterAttacker(void) if (attackerTurnOrderNum > targetTurnOrderNum) return FALSE; if (attackerTurnOrderNum + 1 == targetTurnOrderNum) - return GetConfig(CONFIG_AFTER_YOU_TURN_ORDER) >= GEN_8; + return GetConfig(B_AFTER_YOU_TURN_ORDER) >= GEN_8; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { @@ -9755,8 +9755,8 @@ static void TryResetProtectUseCounter(u32 battler) enum BattleMoveEffects lastEffect = GetMoveEffect(lastMove); if (lastMove == MOVE_UNAVAILABLE || (!gBattleMoveEffects[lastEffect].usesProtectCounter - && ((GetConfig(CONFIG_ALLY_SWITCH_FAIL_CHANCE) >= GEN_9 && lastEffect != EFFECT_ALLY_SWITCH) - || GetConfig(CONFIG_ALLY_SWITCH_FAIL_CHANCE) < GEN_9))) + && ((GetConfig(B_ALLY_SWITCH_FAIL_CHANCE) >= GEN_9 && lastEffect != EFFECT_ALLY_SWITCH) + || GetConfig(B_ALLY_SWITCH_FAIL_CHANCE) < GEN_9))) gDisableStructs[battler].protectUses = 0; } @@ -9773,8 +9773,8 @@ static void Cmd_setprotectlike(void) notLastTurn = FALSE; if ((sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] >= RandomUniform(RNG_PROTECT_FAIL, 0, USHRT_MAX) && notLastTurn) - || (protectMethod == PROTECT_WIDE_GUARD && GetConfig(CONFIG_WIDE_GUARD) >= GEN_6) - || (protectMethod == PROTECT_QUICK_GUARD && GetConfig(CONFIG_QUICK_GUARD) >= GEN_6) + || (protectMethod == PROTECT_WIDE_GUARD && GetConfig(B_WIDE_GUARD) >= GEN_6) + || (protectMethod == PROTECT_QUICK_GUARD && GetConfig(B_QUICK_GUARD) >= GEN_6) || (protectMethod == PROTECT_CRAFTY_SHIELD)) { if (GetMoveEffect(gCurrentMove) == EFFECT_ENDURE) @@ -10231,7 +10231,7 @@ static void TryPlayStatChangeAnimation(u32 battler, enum Ability ability, u32 st } } else if (!((ability == ABILITY_KEEN_EYE || ability == ABILITY_MINDS_EYE) && currStat == STAT_ACC) - && !(GetConfig(CONFIG_ILLUMINATE_EFFECT) >= GEN_9 && ability == ABILITY_ILLUMINATE && currStat == STAT_ACC) + && !(GetConfig(B_ILLUMINATE_EFFECT) >= GEN_9 && ability == ABILITY_ILLUMINATE && currStat == STAT_ACC) && !(ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK) && !(ability == ABILITY_BIG_PECKS && currStat == STAT_DEF)) { @@ -10400,7 +10400,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union St } else if (!flags.certain && (((battlerAbility == ABILITY_KEEN_EYE || battlerAbility == ABILITY_MINDS_EYE) && statId == STAT_ACC) - || (GetConfig(CONFIG_ILLUMINATE_EFFECT) >= GEN_9 && battlerAbility == ABILITY_ILLUMINATE && statId == STAT_ACC) + || (GetConfig(B_ILLUMINATE_EFFECT) >= GEN_9 && battlerAbility == ABILITY_ILLUMINATE && statId == STAT_ACC) || (battlerAbility == ABILITY_HYPER_CUTTER && statId == STAT_ATK) || (battlerAbility == ABILITY_BIG_PECKS && statId == STAT_DEF))) { @@ -11249,8 +11249,8 @@ static void Cmd_setfocusenergy(void) } else { - if (GetConfig(CONFIG_FOCUS_ENERGY_CRIT_RATIO) >= GEN_3 - || GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) + if (GetConfig(B_FOCUS_ENERGY_CRIT_RATIO) >= GEN_3 + || GetConfig(B_CRIT_CHANCE) == GEN_1) gBattleMons[battler].volatiles.focusEnergy = TRUE; else gBattleMons[battler].volatiles.dragonCheer = TRUE; @@ -11587,7 +11587,7 @@ static void Cmd_settypetorandomresistance(void) u32 moveToCheck; u32 typeToCheck; - if (GetConfig(CONFIG_UPDATED_CONVERSION_2) < GEN_5) + if (GetConfig(B_UPDATED_CONVERSION_2) < GEN_5) { moveToCheck = gLastLandedMoves[gBattlerAttacker]; if (GetMoveEffect(moveToCheck) == EFFECT_STRUGGLE) @@ -11752,7 +11752,7 @@ static void Cmd_settailwind(void) if (!(gSideStatuses[side] & SIDE_STATUS_TAILWIND)) { gSideStatuses[side] |= SIDE_STATUS_TAILWIND; - gSideTimers[side].tailwindTimer = (GetConfig(CONFIG_TAILWIND_TURNS) >= GEN_5 ? 4 : 3); + gSideTimers[side].tailwindTimer = (GetConfig(B_TAILWIND_TURNS) >= GEN_5 ? 4 : 3); gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -11842,8 +11842,8 @@ static void Cmd_healpartystatus(void) struct Pokemon *party = GetBattlerParty(gBattlerAttacker); bool32 isSoundMove = IsSoundMove(gCurrentMove); - if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 - || GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 + if (GetConfig(B_HEAL_BELL_SOUNDPROOF) == GEN_5 + || GetConfig(B_HEAL_BELL_SOUNDPROOF) >= GEN_8 || !(isSoundMove && GetBattlerAbility(gBattlerAttacker) == ABILITY_SOUNDPROOF)) { if (isSoundMove) @@ -11863,7 +11863,7 @@ static void Cmd_healpartystatus(void) if (IsBattlerAlive(partner)) { - if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + if (GetConfig(B_HEAL_BELL_SOUNDPROOF) == GEN_5 || !(isSoundMove && GetBattlerAbility(partner) == ABILITY_SOUNDPROOF)) { gBattleMons[partner].status1 = 0; @@ -11889,10 +11889,10 @@ static void Cmd_healpartystatus(void) bool32 isAttacker = gBattlerPartyIndexes[gBattlerAttacker] == i; bool32 isDoublesPartner = gBattlerPartyIndexes[partner] == i && IsBattlerAlive(partner); - if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 - || (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 && isAttacker)) + if (GetConfig(B_HEAL_BELL_SOUNDPROOF) == GEN_5 + || (GetConfig(B_HEAL_BELL_SOUNDPROOF) >= GEN_8 && isAttacker)) ability = ABILITY_NONE; - else if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) > GEN_5 && !isAttacker && !isDoublesPartner) + else if (GetConfig(B_HEAL_BELL_SOUNDPROOF) > GEN_5 && !isAttacker && !isDoublesPartner) ability = ABILITY_NONE; else if (isAttacker) ability = GetBattlerAbility(gBattlerAttacker); @@ -12310,7 +12310,7 @@ static void Cmd_copyfoestats(void) { gBattleMons[gBattlerAttacker].statStages[i] = gBattleMons[gBattlerTarget].statStages[i]; } - if (GetConfig(CONFIG_PSYCH_UP_CRIT_RATIO) >= GEN_6) + if (GetConfig(B_PSYCH_UP_CRIT_RATIO) >= GEN_6) { // Copy crit boosts (Focus Energy, Dragon Cheer, G-Max Chi Strike) gBattleMons[gBattlerAttacker].volatiles.focusEnergy = gBattleMons[gBattlerTarget].volatiles.focusEnergy; @@ -12380,7 +12380,7 @@ static void Cmd_recoverbasedonsunlight(void) else recoverAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; } - else if (GetConfig(CONFIG_TIME_OF_DAY_HEALING_MOVES) != GEN_2) + else if (GetConfig(B_TIME_OF_DAY_HEALING_MOVES) != GEN_2) { if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA) recoverAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; @@ -12668,7 +12668,7 @@ static void Cmd_settaunt(void) { CMD_ARGS(const u8 *failInstr); - if (GetConfig(CONFIG_OBLIVIOUS_TAUNT) >= GEN_6 && GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS) + if (GetConfig(B_OBLIVIOUS_TAUNT) >= GEN_6 && GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS) { gBattlescriptCurrInstr = BattleScript_NotAffectedAbilityPopUp; gLastUsedAbility = ABILITY_OBLIVIOUS; @@ -13404,7 +13404,7 @@ bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move) return FALSE; else if (MoveIgnoresSubstitute(move)) return FALSE; - else if (GetConfig(CONFIG_INFILTRATOR_SUBSTITUTE) < GEN_6) + else if (GetConfig(B_INFILTRATOR_SUBSTITUTE) < GEN_6) return TRUE; else if (GetMoveEffect(move) == EFFECT_TRANSFORM || GetMoveEffect(move) == EFFECT_SKY_DROP) return TRUE; @@ -14737,7 +14737,7 @@ bool32 CanBurnHitThaw(u16 move) { u8 i; - if (GetConfig(CONFIG_BURN_HIT_THAW) >= GEN_6) + if (GetConfig(B_BURN_HIT_THAW) >= GEN_6) { u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); for (i = 0; i < numAdditionalEffects; i++) @@ -15521,7 +15521,7 @@ void BS_TryAllySwitch(void) { gBattlescriptCurrInstr = cmd->failInstr; } - else if (GetConfig(CONFIG_ALLY_SWITCH_FAIL_CHANCE) >= GEN_9) + else if (GetConfig(B_ALLY_SWITCH_FAIL_CHANCE) >= GEN_9) { TryResetProtectUseCounter(gBattlerAttacker); if (sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] < Random()) @@ -16401,7 +16401,7 @@ void BS_JumpIfIntimidateAbilityPrevented(void) case ABILITY_SCRAPPY: case ABILITY_OWN_TEMPO: case ABILITY_OBLIVIOUS: - if (GetConfig(CONFIG_UPDATED_INTIMIDATE) >= GEN_8) + if (GetConfig(B_UPDATED_INTIMIDATE) >= GEN_8) { hasAbility = TRUE; gBattlescriptCurrInstr = BattleScript_IntimidatePrevented; @@ -18017,7 +18017,7 @@ void BS_JumpIfAbilityPreventsRest(void) NATIVE_ARGS(u8 battler, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); u32 ability = GetBattlerAbility(battler); - if (GetConfig(CONFIG_LEAF_GUARD_PREVENTS_REST) >= GEN_5 && IsLeafGuardProtected(battler, ability)) + if (GetConfig(B_LEAF_GUARD_PREVENTS_REST) >= GEN_5 && IsLeafGuardProtected(battler, ability)) gBattlescriptCurrInstr = cmd->jumpInstr; else if (IsShieldsDownProtected(battler, ability)) gBattlescriptCurrInstr = cmd->jumpInstr; @@ -18112,7 +18112,7 @@ void BS_BattlerItemToLastUsedItem(void) void BS_JumpIfGenConfigLowerThan(void) { NATIVE_ARGS(u16 tag, u8 gen, const u8 *jumpInstr); - if (GetConfig(cmd->tag) < cmd->gen) + if (GetConfigInternal(cmd->tag) < cmd->gen) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/src/battle_util.c b/src/battle_util.c index bcff0c4aee..cad82d035e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -480,7 +480,7 @@ void HandleAction_UseMove(void) { gCurrentMove = gChosenMove = gDisableStructs[gBattlerAttacker].encoredMove; gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos; - if (GetConfig(CONFIG_ENCORE_TARGET) < GEN_5) + if (GetConfig(B_ENCORE_TARGET) < GEN_5) gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); } // check if the encored move wasn't overwritten @@ -695,7 +695,7 @@ bool32 TryRunFromBattle(u32 battler) gProtectStructs[battler].fleeType = FLEE_ITEM; effect++; } - else if (GetConfig(CONFIG_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + else if (GetConfig(B_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) { effect++; } @@ -970,7 +970,7 @@ void HandleAction_ActionFinished(void) gBattleResources->battleScriptsStack->size = 0; gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; - if (GetConfig(CONFIG_RECALC_TURN_AFTER_ACTIONS) >= GEN_8 && !afterYouActive && !gBattleStruct->pledgeMove && !IsPursuitTargetSet()) + if (GetConfig(B_RECALC_TURN_AFTER_ACTIONS) >= GEN_8 && !afterYouActive && !gBattleStruct->pledgeMove && !IsPursuitTargetSet()) { // i starts at `gCurrentTurnActionNumber` because we don't want to recalculate turn order for mon that have already // taken action. It's been previously increased, which we want in order to not recalculate the turn of the mon that just finished its action @@ -1245,7 +1245,7 @@ bool32 ShouldDefiantCompetitiveActivate(u32 battler, enum Ability ability) if (IsBattlerAlly(gSpecialStatuses[battler].changedStatsBattlerId, battler) && !gBattleScripting.stickyWebStatDrop) return FALSE; - if (GetConfig(CONFIG_DEFIANT_STICKY_WEB) >= GEN_9 || !gBattleScripting.stickyWebStatDrop) + if (GetConfig(B_DEFIANT_STICKY_WEB) >= GEN_9 || !gBattleScripting.stickyWebStatDrop) return TRUE; // only activate Defiant/Competitive if Web was setup by foe return gSideTimers[side].stickyWebBattlerSide != side; @@ -1283,7 +1283,7 @@ void PrepareStringBattle(enum StringID stringId, u32 battler) stringId = STRINGID_STATSWONTINCREASE2; break; case STRINGID_PKMNCUTSATTACKWITH: - if (GetConfig(CONFIG_UPDATED_INTIMIDATE) >= GEN_8 + if (GetConfig(B_UPDATED_INTIMIDATE) >= GEN_8 && targetAbility == ABILITY_RATTLED && CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, targetAbility)) { @@ -1425,7 +1425,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) u16 *choicedMove = &gBattleStruct->choicedMove[battler]; enum BattleMoveEffects moveEffect = GetMoveEffect(move); - if (GetConfig(CONFIG_ENCORE_TARGET) >= GEN_5 + if (GetConfig(B_ENCORE_TARGET) >= GEN_5 && DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].encoredMove != move && gDisableStructs[battler].encoredMove != MOVE_NONE) { gBattleScripting.battler = battler; @@ -2282,7 +2282,7 @@ static enum MoveCanceler CancelerConfused(struct BattleContext *ctx) if (gBattleMons[ctx->battlerAtk].volatiles.confusionTurns) { // confusion dmg - if (RandomPercentage(RNG_CONFUSION, (GetConfig(CONFIG_CONFUSION_SELF_DMG_CHANCE) >= GEN_7 ? 33 : 50))) + if (RandomPercentage(RNG_CONFUSION, (GetConfig(B_CONFUSION_SELF_DMG_CHANCE) >= GEN_7 ? 33 : 50))) { gBattleCommunication[MULTISTRING_CHOOSER] = TRUE; struct DamageContext dmgCtx = {0}; @@ -2619,7 +2619,7 @@ static enum MoveCanceler CancelerWeatherPrimal(struct BattleContext *ctx) if (HasWeatherEffect() && GetMovePower(ctx->currentMove) > 0) { enum Type moveType = GetBattleMoveType(ctx->currentMove); - if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (GetConfig(CONFIG_POWDER_RAIN) >= GEN_7 || !TryActivatePowderStatus(ctx->currentMove))) + if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (GetConfig(B_POWDER_RAIN) >= GEN_7 || !TryActivatePowderStatus(ctx->currentMove))) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN; effect = MOVE_STEP_FAILURE; @@ -2852,7 +2852,7 @@ static enum MoveCanceler CancelerProtean(struct BattleContext *ctx) enum Type moveType = GetBattleMoveType(ctx->currentMove); if (ProteanTryChangeType(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ctx->currentMove, moveType)) { - if (GetConfig(CONFIG_PROTEAN_LIBERO) >= GEN_9) + if (GetConfig(B_PROTEAN_LIBERO) >= GEN_9) gDisableStructs[ctx->battlerAtk].usedProteanLibero = TRUE; PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); gBattlerAbility = ctx->battlerAtk; @@ -2935,7 +2935,7 @@ static enum MoveCanceler CancelerMultihitMoves(struct BattleContext *ctx) && !GetMonData(&party[i], MON_DATA_IS_EGG) && !GetMonData(&party[i], MON_DATA_STATUS)) { - if (GetConfig(CONFIG_BEAT_UP) >= GEN_5) + if (GetConfig(B_BEAT_UP) >= GEN_5) gBattleStruct->beatUpSpecies[gMultiHitCounter] = species; else gBattleStruct->beatUpSpecies[gMultiHitCounter] = i; @@ -3232,7 +3232,7 @@ bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, u32 ability) { return FALSE; } - else if (GetConfig(CONFIG_ABILITY_WEATHER) < GEN_6 && ability != ABILITY_NONE) + else if (GetConfig(B_ABILITY_WEATHER) < GEN_6 && ability != ABILITY_NONE) { gBattleWeather = sBattleWeatherInfo[battleWeatherId].flag; for (u32 i = 0; i < gBattlersCount; i++) @@ -3582,14 +3582,14 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability ability } break; case ABILITY_LIGHTNING_ROD: - if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && moveType == TYPE_ELECTRIC && GetBattlerMoveTargetType(battlerAtk, move) != MOVE_TARGET_ALL_BATTLERS) + if (GetConfig(B_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && moveType == TYPE_ELECTRIC && GetBattlerMoveTargetType(battlerAtk, move) != MOVE_TARGET_ALL_BATTLERS) { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; statId = STAT_SPATK; } break; case ABILITY_STORM_DRAIN: - if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && moveType == TYPE_WATER) + if (GetConfig(B_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && moveType == TYPE_WATER) { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; statId = STAT_SPATK; @@ -4329,12 +4329,12 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_SNOW_WARNING: - if (GetConfig(CONFIG_SNOW_WARNING) >= GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_SNOW, gLastUsedAbility)) + if (GetConfig(B_SNOW_WARNING) >= GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_SNOW, gLastUsedAbility)) { BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivatesSnow); effect++; } - else if (GetConfig(CONFIG_SNOW_WARNING) < GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_HAIL, gLastUsedAbility)) + else if (GetConfig(B_SNOW_WARNING) < GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_HAIL, gLastUsedAbility)) { BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivatesHail); effect++; @@ -4433,7 +4433,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab if (!gSpecialStatuses[battler].switchInAbilityDone && !GetBattlerPartyState(battler)->intrepidSwordBoost) { - if (GetConfig(CONFIG_INTREPID_SWORD) == GEN_9) + if (GetConfig(B_INTREPID_SWORD) == GEN_9) GetBattlerPartyState(battler)->intrepidSwordBoost = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; if (CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) @@ -4448,7 +4448,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab if (!gSpecialStatuses[battler].switchInAbilityDone && !GetBattlerPartyState(battler)->dauntlessShieldBoost) { - if (GetConfig(CONFIG_DAUNTLESS_SHIELD) == GEN_9) + if (GetConfig(B_DAUNTLESS_SHIELD) == GEN_9) GetBattlerPartyState(battler)->dauntlessShieldBoost = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; if (CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) @@ -4718,7 +4718,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; case ABILITY_SHED_SKIN: if ((gBattleMons[battler].status1 & STATUS1_ANY) - && (GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) == GEN_4 ? RandomPercentage(RNG_SHED_SKIN, 30) : RandomChance(RNG_SHED_SKIN, 1, 3))) + && (GetConfig(B_ABILITY_TRIGGER_CHANCE) == GEN_4 ? RandomPercentage(RNG_SHED_SKIN, 30) : RandomChance(RNG_SHED_SKIN, 1, 3))) { ABILITY_HEAL_MON_STATUS: if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON)) @@ -4759,7 +4759,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab if (gDisableStructs[battler].isFirstTurn != 2) { u32 validToRaise = 0, validToLower = 0; - u32 statsNum = GetConfig(CONFIG_MOODY_ACC_EVASION) >= GEN_8 ? NUM_STATS : NUM_BATTLE_STATS; + u32 statsNum = GetConfig(B_MOODY_ACC_EVASION) >= GEN_8 ? NUM_STATS : NUM_BATTLE_STATS; for (i = STAT_ATK; i < statsNum; i++) { @@ -5142,7 +5142,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab { u32 poison, paralysis, sleep; - if (GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) >= GEN_5) + if (GetConfig(B_ABILITY_TRIGGER_CHANCE) >= GEN_5) { poison = 9; paralysis = 19; @@ -5154,7 +5154,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } sleep = 30; - i = RandomUniform(RNG_EFFECT_SPORE, 0, GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? 99 : 299); + i = RandomUniform(RNG_EFFECT_SPORE, 0, GetConfig(B_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? 99 : 299); if (i < poison) goto POISON_POINT; if (i < paralysis) @@ -5180,7 +5180,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_POISON_POINT: - if (GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? RandomPercentage(RNG_POISON_POINT, 30) : RandomChance(RNG_POISON_POINT, 1, 3)) + if (GetConfig(B_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? RandomPercentage(RNG_POISON_POINT, 30) : RandomChance(RNG_POISON_POINT, 1, 3)) { POISON_POINT: { @@ -5202,7 +5202,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_STATIC: - if (GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? RandomPercentage(RNG_STATIC, 30) : RandomChance(RNG_STATIC, 1, 3)) + if (GetConfig(B_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? RandomPercentage(RNG_STATIC, 30) : RandomChance(RNG_STATIC, 1, 3)) { STATIC: { @@ -5229,7 +5229,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && IsBattlerTurnDamaged(gBattlerTarget) && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) - && (GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? RandomPercentage(RNG_FLAME_BODY, 30) : RandomChance(RNG_FLAME_BODY, 1, 3))) + && (GetConfig(B_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? RandomPercentage(RNG_FLAME_BODY, 30) : RandomChance(RNG_FLAME_BODY, 1, 3))) { gEffectBattler = gBattlerAttacker; gBattleScripting.battler = gBattlerTarget; @@ -5244,7 +5244,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) - && (GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? RandomPercentage(RNG_CUTE_CHARM, 30) : RandomChance(RNG_CUTE_CHARM, 1, 3)) + && (GetConfig(B_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? RandomPercentage(RNG_CUTE_CHARM, 30) : RandomChance(RNG_CUTE_CHARM, 1, 3)) && !(gBattleMons[gBattlerAttacker].volatiles.infatuation) && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget) && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_OBLIVIOUS) @@ -5532,7 +5532,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab gBattleScripting.battler = gBattlerAbility = gBattlerTarget; RecordAbilityBattle(gBattlerTarget, ABILITY_SYNCHRONIZE); - if (GetConfig(CONFIG_SYNCHRONIZE_TOXIC) < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) + if (GetConfig(B_SYNCHRONIZE_TOXIC) < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; if (CanSetNonVolatileStatus( @@ -5562,7 +5562,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab gBattleScripting.battler = gBattlerAbility = gBattlerAttacker; RecordAbilityBattle(gBattlerAttacker, ABILITY_SYNCHRONIZE); - if (GetConfig(CONFIG_SYNCHRONIZE_TOXIC) < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) + if (GetConfig(B_SYNCHRONIZE_TOXIC) < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; if (CanSetNonVolatileStatus( @@ -5836,7 +5836,7 @@ u32 IsAbilityOnFieldExcept(u32 battler, enum Ability ability) u32 IsAbilityPreventingEscape(u32 battler) { - if (GetConfig(CONFIG_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + if (GetConfig(B_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return 0; bool32 isBattlerGrounded = IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler)); @@ -5864,7 +5864,7 @@ bool32 CanBattlerEscape(u32 battler) // no ability check { if (gBattleStruct->battlerState[battler].commanderSpecies != SPECIES_NONE) return FALSE; - else if (GetConfig(CONFIG_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + else if (GetConfig(B_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; else if (gBattleMons[battler].volatiles.escapePrevention) return FALSE; @@ -6162,7 +6162,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abil { battleScript = BattleScript_AlreadyParalyzed; } - else if (GetConfig(CONFIG_PARALYZE_ELECTRIC) >= GEN_6 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ELECTRIC)) + else if (GetConfig(B_PARALYZE_ELECTRIC) >= GEN_6 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ELECTRIC)) { battleScript = BattleScript_NotAffected; } @@ -7307,7 +7307,7 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) basePower *= 2; break; case EFFECT_BEAT_UP: - if (GetConfig(CONFIG_BEAT_UP) >= GEN_5) + if (GetConfig(B_BEAT_UP) >= GEN_5) basePower = CalcBeatUpPower(); break; case EFFECT_PSYBLADE: @@ -7421,9 +7421,9 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && moveType == TYPE_PSYCHIC) modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); if (IsFieldMudSportAffected(ctx->moveType)) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_SPORT_DMG_REDUCTION) >= GEN_5 ? 0.33 : 0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(B_SPORT_DMG_REDUCTION) >= GEN_5 ? 0.33 : 0.5)); if (IsFieldWaterSportAffected(ctx->moveType)) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_SPORT_DMG_REDUCTION) >= GEN_5 ? 0.33 : 0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(B_SPORT_DMG_REDUCTION) >= GEN_5 ? 0.33 : 0.5)); // attacker's abilities switch (ctx->abilityAtk) @@ -7489,22 +7489,22 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) break; case ABILITY_PIXILATE: if (moveType == TYPE_FAIRY && gBattleStruct->battlerState[battlerAtk].ateBoost) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(B_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; case ABILITY_GALVANIZE: if (moveType == TYPE_ELECTRIC && gBattleStruct->battlerState[battlerAtk].ateBoost) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(B_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; case ABILITY_REFRIGERATE: if (moveType == TYPE_ICE && gBattleStruct->battlerState[battlerAtk].ateBoost) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(B_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; case ABILITY_AERILATE: if (moveType == TYPE_FLYING && gBattleStruct->battlerState[battlerAtk].ateBoost) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(B_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; case ABILITY_NORMALIZE: - if (moveType == TYPE_NORMAL && gBattleStruct->battlerState[battlerAtk].ateBoost && GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7) + if (moveType == TYPE_NORMAL && gBattleStruct->battlerState[battlerAtk].ateBoost && GetConfig(B_ATE_MULTIPLIER) >= GEN_7) modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_PUNK_ROCK: @@ -7836,7 +7836,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) case ABILITY_TRANSISTOR: if (moveType == TYPE_ELECTRIC) { - if (GetConfig(CONFIG_TRANSISTOR_BOOST) >= GEN_9) + if (GetConfig(B_TRANSISTOR_BOOST) >= GEN_9) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); else modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); @@ -7945,7 +7945,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_LIGHT_BALL: - if (atkBaseSpeciesId == SPECIES_PIKACHU && (GetConfig(CONFIG_LIGHT_BALL_ATTACK_BOOST) >= GEN_4 || IsBattleMoveSpecial(move))) + if (atkBaseSpeciesId == SPECIES_PIKACHU && (GetConfig(B_LIGHT_BALL_ATTACK_BOOST) >= GEN_4 || IsBattleMoveSpecial(move))) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_CHOICE_BAND: @@ -8153,7 +8153,7 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) } // sandstorm sp.def boost for rock types - if (GetConfig(CONFIG_SANDSTORM_SPDEF_BOOST) >= GEN_4 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ROCK) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SANDSTORM) && !usesDefStat) + if (GetConfig(B_SANDSTORM_SPDEF_BOOST) >= GEN_4 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ROCK) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SANDSTORM) && !usesDefStat) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); // snow def boost for ice types if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SNOW) && usesDefStat) @@ -8231,12 +8231,12 @@ static inline uq4_12_t GetBurnOrFrostBiteModifier(struct DamageContext *ctx) if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_BURN && IsBattleMovePhysical(ctx->move) - && (GetConfig(CONFIG_BURN_FACADE_DMG) < GEN_6 || moveEffect != EFFECT_FACADE) + && (GetConfig(B_BURN_FACADE_DMG) < GEN_6 || moveEffect != EFFECT_FACADE) && ctx->abilityAtk != ABILITY_GUTS) return UQ_4_12(0.5); if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FROSTBITE && IsBattleMoveSpecial(ctx->move) - && (GetConfig(CONFIG_BURN_FACADE_DMG) < GEN_6 || moveEffect != EFFECT_FACADE)) + && (GetConfig(B_BURN_FACADE_DMG) < GEN_6 || moveEffect != EFFECT_FACADE)) return UQ_4_12(0.5); return UQ_4_12(1.0); } @@ -8244,7 +8244,7 @@ static inline uq4_12_t GetBurnOrFrostBiteModifier(struct DamageContext *ctx) static inline uq4_12_t GetCriticalModifier(bool32 isCrit) { if (isCrit) - return GetConfig(CONFIG_CRIT_MULTIPLIER) >= GEN_6 ? UQ_4_12(1.5) : UQ_4_12(2.0); + return GetConfig(B_CRIT_MULTIPLIER) >= GEN_6 ? UQ_4_12(1.5) : UQ_4_12(2.0); return UQ_4_12(1.0); } @@ -8609,7 +8609,7 @@ s32 DoFixedDamageMoveCalc(struct DamageContext *ctx) dmg = GetNonDynamaxHP(ctx->battlerAtk); break; case EFFECT_BEAT_UP: - if (GetConfig(CONFIG_BEAT_UP) < GEN_5) + if (GetConfig(B_BEAT_UP) < GEN_5) dmg = CalcBeatUpDamage(ctx); else return INT32_MAX; @@ -8883,7 +8883,7 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageCont RecordAbilityBattle(ctx->battlerDef, ABILITY_LEVITATE); } } - else if (GetConfig(CONFIG_SHEER_COLD_IMMUNITY) >= GEN_7 && GetMoveEffect(ctx->move) == EFFECT_SHEER_COLD && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_ICE)) + else if (GetConfig(B_SHEER_COLD_IMMUNITY) >= GEN_7 && GetMoveEffect(ctx->move) == EFFECT_SHEER_COLD && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_ICE)) { modifier = UQ_4_12(0.0); } @@ -8897,7 +8897,7 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageCont } // Iron Ball ignores type modifiers for flying-type mons if it is the only source of grounding - if (GetConfig(CONFIG_IRON_BALL) >= GEN_5 + if (GetConfig(B_IRON_BALL) >= GEN_5 && ctx->moveType == TYPE_GROUND && ctx->holdEffectDef == HOLD_EFFECT_IRON_BALL && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_FLYING) @@ -9663,7 +9663,7 @@ u32 TryImmunityAbilityHealStatus(u32 battler, enum AbilityEffect caseID) case ABILITY_OBLIVIOUS: if (gBattleMons[battler].volatiles.infatuation) effect = 3; - else if (GetConfig(CONFIG_OBLIVIOUS_TAUNT) >= GEN_6 && gDisableStructs[battler].tauntTimer != 0) + else if (GetConfig(B_OBLIVIOUS_TAUNT) >= GEN_6 && gDisableStructs[battler].tauntTimer != 0) effect = 4; break; } @@ -9713,7 +9713,7 @@ u32 TryImmunityAbilityHealStatus(u32 battler, enum AbilityEffect caseID) uq4_12_t GetBadgeBoostModifier(void) { - if (GetConfig(CONFIG_BADGE_BOOST) < GEN_3) + if (GetConfig(B_BADGE_BOOST) < GEN_3) return UQ_4_12(1.125); else return UQ_4_12(1.1); @@ -9721,7 +9721,7 @@ uq4_12_t GetBadgeBoostModifier(void) bool32 ShouldGetStatBadgeBoost(u16 badgeFlag, u32 battler) { - if (GetConfig(CONFIG_BADGE_BOOST) <= GEN_3 && badgeFlag != 0) + if (GetConfig(B_BADGE_BOOST) <= GEN_3 && badgeFlag != 0) { if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER)) return FALSE; @@ -9849,7 +9849,7 @@ bool32 CanFling(u32 battler) u16 item = gBattleMons[battler].item; if (item == ITEM_NONE - || (GetConfig(CONFIG_KLUTZ_FLING_INTERACTION) >= GEN_5 && GetBattlerAbility(battler) == ABILITY_KLUTZ) + || (GetConfig(B_KLUTZ_FLING_INTERACTION) >= GEN_5 && GetBattlerAbility(battler) == ABILITY_KLUTZ) || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM || gBattleMons[battler].volatiles.embargo || (GetItemTMHMIndex(item) != 0 && GetItemImportance(item) == 1) // don't fling reusable TMs @@ -10058,7 +10058,7 @@ bool32 CompareStat(u32 battler, enum Stat statId, u8 cmpTo, u8 cmpKind, enum Abi bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget) { - if (GetConfig(CONFIG_PRANKSTER_DARK_TYPES) < GEN_7) + if (GetConfig(B_PRANKSTER_DARK_TYPES) < GEN_7) return FALSE; if (!gProtectStructs[battlerPrankster].pranksterElevated) return FALSE; @@ -10077,7 +10077,7 @@ bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 ch bool32 CantPickupItem(u32 battler) { // Used by RandomUniformExcept() for RNG_PICKUP - if (battler == gBattlerAttacker && (GetConfig(CONFIG_PICKUP_WILD) < GEN_9 || gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK))) + if (battler == gBattlerAttacker && (GetConfig(B_PICKUP_WILD) < GEN_9 || gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK))) return TRUE; return !(IsBattlerAlive(battler) && GetBattlerPartyState(battler)->usedHeldItem && gBattleStruct->battlerState[battler].canPickupItem); } @@ -10139,7 +10139,7 @@ static void SetRandomMultiHitCounter() { if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LOADED_DICE) gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 5); - else if (GetConfig(CONFIG_MULTI_HIT_CHANCE) >= GEN_5) + else if (GetConfig(B_MULTI_HIT_CHANCE) >= GEN_5) gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 7, 7, 3, 3); // 35%: 2 hits, 35%: 3 hits, 15% 4 hits, 15% 5 hits. else gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 3, 3, 1, 1); // 37.5%: 2 hits, 37.5%: 3 hits, 12.5% 4 hits, 12.5% 5 hits. @@ -10577,7 +10577,7 @@ void ClearDamageCalcResults(void) bool32 DoesDestinyBondFail(u32 battler) { - return GetConfig(CONFIG_DESTINY_BOND_FAIL) >= GEN_7 && gBattleMons[battler].volatiles.destinyBond; + return GetConfig(B_DESTINY_BOND_FAIL) >= GEN_7 && gBattleMons[battler].volatiles.destinyBond; } // This check has always to be the last in a condtion statement because of the recording of AI data. @@ -10863,7 +10863,7 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abil u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); if ((gBattleMons[battlerDef].volatiles.lockOn && gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) - || (GetConfig(CONFIG_TOXIC_NEVER_MISS) >= GEN_6 && nonVolatileStatus == MOVE_EFFECT_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) + || (GetConfig(B_TOXIC_NEVER_MISS) >= GEN_6 && nonVolatileStatus == MOVE_EFFECT_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) || gBattleMons[battlerDef].volatiles.glaiveRush) { effect = TRUE; @@ -10950,7 +10950,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkA accStage = gBattleMons[battlerAtk].statStages[STAT_ACC]; evasionStage = gBattleMons[battlerDef].statStages[STAT_EVASION]; if (atkAbility == ABILITY_UNAWARE || atkAbility == ABILITY_KEEN_EYE || atkAbility == ABILITY_MINDS_EYE - || (GetConfig(CONFIG_ILLUMINATE_EFFECT) >= GEN_9 && atkAbility == ABILITY_ILLUMINATE)) + || (GetConfig(B_ILLUMINATE_EFFECT) >= GEN_9 && atkAbility == ABILITY_ILLUMINATE)) evasionStage = DEFAULT_STAT_STAGE; if (MoveIgnoresDefenseEvasionStages(move)) evasionStage = DEFAULT_STAT_STAGE; @@ -11126,8 +11126,8 @@ static bool32 IsOpposingSideEmpty(u32 battler) bool32 IsAffectedByPowderMove(u32 battler, u32 ability, enum HoldEffect holdEffect) { - if ((GetConfig(CONFIG_POWDER_OVERCOAT) >= GEN_6 && ability == ABILITY_OVERCOAT) - || (GetConfig(CONFIG_POWDER_GRASS) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) + if ((GetConfig(B_POWDER_OVERCOAT) >= GEN_6 && ability == ABILITY_OVERCOAT) + || (GetConfig(B_POWDER_GRASS) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES) return FALSE; return TRUE; diff --git a/src/generational_changes.c b/src/generational_changes.c index a02b6ce944..40da3d2dd1 100644 --- a/src/generational_changes.c +++ b/src/generational_changes.c @@ -3,7 +3,7 @@ #include "malloc.h" #include "constants/generational_changes.h" -#define UNPACK_CONFIG_GEN_CHANGES2(_name, _field, ...) ._field = B_##_name, +#define UNPACK_CONFIG_GEN_CHANGES2(_name, _field, ...) ._field = _name, const struct GenChanges sConfigChanges = { @@ -31,7 +31,7 @@ EWRAM_DATA struct GenChanges *gConfigChangesTestOverride = NULL; // Gets the value of a volatile status flag for a certain battler // Primarily used for the debug menu and scripts. Outside of it explicit references are preferred -u32 GetConfig(enum ConfigTag _genConfig) +u32 GetConfigInternal(enum ConfigTag _genConfig) { #if TESTING if (gConfigChangesTestOverride == NULL) diff --git a/test/battle/ability/aerilate.c b/test/battle/ability/aerilate.c index 5158a58de9..d90ad17403 100644 --- a/test/battle/ability/aerilate.c +++ b/test/battle/ability/aerilate.c @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Aerilate boosts power of affected moves by 20% (Gen7+) or 30 PARAMETRIZE { move = MOVE_SKILL_SWAP; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_ATE_MULTIPLIER, genConfig); + WITH_CONFIG(B_ATE_MULTIPLIER, genConfig); ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/arena_trap.c b/test/battle/ability/arena_trap.c index 0412b8f359..eb5a9c91d6 100644 --- a/test/battle/ability/arena_trap.c +++ b/test/battle/ability/arena_trap.c @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Arena Trap doesn't prevent switch outs via moves that switch GIVEN { ASSUME(GetMoveEffect(move) == effect); ASSUME(GetMoveEffect(MOVE_SOAK) == EFFECT_SOAK); - WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(B_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); } @@ -113,7 +113,7 @@ SINGLE_BATTLE_TEST("Arena Trap prevents switch outs from Ghost-type Pokémon (Ge { GIVEN { ASSUME(GetSpeciesType(SPECIES_SHUPPET, 0) == TYPE_GHOST); - WITH_CONFIG(CONFIG_GHOSTS_ESCAPE, GEN_5); + WITH_CONFIG(B_GHOSTS_ESCAPE, GEN_5); PLAYER(SPECIES_SHUPPET); OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); } } WHEN { @@ -129,7 +129,7 @@ SINGLE_BATTLE_TEST("Arena Trap doesn't prevent switch outs from Ghost-type Poké { GIVEN { ASSUME(GetSpeciesType(SPECIES_SHUPPET, 0) == TYPE_GHOST); - WITH_CONFIG(CONFIG_GHOSTS_ESCAPE, GEN_6); + WITH_CONFIG(B_GHOSTS_ESCAPE, GEN_6); PLAYER(SPECIES_SHUPPET); OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); } } WHEN { diff --git a/test/battle/ability/battle_bond.c b/test/battle/ability/battle_bond.c index 9d8bb1b3cd..6c041d4f32 100644 --- a/test/battle/ability/battle_bond.c +++ b/test/battle/ability/battle_bond.c @@ -17,7 +17,7 @@ SINGLE_BATTLE_TEST("Battle Bond transforms player's Greninja - Singles") PARAMETRIZE { monsCountPlayer = 2; monsCountOpponent = 2; } GIVEN { - WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(B_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND); if (monsCountPlayer == 2) { PLAYER(SPECIES_WOBBUFFET); @@ -65,7 +65,7 @@ SINGLE_BATTLE_TEST("Battle Bond transforms opponent's Greninja - Singles") PARAMETRIZE { monsCountPlayer = 2; monsCountOpponent = 2; } GIVEN { - WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(B_BATTLE_BOND, GEN_8); OPPONENT(SPECIES_GRENINJA_BATTLE_BOND); if (monsCountOpponent == 2) { OPPONENT(SPECIES_WOBBUFFET); @@ -113,7 +113,7 @@ DOUBLE_BATTLE_TEST("Battle Bond transforms player's Greninja when fainting its A PARAMETRIZE { monsCountPlayer = 3; monsCountOpponent = 3; } GIVEN { - WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(B_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND); PLAYER(SPECIES_WOBBUFFET) { HP(1); } if (monsCountPlayer == 3) { @@ -145,7 +145,7 @@ DOUBLE_BATTLE_TEST("Battle Bond transforms player's Greninja when fainting its A SINGLE_BATTLE_TEST("Battle Bond increases Atk, SpAtk and Speed by 1 stage (Gen9+)") { GIVEN { - WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_9); + WITH_CONFIG(B_BATTLE_BOND, GEN_9); PLAYER(SPECIES_GRENINJA_BATTLE_BOND) { Ability(ABILITY_BATTLE_BOND); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -166,7 +166,7 @@ SINGLE_BATTLE_TEST("Battle Bond increases Atk, SpAtk and Speed by 1 stage (Gen9+ SINGLE_BATTLE_TEST("Battle Bond increases a Stat even if only one can be increased (Gen9+)") { GIVEN { - WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_9); + WITH_CONFIG(B_BATTLE_BOND, GEN_9); PLAYER(SPECIES_GRENINJA_BATTLE_BOND) { Ability(ABILITY_BATTLE_BOND); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/competitive.c b/test/battle/ability/competitive.c index b7d938ae8d..ccd7a24d2f 100644 --- a/test/battle/ability/competitive.c +++ b/test/battle/ability/competitive.c @@ -140,7 +140,7 @@ SINGLE_BATTLE_TEST("Competitive activates after Sticky Web lowers Speed") SINGLE_BATTLE_TEST("Competitive doesn't activate after Sticky Web lowers Speed if Court Changed (gen8)") { GIVEN { - WITH_CONFIG(CONFIG_DEFIANT_STICKY_WEB, GEN_8); + WITH_CONFIG(B_DEFIANT_STICKY_WEB, GEN_8); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); } OPPONENT(SPECIES_WOBBUFFET); @@ -167,7 +167,7 @@ SINGLE_BATTLE_TEST("Competitive doesn't activate after Sticky Web lowers Speed i SINGLE_BATTLE_TEST("Competitive correctly activates after Sticky Web lowers Speed if Court Changed (Gen8)") { GIVEN { - WITH_CONFIG(CONFIG_DEFIANT_STICKY_WEB, GEN_8); + WITH_CONFIG(B_DEFIANT_STICKY_WEB, GEN_8); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/cute_charm.c b/test/battle/ability/cute_charm.c index d2395fda17..eaf354a4c0 100644 --- a/test/battle/ability/cute_charm.c +++ b/test/battle/ability/cute_charm.c @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Cute Charm triggers 1/3 times (Gen3) or 30% (Gen 4+) of the PARAMETRIZE { config = GEN_4; passes = 3; trials = 10; } // 30% PASSES_RANDOMLY(passes, trials, RNG_CUTE_CHARM); GIVEN { - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); } OPPONENT(SPECIES_CLEFAIRY) { Gender(MON_FEMALE); Ability(ABILITY_CUTE_CHARM); } diff --git a/test/battle/ability/dancer.c b/test/battle/ability/dancer.c index 075a3e46a5..65f3967e98 100644 --- a/test/battle/ability/dancer.c +++ b/test/battle/ability/dancer.c @@ -580,7 +580,7 @@ SINGLE_BATTLE_TEST("Dancer user may hit itself in confusion instead of copying a PARAMETRIZE { genConfig = GEN_7; pctChance = 33; } PASSES_RANDOMLY(pctChance, 100, RNG_CONFUSION); GIVEN { - WITH_CONFIG(CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); + WITH_CONFIG(B_CONFUSION_SELF_DMG_CHANCE, genConfig); ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); PLAYER(SPECIES_WOBBUFFET) { Speed(30); } @@ -747,7 +747,7 @@ SINGLE_BATTLE_TEST("Dancer can still copy status moves if the user is holding an DOUBLE_BATTLE_TEST("Dancer copies Lunar Dance after the original user faints, but before the replacement is sent out") { GIVEN { - WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + WITH_CONFIG(B_HEALING_WISH_SWITCH, GEN_7); ASSUME(GetMoveEffect(MOVE_LUNAR_DANCE) == EFFECT_LUNAR_DANCE); PLAYER(SPECIES_WOBBUFFET) { Speed(50); } PLAYER(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(20); } diff --git a/test/battle/ability/dauntless_shield.c b/test/battle/ability/dauntless_shield.c index 9a8871d5d7..e31ac34d4f 100644 --- a/test/battle/ability/dauntless_shield.c +++ b/test/battle/ability/dauntless_shield.c @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage") SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage every time it switches in (Gen8)") { GIVEN { - WITH_CONFIG(CONFIG_DAUNTLESS_SHIELD, GEN_8); + WITH_CONFIG(B_DAUNTLESS_SHIELD, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); } OPPONENT(SPECIES_WYNAUT); @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage every time it s SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage only once per battle (Gen 9+)") { GIVEN { - WITH_CONFIG(CONFIG_DAUNTLESS_SHIELD, GEN_9); + WITH_CONFIG(B_DAUNTLESS_SHIELD, GEN_9); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); } OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/ability/defiant.c b/test/battle/ability/defiant.c index 2c5c529717..2ac4e36948 100644 --- a/test/battle/ability/defiant.c +++ b/test/battle/ability/defiant.c @@ -142,7 +142,7 @@ SINGLE_BATTLE_TEST("Defiant activates after Sticky Web lowers Speed") SINGLE_BATTLE_TEST("Defiant doesn't activate after Sticky Web lowers Speed if Court Changed (Gen8)") { GIVEN { - WITH_CONFIG(CONFIG_DEFIANT_STICKY_WEB, GEN_8); + WITH_CONFIG(B_DEFIANT_STICKY_WEB, GEN_8); ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); ASSUME(GetMoveEffect(MOVE_COURT_CHANGE) == EFFECT_COURT_CHANGE); @@ -179,7 +179,7 @@ SINGLE_BATTLE_TEST("Defiant doesn't activate after Sticky Web lowers Speed if Co SINGLE_BATTLE_TEST("Defiant activates after Sticky Web lowers Speed if Court Changed (Gen9)") { GIVEN { - WITH_CONFIG(CONFIG_DEFIANT_STICKY_WEB, GEN_9); + WITH_CONFIG(B_DEFIANT_STICKY_WEB, GEN_9); ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); ASSUME(GetMoveEffect(MOVE_COURT_CHANGE) == EFFECT_COURT_CHANGE); diff --git a/test/battle/ability/disguise.c b/test/battle/ability/disguise.c index a874ec254c..f8874a3d55 100644 --- a/test/battle/ability/disguise.c +++ b/test/battle/ability/disguise.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Disguised Mimikyu doesn't lose 1/8 of its max HP upon changing to its busted form (Gen7)") { GIVEN { - WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_7); + WITH_CONFIG(B_DISGUISE_HP_LOSS, GEN_7); PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu will lose 1/8 of its max HP upon changing s16 disguiseDamage; GIVEN { - WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_8); + WITH_CONFIG(B_DISGUISE_HP_LOSS, GEN_8); PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/drizzle.c b/test/battle/ability/drizzle.c index 8e6f7876c9..d46087ef18 100644 --- a/test/battle/ability/drizzle.c +++ b/test/battle/ability/drizzle.c @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Drizzle summons rain", s16 damage) SINGLE_BATTLE_TEST("Drizzle sets up rain for 5 turns (Gen6+)") { GIVEN { - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_POLITOED) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DRIZZLE); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -48,7 +48,7 @@ SINGLE_BATTLE_TEST("Drizzle sets up rain for 5 turns (Gen6+)") SINGLE_BATTLE_TEST("Drizzle sets up rain for 8 turns with Damp Rock (Gen6+)") { GIVEN { - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_POLITOED) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DRIZZLE); Item(ITEM_DAMP_ROCK); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -76,7 +76,7 @@ SINGLE_BATTLE_TEST("Drizzle sets up rain for 8 turns with Damp Rock (Gen6+)") SINGLE_BATTLE_TEST("Drizzle sets up permanent rain (Gen3-5)") { GIVEN { - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_3); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_3); PLAYER(SPECIES_POLITOED) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DRIZZLE); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { diff --git a/test/battle/ability/drought.c b/test/battle/ability/drought.c index ba78643b50..f4d0f83446 100644 --- a/test/battle/ability/drought.c +++ b/test/battle/ability/drought.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Drought sets up sun for 5 turns (Gen6+)") { GIVEN { - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_NINETALES) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DROUGHT); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Drought sets up sun for 5 turns (Gen6+)") SINGLE_BATTLE_TEST("Drought sets up sun for 8 turns with Heat Rock (Gen6+)") { GIVEN { - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_NINETALES) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DROUGHT); Item(ITEM_HEAT_ROCK); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Drought sets up sun for 8 turns with Heat Rock (Gen6+)") SINGLE_BATTLE_TEST("Drought sets up permanent sun (Gen3-5)") { GIVEN { - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_3); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_3); PLAYER(SPECIES_NINETALES) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DROUGHT); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { diff --git a/test/battle/ability/effect_spore.c b/test/battle/ability/effect_spore.c index 59b680f422..a8f9aa4eb7 100644 --- a/test/battle/ability/effect_spore.c +++ b/test/battle/ability/effect_spore.c @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Effect Spore causes poison 3.3% (Gen3), 10% (Gen4) and 9% (G PARAMETRIZE { config = GEN_5; passes = 9; trials = 100; } // 9% PASSES_RANDOMLY(passes, trials, RNG_EFFECT_SPORE); GIVEN { - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } @@ -63,7 +63,7 @@ SINGLE_BATTLE_TEST("Effect Spore causes paralysis 3.3% (Gen3) and 10% (Gen4+) of PARAMETRIZE { config = GEN_5; passes = 1; trials = 10; } // 10% PASSES_RANDOMLY(passes, trials, RNG_EFFECT_SPORE); GIVEN { - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } @@ -86,7 +86,7 @@ SINGLE_BATTLE_TEST("Effect Spore causes sleep 3.3% (Gen3), 10% (Gen4) and 11% (G PARAMETRIZE { config = GEN_5; passes = 11; trials = 100; } // 11% PASSES_RANDOMLY(passes, trials, RNG_EFFECT_SPORE); GIVEN { - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } @@ -109,7 +109,7 @@ SINGLE_BATTLE_TEST("Effect Spore will check if it can inflict status onto attack PARAMETRIZE { config = GEN_5; passes = 11; trials = 100; } // 11% PASSES_RANDOMLY(passes, trials, RNG_EFFECT_SPORE); GIVEN { - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Status1(STATUS1_BURN); Ability(ABILITY_EFFECT_SPORE); } diff --git a/test/battle/ability/flame_body.c b/test/battle/ability/flame_body.c index 8db6f2c142..5d1333de47 100644 --- a/test/battle/ability/flame_body.c +++ b/test/battle/ability/flame_body.c @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Flame Body triggers 1/3 times (Gen3) or 30% (Gen 4+) of the PARAMETRIZE { config = GEN_4; passes = 3; trials = 10; } // 30% PASSES_RANDOMLY(passes, trials, RNG_FLAME_BODY); GIVEN { - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_MAGMAR) { Ability(ABILITY_FLAME_BODY); } diff --git a/test/battle/ability/gale_wings.c b/test/battle/ability/gale_wings.c index cc40d98b87..da8ed8f482 100644 --- a/test/battle/ability/gale_wings.c +++ b/test/battle/ability/gale_wings.c @@ -9,7 +9,7 @@ SINGLE_BATTLE_TEST("Gale Wings only grants priority at full HP (Gen 7+)") PARAMETRIZE { hp = 100; config = GEN_6; } PARAMETRIZE { hp = 99; config = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_GALE_WINGS, config); + WITH_CONFIG(B_GALE_WINGS, config); ASSUME(GetMoveType(MOVE_AERIAL_ACE) == TYPE_FLYING); PLAYER(SPECIES_TALONFLAME) { Ability(ABILITY_GALE_WINGS); HP(hp); MaxHP(100); Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } diff --git a/test/battle/ability/galvanize.c b/test/battle/ability/galvanize.c index 8388780dc0..536bc87076 100644 --- a/test/battle/ability/galvanize.c +++ b/test/battle/ability/galvanize.c @@ -52,7 +52,7 @@ SINGLE_BATTLE_TEST("Galvanize boosts power of affected moves by 20% (Gen7+) or 3 PARAMETRIZE { ability = ABILITY_GALVANIZE; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_ATE_MULTIPLIER, genConfig); + WITH_CONFIG(B_ATE_MULTIPLIER, genConfig); PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ability); Moves(MOVE_TACKLE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/heatproof.c b/test/battle/ability/heatproof.c index 154569fd2a..204592259b 100644 --- a/test/battle/ability/heatproof.c +++ b/test/battle/ability/heatproof.c @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Heatproof halves the damage done by burn from 1/8th to 1/16t PARAMETRIZE { config = GEN_6; burnRate = 16; } GIVEN { - WITH_CONFIG(CONFIG_BURN_DAMAGE, config); + WITH_CONFIG(B_BURN_DAMAGE, config); PLAYER (SPECIES_BRONZONG) { Ability(ABILITY_HEATPROOF); Status1(STATUS1_BURN); } OPPONENT (SPECIES_WOBBUFFET); } @@ -49,4 +49,3 @@ SINGLE_BATTLE_TEST("Heatproof halves the damage done by burn from 1/8th to 1/16t HP_BAR(player, damage: maxHP / burnRate); } } - diff --git a/test/battle/ability/illusion.c b/test/battle/ability/illusion.c index 21ecafc154..2a35953e0c 100644 --- a/test/battle/ability/illusion.c +++ b/test/battle/ability/illusion.c @@ -117,7 +117,7 @@ SINGLE_BATTLE_TEST("Illusion breaks if user loses Illusion due to Worry Seed") SINGLE_BATTLE_TEST("Illusion breaks when attacked behind a substitute") { GIVEN { - WITH_CONFIG(CONFIG_INFILTRATOR_SUBSTITUTE, GEN_6); + WITH_CONFIG(B_INFILTRATOR_SUBSTITUTE, GEN_6); PLAYER(SPECIES_DRAGAPULT) { Ability(ABILITY_INFILTRATOR); Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_ZOROARK) { Speed(2); } diff --git a/test/battle/ability/infiltrator.c b/test/battle/ability/infiltrator.c index bd85b7d5b8..cdb6d7cffe 100644 --- a/test/battle/ability/infiltrator.c +++ b/test/battle/ability/infiltrator.c @@ -167,7 +167,7 @@ SINGLE_BATTLE_TEST("Infiltrator bypasses the opponent's Substitute (Gen 6+)") PARAMETRIZE { ability = ABILITY_INFILTRATOR; config = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_INFILTRATOR_SUBSTITUTE, config); + WITH_CONFIG(B_INFILTRATOR_SUBSTITUTE, config); ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); ASSUME(!MoveIgnoresSubstitute(MOVE_SCRATCH)); PLAYER(SPECIES_DRAGAPULT) { Ability(ability); } @@ -194,7 +194,7 @@ DOUBLE_BATTLE_TEST("Infiltrator bypasses an ally's Substitute (Gen 6+)") PARAMETRIZE { ability = ABILITY_INFILTRATOR; config = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_INFILTRATOR_SUBSTITUTE, config); + WITH_CONFIG(B_INFILTRATOR_SUBSTITUTE, config); ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); ASSUME(!MoveIgnoresSubstitute(MOVE_SCRATCH)); PLAYER(SPECIES_DRAGAPULT) { Ability(ability); } @@ -223,7 +223,7 @@ SINGLE_BATTLE_TEST("Infiltrator doesn't ignore a battler's Substitute when using PARAMETRIZE { ability = ABILITY_INFILTRATOR; move = MOVE_SKY_DROP; } GIVEN { - WITH_CONFIG(CONFIG_INFILTRATOR_SUBSTITUTE, GEN_6); + WITH_CONFIG(B_INFILTRATOR_SUBSTITUTE, GEN_6); ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); ASSUME(GetMoveEffect(MOVE_TRANSFORM) == EFFECT_TRANSFORM); ASSUME(GetMoveEffect(MOVE_SKY_DROP) == EFFECT_SKY_DROP); diff --git a/test/battle/ability/inner_focus.c b/test/battle/ability/inner_focus.c index ef0d8ea8a0..8b2d92a590 100644 --- a/test/battle/ability/inner_focus.c +++ b/test/battle/ability/inner_focus.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Inner Focus doesn't prevent intimidate (Gen3-7)") s16 turnTwoHit; GIVEN { - WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); + WITH_CONFIG(B_UPDATED_INTIMIDATE, GEN_7); PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); } PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); } @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Inner Focus prevents intimidate (Gen8+)") s16 turnTwoHit; GIVEN { - WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); + WITH_CONFIG(B_UPDATED_INTIMIDATE, GEN_8); PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); } PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); } diff --git a/test/battle/ability/intrepid_sword.c b/test/battle/ability/intrepid_sword.c index 2ea924fc26..52d9394d14 100644 --- a/test/battle/ability/intrepid_sword.c +++ b/test/battle/ability/intrepid_sword.c @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage") SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage every time it switches in (Gen8)") { GIVEN { - WITH_CONFIG(CONFIG_INTREPID_SWORD, GEN_8); + WITH_CONFIG(B_INTREPID_SWORD, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } OPPONENT(SPECIES_WYNAUT); @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage every time it swit SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage only once per battle (Gen9+)") { GIVEN { - WITH_CONFIG(CONFIG_INTREPID_SWORD, GEN_9); + WITH_CONFIG(B_INTREPID_SWORD, GEN_9); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/ability/keen_eye.c b/test/battle/ability/keen_eye.c index 7dbef04ee8..17d4459641 100644 --- a/test/battle/ability/keen_eye.c +++ b/test/battle/ability/keen_eye.c @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye prevent accuracy stag PASSES_RANDOMLY(100, 100, RNG_ACCURACY); GIVEN { - WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(B_ILLUMINATE_EFFECT, GEN_9); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye ignore target's evasi PASSES_RANDOMLY(100, 100, RNG_ACCURACY); GIVEN { - WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(B_ILLUMINATE_EFFECT, GEN_9); ASSUME(GetMoveEffect(MOVE_DOUBLE_TEAM) == EFFECT_EVASION_UP); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } @@ -81,7 +81,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye are ignored by Mold B PASSES_RANDOMLY(GetMoveAccuracy(MOVE_SCRATCH) * 3 / 4, 100, RNG_ACCURACY); GIVEN { - WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(B_ILLUMINATE_EFFECT, GEN_9); PLAYER(speciesPlayer) { Ability(abilityPlayer); } OPPONENT(speciesOpponent) { Ability(abilityOpponent); } } WHEN { @@ -104,7 +104,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent Topsy-T PARAMETRIZE { species = SPECIES_URSALUNA_BLOODMOON; ability = ABILITY_MINDS_EYE; } GIVEN { - WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(B_ILLUMINATE_EFFECT, GEN_9); ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP); ASSUME(GetMoveEffect(MOVE_TOPSY_TURVY) == EFFECT_TOPSY_TURVY); PLAYER(SPECIES_WOBBUFFET); @@ -144,7 +144,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent receivi PARAMETRIZE { species = SPECIES_URSALUNA_BLOODMOON; ability = ABILITY_MINDS_EYE; } GIVEN { - WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(B_ILLUMINATE_EFFECT, GEN_9); ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -177,7 +177,7 @@ SINGLE_BATTLE_TEST("Keen Eye & Gen9+ Illuminate don't prevent Spectral Thief fro PARAMETRIZE { species = SPECIES_STARYU; ability = ABILITY_ILLUMINATE; } GIVEN { - WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(B_ILLUMINATE_EFFECT, GEN_9); ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP); ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/leaf_guard.c b/test/battle/ability/leaf_guard.c index 8efa7abdf3..63fcf2d4f0 100644 --- a/test/battle/ability/leaf_guard.c +++ b/test/battle/ability/leaf_guard.c @@ -121,7 +121,7 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents Rest during sun (Gen 5+)") PARAMETRIZE { gen = GEN_4; } PARAMETRIZE { gen = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_LEAF_GUARD_PREVENTS_REST, gen); + WITH_CONFIG(B_LEAF_GUARD_PREVENTS_REST, gen); ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); HP(100); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); @@ -151,7 +151,7 @@ SINGLE_BATTLE_TEST("Leaf Guard doesn't prevent Rest if Cloud Nine/Air Lock is on PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } GIVEN { - WITH_CONFIG(CONFIG_LEAF_GUARD_PREVENTS_REST, GEN_5); + WITH_CONFIG(B_LEAF_GUARD_PREVENTS_REST, GEN_5); ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); HP(100); MaxHP(200); } OPPONENT(species) { Ability(ability); } diff --git a/test/battle/ability/lightning_rod.c b/test/battle/ability/lightning_rod.c index e1fedbe17d..3cd8bc0db9 100644 --- a/test/battle/ability/lightning_rod.c +++ b/test/battle/ability/lightning_rod.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Lightning Rod absorbs Electric-type moves and increases the PARAMETRIZE { config = GEN_4; } PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } @@ -47,7 +47,7 @@ DOUBLE_BATTLE_TEST("Lightning Rod forces single-target Electric-type moves to ta PARAMETRIZE { config = GEN_4; } PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -115,7 +115,7 @@ DOUBLE_BATTLE_TEST("Lightning Rod redirects an ally's attack") DOUBLE_BATTLE_TEST("Lightning Rod absorbs moves that targets all battlers but does not redirect (Gen6+)") { GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/liquid_ooze.c b/test/battle/ability/liquid_ooze.c index 437f8e4c7a..e7a638fa98 100644 --- a/test/battle/ability/liquid_ooze.c +++ b/test/battle/ability/liquid_ooze.c @@ -142,7 +142,7 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes Dream Eater users to lose HP instead of h { s16 damage; GIVEN { - WITH_CONFIG(CONFIG_DREAM_EATER_LIQUID_OOZE, GEN_5); + WITH_CONFIG(B_DREAM_EATER_LIQUID_OOZE, GEN_5); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_DREAM_EATER) == EFFECT_DREAM_EATER); @@ -167,7 +167,7 @@ SINGLE_BATTLE_TEST("Liquid Ooze does not cause Dream Eater users to lose HP inst { s16 damage; GIVEN { - WITH_CONFIG(CONFIG_DREAM_EATER_LIQUID_OOZE, GEN_3); + WITH_CONFIG(B_DREAM_EATER_LIQUID_OOZE, GEN_3); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_DREAM_EATER) == EFFECT_DREAM_EATER); diff --git a/test/battle/ability/magic_bounce.c b/test/battle/ability/magic_bounce.c index efc3173de6..eda1062f84 100644 --- a/test/battle/ability/magic_bounce.c +++ b/test/battle/ability/magic_bounce.c @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Magic Bounce bounces back powder moves") SINGLE_BATTLE_TEST("Magic Bounce cannot bounce back powder moves against Grass Types") { GIVEN { - WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(B_POWDER_GRASS, GEN_6); ASSUME(IsPowderMove(MOVE_STUN_SPORE)); ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); PLAYER(SPECIES_ODDISH); diff --git a/test/battle/ability/moody.c b/test/battle/ability/moody.c index ca04ec1f70..77345c4d8f 100644 --- a/test/battle/ability/moody.c +++ b/test/battle/ability/moody.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Moody randomly raises the user's Attack, Defense, Sp. Atk, S // HP is not included PASSES_RANDOMLY(1, statsNum - 1, RNG_MOODY_INCREASE); GIVEN { - WITH_CONFIG(CONFIG_MOODY_ACC_EVASION, config); + WITH_CONFIG(B_MOODY_ACC_EVASION, config); PLAYER(SPECIES_OCTILLERY) { Ability(ABILITY_MOODY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Moody randomly lowers the user's Attack, Defense, Sp. Atk, S // One stat becomes unavailable due to it already increasing PASSES_RANDOMLY(1, statsNum - 2, RNG_MOODY_DECREASE); GIVEN { - WITH_CONFIG(CONFIG_MOODY_ACC_EVASION, config); + WITH_CONFIG(B_MOODY_ACC_EVASION, config); PLAYER(SPECIES_OCTILLERY) { Ability(ABILITY_MOODY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Moody randomly raises the holder's Attack, Defense, Sp. Atk, PASSES_RANDOMLY(statsNum - 1, statsNum - 1, RNG_MOODY_DECREASE); GIVEN { - WITH_CONFIG(CONFIG_MOODY_ACC_EVASION, config); + WITH_CONFIG(B_MOODY_ACC_EVASION, config); PLAYER(SPECIES_OCTILLERY) { Ability(ABILITY_MOODY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/normalize.c b/test/battle/ability/normalize.c index 09acb4b59f..c4b9cf37c5 100644 --- a/test/battle/ability/normalize.c +++ b/test/battle/ability/normalize.c @@ -87,7 +87,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't boost power of unaffected moves by 20% (< PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - WITH_CONFIG(CONFIG_ATE_MULTIPLIER, GEN_6); + WITH_CONFIG(B_ATE_MULTIPLIER, GEN_6); PLAYER(SPECIES_DELCATTY) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -106,7 +106,7 @@ SINGLE_BATTLE_TEST("Normalize boosts power of unaffected moves by 20% (Gen7+)", PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - WITH_CONFIG(CONFIG_ATE_MULTIPLIER, GEN_7); + WITH_CONFIG(B_ATE_MULTIPLIER, GEN_7); PLAYER(SPECIES_DELCATTY) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -125,7 +125,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't boost power of affected moves by 20% (< Ge PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - WITH_CONFIG(CONFIG_ATE_MULTIPLIER, GEN_6); + WITH_CONFIG(B_ATE_MULTIPLIER, GEN_6); PLAYER(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -144,7 +144,7 @@ SINGLE_BATTLE_TEST("Normalize boosts power of affected moves by 20% (Gen7+)", s1 PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - WITH_CONFIG(CONFIG_ATE_MULTIPLIER, GEN_7); + WITH_CONFIG(B_ATE_MULTIPLIER, GEN_7); PLAYER(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/oblivious.c b/test/battle/ability/oblivious.c index 03f71d7f55..ecbf2d3f5f 100644 --- a/test/battle/ability/oblivious.c +++ b/test/battle/ability/oblivious.c @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Oblivious prevents Taunt (Gen6+)") PARAMETRIZE { gen = GEN_5; } PARAMETRIZE { gen = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_OBLIVIOUS_TAUNT, gen); + WITH_CONFIG(B_OBLIVIOUS_TAUNT, gen); ASSUME(GetMoveEffect(MOVE_TAUNT) == EFFECT_TAUNT); PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); } OPPONENT(SPECIES_WOBBUFFET); @@ -66,7 +66,7 @@ SINGLE_BATTLE_TEST("Oblivious prevents Taunt (Gen6+)") SINGLE_BATTLE_TEST("Oblivious doesn't prevent Intimidate (Gen3-7)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); + WITH_CONFIG(B_UPDATED_INTIMIDATE, GEN_7); PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } @@ -86,7 +86,7 @@ SINGLE_BATTLE_TEST("Oblivious doesn't prevent Intimidate (Gen3-7)") SINGLE_BATTLE_TEST("Oblivious prevents Intimidate (Gen8+)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); + WITH_CONFIG(B_UPDATED_INTIMIDATE, GEN_8); PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } diff --git a/test/battle/ability/overcoat.c b/test/battle/ability/overcoat.c index 7346691c46..c88d305c11 100644 --- a/test/battle/ability/overcoat.c +++ b/test/battle/ability/overcoat.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Overcoat blocks powder and spore moves (Gen6+)") PARAMETRIZE { gen = GEN_5; } PARAMETRIZE { gen = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_POWDER_OVERCOAT, gen); + WITH_CONFIG(B_POWDER_OVERCOAT, gen); ASSUME(IsPowderMove(MOVE_STUN_SPORE)); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_PINECO) { Ability(ABILITY_OVERCOAT); } @@ -77,7 +77,7 @@ SINGLE_BATTLE_TEST("Overcoat blocks Effect Spore's effect (Gen6+)") PARAMETRIZE { config = GEN_5; } PARAMETRIZE { config = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_POWDER_OVERCOAT, config); + WITH_CONFIG(B_POWDER_OVERCOAT, config); PLAYER(SPECIES_PINECO) { Ability(ABILITY_OVERCOAT); } OPPONENT(SPECIES_SHROOMISH) { Ability(ABILITY_EFFECT_SPORE); } } WHEN { diff --git a/test/battle/ability/own_tempo.c b/test/battle/ability/own_tempo.c index 06b6f366ff..3195f2fcf1 100644 --- a/test/battle/ability/own_tempo.c +++ b/test/battle/ability/own_tempo.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Own Tempo doesn't prevent Intimidate (Gen3-7)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); + WITH_CONFIG(B_UPDATED_INTIMIDATE, GEN_7); ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); } @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Own Tempo doesn't prevent Intimidate (Gen3-7)") SINGLE_BATTLE_TEST("Own Tempo prevents Intimidate but no other stat down changes (Gen8+)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); + WITH_CONFIG(B_UPDATED_INTIMIDATE, GEN_8); ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); } diff --git a/test/battle/ability/parental_bond.c b/test/battle/ability/parental_bond.c index d8be7c76f2..296a0643ff 100644 --- a/test/battle/ability/parental_bond.c +++ b/test/battle/ability/parental_bond.c @@ -111,7 +111,7 @@ SINGLE_BATTLE_TEST("Parental Bond-converted moves only hit once on Lightning Rod PARAMETRIZE { move = MOVE_THUNDERBOLT; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; type = TYPE_ELECTRIC; } PARAMETRIZE { move = MOVE_SURF; ability = ABILITY_STORM_DRAIN; species = SPECIES_LILEEP; type = TYPE_WATER; } GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveStrikeCount(move) < 2); ASSUME(GetMoveType(move) == type); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -142,7 +142,7 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(B_MULTI_HIT_CHANCE, genConfig); ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -171,7 +171,7 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(B_MULTI_HIT_CHANCE, genConfig); ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -201,7 +201,7 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(B_MULTI_HIT_CHANCE, genConfig); ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -232,7 +232,7 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(B_MULTI_HIT_CHANCE, genConfig); ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } diff --git a/test/battle/ability/pickup.c b/test/battle/ability/pickup.c index bf74823361..56e014c2c2 100644 --- a/test/battle/ability/pickup.c +++ b/test/battle/ability/pickup.c @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Pickup grants an item used by another Pokémon") WILD_BATTLE_TEST("Pickup grants an item used by itself in wild battles (Gen9+)") { GIVEN { - WITH_CONFIG(CONFIG_PICKUP_WILD, GEN_9); + WITH_CONFIG(B_PICKUP_WILD, GEN_9); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/pixilate.c b/test/battle/ability/pixilate.c index 58c6488903..469db8eabe 100644 --- a/test/battle/ability/pixilate.c +++ b/test/battle/ability/pixilate.c @@ -31,7 +31,7 @@ SINGLE_BATTLE_TEST("Pixilate boosts power of affected moves by 20% (Gen7+) or 30 PARAMETRIZE { ability = ABILITY_PIXILATE; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_ATE_MULTIPLIER, genConfig); + WITH_CONFIG(B_ATE_MULTIPLIER, genConfig); PLAYER(SPECIES_SYLVEON) { Ability(ability); Moves(MOVE_TACKLE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/poison_point.c b/test/battle/ability/poison_point.c index 2b6c4aa19f..2056922f31 100644 --- a/test/battle/ability/poison_point.c +++ b/test/battle/ability/poison_point.c @@ -38,7 +38,7 @@ SINGLE_BATTLE_TEST("Poison Point triggers 1/3 times (Gen3) or 30% (Gen 4+) of th PARAMETRIZE { config = GEN_4; passes = 3; trials = 10; } // 30% PASSES_RANDOMLY(passes, trials, RNG_POISON_POINT); GIVEN { - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_NIDORAN_M) { Ability(ABILITY_POISON_POINT); } diff --git a/test/battle/ability/prankster.c b/test/battle/ability/prankster.c index 0f1fcd0930..10f613bf21 100644 --- a/test/battle/ability/prankster.c +++ b/test/battle/ability/prankster.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type Pokémon (Ge PARAMETRIZE { gen = GEN_6; } PARAMETRIZE { gen = GEN_7; } GIVEN { - WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, gen); + WITH_CONFIG(B_PRANKSTER_DARK_TYPES, gen); PLAYER(SPECIES_UMBREON); OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } } WHEN { @@ -31,7 +31,7 @@ SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type Pokémon (Ge SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type Pokémon after they switch-in") { GIVEN { - WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, GEN_7); + WITH_CONFIG(B_PRANKSTER_DARK_TYPES, GEN_7); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_UMBREON); OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } @@ -64,7 +64,7 @@ SINGLE_BATTLE_TEST("Prankster-affected moves called via Assist don't affect Dark PARAMETRIZE { gen = GEN_6; } PARAMETRIZE { gen = GEN_7; } GIVEN { - WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, gen); + WITH_CONFIG(B_PRANKSTER_DARK_TYPES, gen); PLAYER(SPECIES_UMBREON); OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CONFUSE_RAY); } @@ -87,7 +87,7 @@ DOUBLE_BATTLE_TEST("Prankster-affected moves called via Instruct do not affect D PARAMETRIZE { gen = GEN_6; } PARAMETRIZE { gen = GEN_7; } GIVEN { - WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, gen); + WITH_CONFIG(B_PRANKSTER_DARK_TYPES, gen); PLAYER(SPECIES_VOLBEAT) { Speed(20); Ability(ABILITY_PRANKSTER); } PLAYER(SPECIES_WOBBUFFET) { Speed(10); } OPPONENT(SPECIES_UMBREON) { Speed(15); } @@ -203,7 +203,7 @@ SINGLE_BATTLE_TEST("Prankster-affected moves which are reflected by Magic Coat c PARAMETRIZE { sableyeAbility = ABILITY_KEEN_EYE; } GIVEN { - WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, GEN_7); + WITH_CONFIG(B_PRANKSTER_DARK_TYPES, GEN_7); PLAYER(SPECIES_SABLEYE) { Ability(sableyeAbility); } OPPONENT(SPECIES_MURKROW) { Ability(ABILITY_PRANKSTER); } } WHEN { diff --git a/test/battle/ability/protean.c b/test/battle/ability/protean.c index 7ebec1ff6e..74f53ba37e 100644 --- a/test/battle/ability/protean.c +++ b/test/battle/ability/protean.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Protean/Libero changes the type of the user to the move used PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_KECLEON; } PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } GIVEN { - WITH_CONFIG(CONFIG_PROTEAN_LIBERO, GEN_6); + WITH_CONFIG(B_PROTEAN_LIBERO, GEN_6); PLAYER(SPECIES_REGIROCK); OPPONENT(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); @@ -45,7 +45,7 @@ SINGLE_BATTLE_TEST("Protean/Libero changes the type of the user only once per sw PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_KECLEON; } PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } GIVEN { - WITH_CONFIG(CONFIG_PROTEAN_LIBERO, GEN_9); + WITH_CONFIG(B_PROTEAN_LIBERO, GEN_9); PLAYER(SPECIES_REGIROCK); OPPONENT(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/protosynthesis.c b/test/battle/ability/protosynthesis.c index f6d55b38a3..7f179d592e 100644 --- a/test/battle/ability/protosynthesis.c +++ b/test/battle/ability/protosynthesis.c @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Protosynthesis ability pop up activates only once during the u16 turns; GIVEN { - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_WALKING_WAKE) { Ability(ABILITY_PROTOSYNTHESIS); } OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); } } WHEN { diff --git a/test/battle/ability/rattled.c b/test/battle/ability/rattled.c index 485ce9daf0..9dae009e03 100644 --- a/test/battle/ability/rattled.c +++ b/test/battle/ability/rattled.c @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when hit by Bug, Dark or Ghost typ SINGLE_BATTLE_TEST("Rattled does not boost speed by 1 when affected by Intimidate (Gen5-7)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); + WITH_CONFIG(B_UPDATED_INTIMIDATE, GEN_7); PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); } OPPONENT(SPECIES_SUDOWOODO) { Ability(ABILITY_RATTLED); } } WHEN { @@ -75,7 +75,7 @@ SINGLE_BATTLE_TEST("Rattled does not boost speed by 1 when affected by Intimidat SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when affected by Intimidate (Gen8+)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); + WITH_CONFIG(B_UPDATED_INTIMIDATE, GEN_8); PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); } OPPONENT(SPECIES_SUDOWOODO) { Ability(ABILITY_RATTLED); } } WHEN { diff --git a/test/battle/ability/refrigerate.c b/test/battle/ability/refrigerate.c index f0d7ec89ee..e3af5e0acd 100644 --- a/test/battle/ability/refrigerate.c +++ b/test/battle/ability/refrigerate.c @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Refrigerate boosts power of affected moves by 20% (Gen7+) or PARAMETRIZE { ability = ABILITY_REFRIGERATE; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_ATE_MULTIPLIER, genConfig); + WITH_CONFIG(B_ATE_MULTIPLIER, genConfig); PLAYER(SPECIES_AMAURA) { Ability(ability); Moves(MOVE_TACKLE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Weather Ball's type", s16 damage) PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_REFRIGERATE; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_REFRIGERATE; } GIVEN { - WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_9); //To prevent capturing hail damage + WITH_CONFIG(B_SNOW_WARNING, GEN_9); //To prevent capturing hail damage ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG); PLAYER(SPECIES_AMAURA) { Ability(ability); } diff --git a/test/battle/ability/sand_stream.c b/test/battle/ability/sand_stream.c index a1b9464c2a..bf5edaa598 100644 --- a/test/battle/ability/sand_stream.c +++ b/test/battle/ability/sand_stream.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Sand Stream sets up sandstorm for 5 turns (Gen6+)") { GIVEN { - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_HIPPOWDON) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SAND_STREAM); } OPPONENT(SPECIES_SANDSLASH) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Sand Stream sets up sandstorm for 5 turns (Gen6+)") SINGLE_BATTLE_TEST("Sand Stream sets up sandstorm for 8 turns with Smooth Rock (Gen6+)") { GIVEN { - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_HIPPOWDON) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SAND_STREAM); Item(ITEM_SMOOTH_ROCK); } OPPONENT(SPECIES_SANDSLASH) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Sand Stream sets up sandstorm for 8 turns with Smooth Rock ( SINGLE_BATTLE_TEST("Sand Stream sets up permanent sandstorm (Gen3-5)") { GIVEN { - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_3); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_3); PLAYER(SPECIES_HIPPOWDON) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SAND_STREAM); } OPPONENT(SPECIES_SANDSLASH) { Moves(MOVE_CELEBRATE); } } WHEN { diff --git a/test/battle/ability/scrappy.c b/test/battle/ability/scrappy.c index 58543911f8..dd9c478112 100644 --- a/test/battle/ability/scrappy.c +++ b/test/battle/ability/scrappy.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Scrappy doesn't prevent Intimidate (Gen4-7)") s16 turnTwoHit; GIVEN { - WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); + WITH_CONFIG(B_UPDATED_INTIMIDATE, GEN_7); PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); } PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); } @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Scrappy prevents Intimidate (Gen8+)") s16 turnTwoHit; GIVEN { - WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); + WITH_CONFIG(B_UPDATED_INTIMIDATE, GEN_8); PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); } PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); } diff --git a/test/battle/ability/shed_skin.c b/test/battle/ability/shed_skin.c index 73f09bc9e9..d80bd4d48b 100644 --- a/test/battle/ability/shed_skin.c +++ b/test/battle/ability/shed_skin.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Shed Skin triggers 33% (Gen3, Gen5+) or 30% (Gen 4) of the t PASSES_RANDOMLY(passes, 100, RNG_SHED_SKIN); GIVEN { - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ARBOK) { Status1(STATUS1_POISON); Ability(ABILITY_SHED_SKIN); } diff --git a/test/battle/ability/snow_warning.c b/test/battle/ability/snow_warning.c index bfb27c5f49..94a463fbb3 100644 --- a/test/battle/ability/snow_warning.c +++ b/test/battle/ability/snow_warning.c @@ -4,8 +4,8 @@ SINGLE_BATTLE_TEST("Snow Warning sets up hail for 5 turns (Gen6-8)") { GIVEN { - WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_8); - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(B_SNOW_WARNING, GEN_8); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_ABOMASNOW) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SNOW_WARNING); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -27,8 +27,8 @@ SINGLE_BATTLE_TEST("Snow Warning sets up hail for 5 turns (Gen6-8)") SINGLE_BATTLE_TEST("Snow Warning sets up hail for 8 turns with Icy Rock (Gen6-8)") { GIVEN { - WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_8); - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(B_SNOW_WARNING, GEN_8); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_ABOMASNOW) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SNOW_WARNING); Item(ITEM_ICY_ROCK); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -56,8 +56,8 @@ SINGLE_BATTLE_TEST("Snow Warning sets up hail for 8 turns with Icy Rock (Gen6-8) SINGLE_BATTLE_TEST("Snow Warning sets up permanent hail (Gen4-5)") { GIVEN { - WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_8); - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_5); + WITH_CONFIG(B_SNOW_WARNING, GEN_8); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_5); PLAYER(SPECIES_ABOMASNOW) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SNOW_WARNING); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -88,8 +88,8 @@ SINGLE_BATTLE_TEST("Snow Warning sets up permanent hail (Gen4-5)") SINGLE_BATTLE_TEST("Snow Warning sets up snow for 5 turns (Gen9+)") { GIVEN { - WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_9); - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_9); + WITH_CONFIG(B_SNOW_WARNING, GEN_9); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_9); PLAYER(SPECIES_ABOMASNOW) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SNOW_WARNING); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -111,8 +111,8 @@ SINGLE_BATTLE_TEST("Snow Warning sets up snow for 5 turns (Gen9+)") SINGLE_BATTLE_TEST("Snow Warning sets up snow for 8 turns with Icy Rock (Gen9+)") { GIVEN { - WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_9); - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_9); + WITH_CONFIG(B_SNOW_WARNING, GEN_9); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_9); PLAYER(SPECIES_ABOMASNOW) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SNOW_WARNING); Item(ITEM_ICY_ROCK); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { diff --git a/test/battle/ability/stalwart.c b/test/battle/ability/stalwart.c index 3cca8e58ad..762898384d 100644 --- a/test/battle/ability/stalwart.c +++ b/test/battle/ability/stalwart.c @@ -27,7 +27,7 @@ DOUBLE_BATTLE_TEST("Stalwart stops Lightning Rod and Storm Drain from redirectin PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; config = GEN_4; } PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_SPARK) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_STALWART); } diff --git a/test/battle/ability/static.c b/test/battle/ability/static.c index c40197e742..ad54b691e3 100644 --- a/test/battle/ability/static.c +++ b/test/battle/ability/static.c @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Static triggers 1/3 times (Gen3) or 30% (Gen4+) of the time" PARAMETRIZE { config = GEN_4; passes = 3; trials = 10; } // 30% PASSES_RANDOMLY(passes, trials, RNG_STATIC); GIVEN { - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIKACHU) { Ability(ABILITY_STATIC); } diff --git a/test/battle/ability/sticky_hold.c b/test/battle/ability/sticky_hold.c index b4fb047cbe..b9cbc407f4 100644 --- a/test/battle/ability/sticky_hold.c +++ b/test/battle/ability/sticky_hold.c @@ -31,7 +31,7 @@ SINGLE_BATTLE_TEST("Sticky Hold prevents Incinerate from destroying berries") SINGLE_BATTLE_TEST("Sticky Hold prevents Incinerate from destroying gems") { GIVEN { - WITH_CONFIG(CONFIG_INCINERATE_GEMS, GEN_6); + WITH_CONFIG(B_INCINERATE_GEMS, GEN_6); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_INCINERATE); } OPPONENT(SPECIES_GASTRODON) { Ability(ABILITY_STICKY_HOLD); Item(ITEM_GHOST_GEM); } } WHEN { diff --git a/test/battle/ability/storm_drain.c b/test/battle/ability/storm_drain.c index c1cf5c890b..beb1463145 100644 --- a/test/battle/ability/storm_drain.c +++ b/test/battle/ability/storm_drain.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Storm Drain absorbs Water-type moves and increases the Sp. A PARAMETRIZE { config = GEN_4; } PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GASTRODON_EAST) { Ability(ABILITY_STORM_DRAIN); } @@ -41,7 +41,7 @@ DOUBLE_BATTLE_TEST("Storm Drain forces single-target Water-type moves to target PARAMETRIZE { config = GEN_4; } PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/sturdy.c b/test/battle/ability/sturdy.c index 7087de3a02..dda23b6d5c 100644 --- a/test/battle/ability/sturdy.c +++ b/test/battle/ability/sturdy.c @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Sturdy prevents OHKOs (Gen5+)") PARAMETRIZE { config = GEN_4; } PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_STURDY, config); + WITH_CONFIG(B_STURDY, config); PLAYER(SPECIES_GEODUDE) { Ability(ABILITY_STURDY); MaxHP(100); HP(100); } PLAYER(SPECIES_GEODUDE); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/super_luck.c b/test/battle/ability/super_luck.c index d271c6ff69..0073129f3d 100644 --- a/test/battle/ability/super_luck.c +++ b/test/battle/ability/super_luck.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Super Luck increases the critical hit ratio by 1 stage") PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { ASSUME(GetSpeciesBaseSpeed(SPECIES_TOGEPI) == 20); - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); PLAYER(SPECIES_TOGEPI) { Ability(ABILITY_SUPER_LUCK); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/symbiosis.c b/test/battle/ability/symbiosis.c index 44e7c5f1bd..d37f60c8a2 100644 --- a/test/battle/ability/symbiosis.c +++ b/test/battle/ability/symbiosis.c @@ -137,7 +137,7 @@ DOUBLE_BATTLE_TEST("Symbiosis transfers its item after Gem consumption and move { GIVEN { ASSUME(GetItemHoldEffect(ITEM_NORMAL_GEM) == HOLD_EFFECT_GEMS); - WITH_CONFIG(CONFIG_SYMBIOSIS_GEMS, GEN_7); + WITH_CONFIG(B_SYMBIOSIS_GEMS, GEN_7); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); } PLAYER(SPECIES_ORANGURU) { Ability(ABILITY_SYMBIOSIS); Item(ITEM_TOXIC_ORB); } OPPONENT(SPECIES_WOBBUFFET); @@ -160,7 +160,7 @@ DOUBLE_BATTLE_TEST("Symbiosis transfers its item after Gem consumption, but befo { GIVEN { ASSUME(GetItemHoldEffect(ITEM_NORMAL_GEM) == HOLD_EFFECT_GEMS); - WITH_CONFIG(CONFIG_SYMBIOSIS_GEMS, GEN_6); + WITH_CONFIG(B_SYMBIOSIS_GEMS, GEN_6); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); } PLAYER(SPECIES_ORANGURU) { Ability(ABILITY_SYMBIOSIS); Item(ITEM_TOXIC_ORB); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/synchronize.c b/test/battle/ability/synchronize.c index 8604814fab..15013abf7f 100644 --- a/test/battle/ability/synchronize.c +++ b/test/battle/ability/synchronize.c @@ -9,7 +9,7 @@ SINGLE_BATTLE_TEST("Synchronize will mirror back non volatile status back at opp GIVEN { ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); - WITH_CONFIG(CONFIG_SYNCHRONIZE_TOXIC, config); + WITH_CONFIG(B_SYNCHRONIZE_TOXIC, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ABRA) { Ability(ABILITY_SYNCHRONIZE); } } WHEN { @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Synchronize will mirror back non volatile status back at opp SINGLE_BATTLE_TEST("Synchronize will still show up the ability pop up even if it fails") { GIVEN { - WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, GEN_6); + WITH_CONFIG(B_PARALYZE_ELECTRIC, GEN_6); ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_PIKACHU) { Ability(ABILITY_STATIC); } OPPONENT(SPECIES_ABRA) { Ability(ABILITY_SYNCHRONIZE); } diff --git a/test/battle/ability/weak_armor.c b/test/battle/ability/weak_armor.c index b8a9337d67..3682c3dcdd 100644 --- a/test/battle/ability/weak_armor.c +++ b/test/battle/ability/weak_armor.c @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Weak Armor lowers Defense by 1 and boosts Speed by 1 (Gen5-6 PARAMETRIZE { move = MOVE_GUST; gen = GEN_7; } GIVEN { - WITH_CONFIG(CONFIG_WEAK_ARMOR_SPEED, gen); + WITH_CONFIG(B_WEAK_ARMOR_SPEED, gen); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -84,7 +84,7 @@ SINGLE_BATTLE_TEST("Weak Armor still boosts Speed if Defense can't go any lower" PARAMETRIZE { gen = GEN_6; } PARAMETRIZE { gen = GEN_7; } GIVEN { - WITH_CONFIG(CONFIG_WEAK_ARMOR_SPEED, gen); + WITH_CONFIG(B_WEAK_ARMOR_SPEED, gen); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -144,7 +144,7 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Defense can' { u32 j; GIVEN { - WITH_CONFIG(CONFIG_WEAK_ARMOR_SPEED, GEN_7); + WITH_CONFIG(B_WEAK_ARMOR_SPEED, GEN_7); PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); } OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); } } WHEN { @@ -183,7 +183,7 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Speed can't { u32 j; GIVEN { - WITH_CONFIG(CONFIG_WEAK_ARMOR_SPEED, GEN_7); + WITH_CONFIG(B_WEAK_ARMOR_SPEED, GEN_7); PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); } OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); } } WHEN { diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 43c6740f48..3d3b35111f 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -699,7 +699,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use thawing moves if target is frozen unless it PARAMETRIZE { status = STATUS1_FROSTBITE; aiMove = MOVE_EMBER; aiFlags = AI_FLAG_CHECK_BAD_MOVE; } GIVEN { - WITH_CONFIG(CONFIG_BURN_HIT_THAW, GEN_6); // In Gen 5, non-Fire burning moves didn't cause thawing + WITH_CONFIG(B_BURN_HIT_THAW, GEN_6); // In Gen 5, non-Fire burning moves didn't cause thawing ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); @@ -846,7 +846,7 @@ AI_DOUBLE_BATTLE_TEST("AI sees opposing drain ability") ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_RAZOR_LEAF) != TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_METAL_CLAW) != TYPE_ELECTRIC); - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); Moves(MOVE_CELEBRATE); } PLAYER(SPECIES_KRABBY) { Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_CELEBRATE); } @@ -942,7 +942,7 @@ AI_SINGLE_BATTLE_TEST("AI will see Magnitude damage") AI_SINGLE_BATTLE_TEST("AI will prefer resisted move over failing move") { GIVEN { - WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(B_POWDER_GRASS, GEN_6); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); PLAYER(SPECIES_ROSELIA) { Moves(MOVE_ABSORB); } OPPONENT(SPECIES_GLOOM) { Moves(MOVE_MEGA_DRAIN, MOVE_STUN_SPORE, MOVE_LEECH_SEED, MOVE_SYNTHESIS); } diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index f5bd39b27b..e019a11e3e 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -18,7 +18,7 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Facade") PARAMETRIZE { status1 = STATUS1_BURN; expectedMove = MOVE_FACADE; } GIVEN { - WITH_CONFIG(CONFIG_BURN_FACADE_DMG, GEN_6); + WITH_CONFIG(B_BURN_FACADE_DMG, GEN_6); ASSUME(GetMoveEffect(MOVE_FACADE) == EFFECT_FACADE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(60); } @@ -237,7 +237,7 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner") GIVEN { ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); - WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, GEN_8); + WITH_CONFIG(B_HEAL_BELL_SOUNDPROOF, GEN_8); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -286,7 +286,7 @@ AI_SINGLE_BATTLE_TEST("AI chooses moves that cure inactive party members") GIVEN { ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); - WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(B_HEAL_BELL_SOUNDPROOF, config); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_REGIROCK) { Moves(MOVE_BODY_PRESS, MOVE_HEAL_BELL); } diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index 955c82b9f9..52834474f4 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -553,7 +553,7 @@ AI_DOUBLE_BATTLE_TEST("AI treats an ally's redirection ability appropriately") ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE); - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, config); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_HEADBUTT); } diff --git a/test/battle/ai/ai_flag_predict_switch.c b/test/battle/ai/ai_flag_predict_switch.c index 6f484b6378..9bae9c4bc7 100644 --- a/test/battle/ai/ai_flag_predict_switch.c +++ b/test/battle/ai/ai_flag_predict_switch.c @@ -59,7 +59,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: Considers ShouldSwitch and GetMos // Switching in trapper is an advanced feature of ShouldSwitch that requires GetMostSuitableMonToSwitchInto to also return a specific mon; this passing means the AI can use both in prediction PASSES_RANDOMLY(5, 10, RNG_AI_PREDICT_SWITCH); GIVEN { - WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(B_POWDER_GRASS, GEN_6); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON); PLAYER(SPECIES_SKARMORY) { Moves(MOVE_SCRATCH); } PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_ACROBATICS); } diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 36a859f62c..7d7cf7561f 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -405,7 +405,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Switch effect moves will send ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); ASSUME(GetMoveEffect(MOVE_CHILLY_RECEPTION) == EFFECT_CHILLY_RECEPTION); ASSUME(GetMoveEffect(MOVE_SHED_TAIL) == EFFECT_SHED_TAIL); - WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(B_TELEPORT_BEHAVIOR, GEN_8); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_ACE_POKEMON); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(aiMove); } @@ -1111,8 +1111,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an PARAMETRIZE { aiMon = SPECIES_SHELLDER; absorbingAbility = ABILITY_OVERCOAT; move = MOVE_MAGIC_POWDER; } PARAMETRIZE { aiMon = SPECIES_SHELLDER; absorbingAbility = ABILITY_OVERCOAT; move = MOVE_STUN_SPORE; } GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); - WITH_CONFIG(CONFIG_POWDER_OVERCOAT, GEN_6); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_POWDER_OVERCOAT, GEN_6); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_ZIGZAGOON) { Moves(move); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } @@ -1204,7 +1204,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if Encore'd i { PASSES_RANDOMLY(SHOULD_SWITCH_ENCORE_DAMAGE_PERCENTAGE, 100, RNG_AI_SWITCH_ENCORE); GIVEN { - WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); + WITH_CONFIG(B_ENCORE_TARGET, GEN_3); ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_AZURILL) { Moves(MOVE_SCRATCH, MOVE_ENCORE); } @@ -1322,7 +1322,7 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch into mon with good type matchup AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI correctly handles abilities when scoring moves") { GIVEN { - WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, GEN_7); + WITH_CONFIG(B_PRANKSTER_DARK_TYPES, GEN_7); ASSUME(GetSpeciesType(SPECIES_GRENINJA, 1) == TYPE_DARK); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_GRENINJA) { Moves(MOVE_WATER_GUN); } @@ -1665,7 +1665,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will consider Hidden Power wh { PASSES_RANDOMLY(SHOULD_SWITCH_ABSORBS_HIDDEN_POWER_PERCENTAGE, 100, RNG_AI_SWITCH_ABSORBING_HIDDEN_POWER); GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_HIDDEN_POWER); HPIV(31); AttackIV(30); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(30); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } diff --git a/test/battle/ai/check_bad_move.c b/test/battle/ai/check_bad_move.c index c5a34f0df4..210a27d82b 100644 --- a/test/battle/ai/check_bad_move.c +++ b/test/battle/ai/check_bad_move.c @@ -16,7 +16,7 @@ AI_SINGLE_BATTLE_TEST("AI will not try to lower opposing stats if target is prot PARAMETRIZE { ability = ABILITY_CLEAR_BODY; species = SPECIES_BELDUM; move = MOVE_NOBLE_ROAR; } GIVEN { - WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(B_ILLUMINATE_EFFECT, GEN_9); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_OMNISCIENT); PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, move); } diff --git a/test/battle/badge_boost.c b/test/battle/badge_boost.c index bc60778cb1..3227926c71 100644 --- a/test/battle/badge_boost.c +++ b/test/battle/badge_boost.c @@ -16,7 +16,7 @@ WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_ATTACK boost Attack", s16 dmg) FlagSet(B_FLAG_BADGE_BOOST_ATTACK); else FlagClear(B_FLAG_BADGE_BOOST_ATTACK); - WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + WITH_CONFIG(B_BADGE_BOOST, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -48,7 +48,7 @@ WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_SPATK boost Special Attack", s FlagSet(B_FLAG_BADGE_BOOST_SPATK); else FlagClear(B_FLAG_BADGE_BOOST_SPATK); - WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + WITH_CONFIG(B_BADGE_BOOST, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -81,7 +81,7 @@ WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_DEFENSE boost Defense", s16 dm FlagSet(B_FLAG_BADGE_BOOST_DEFENSE); else FlagClear(B_FLAG_BADGE_BOOST_DEFENSE); - WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + WITH_CONFIG(B_BADGE_BOOST, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -114,7 +114,7 @@ WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_SPDEF boost Special Defense", FlagSet(B_FLAG_BADGE_BOOST_SPDEF); else FlagClear(B_FLAG_BADGE_BOOST_SPDEF); - WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + WITH_CONFIG(B_BADGE_BOOST, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -146,7 +146,7 @@ WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_SPEED boost Speed", s16 dmg) FlagSet(B_FLAG_BADGE_BOOST_SPEED); else FlagClear(B_FLAG_BADGE_BOOST_SPEED); - WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + WITH_CONFIG(B_BADGE_BOOST, genConfig); PLAYER(SPECIES_WOBBUFFET) { Speed(100); HP(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(101); HP(1); } } WHEN { diff --git a/test/battle/crit_chance.c b/test/battle/crit_chance.c index 58650f7f5d..9e5aed9974 100644 --- a/test/battle/crit_chance.c +++ b/test/battle/crit_chance.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Critical hits without modifiers occur at different rates by PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Crit Chance: Raising critical hit rate to 3 guarantees a cri PARAMETRIZE { genConfig = j; passes = 1, trials = 1; } // 100% PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1); ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS); PLAYER(SPECIES_TOGEKISS) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); } diff --git a/test/battle/damage_formula.c b/test/battle/damage_formula.c index b62ed36ad9..da25d8c1f7 100644 --- a/test/battle/damage_formula.c +++ b/test/battle/damage_formula.c @@ -62,7 +62,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen6+ (Muscle Band, crit)") PARAMETRIZE { expectedDamage = 276; } PARAMETRIZE { expectedDamage = 268; } GIVEN { - WITH_CONFIG(CONFIG_CRIT_MULTIPLIER, GEN_6); + WITH_CONFIG(B_CRIT_MULTIPLIER, GEN_6); ASSUME(GetMoveCategory(MOVE_ICE_FANG) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_GLACEON) { Level(75); Attack(123); Item(ITEM_MUSCLE_BAND); } OPPONENT(SPECIES_GARCHOMP) { Defense(163); } @@ -384,7 +384,7 @@ DOUBLE_BATTLE_TEST("Transistor Damage calculation", s16 damage) } } GIVEN { - WITH_CONFIG(CONFIG_TRANSISTOR_BOOST, gen); + WITH_CONFIG(B_TRANSISTOR_BOOST, gen); ASSUME(GetMoveType(MOVE_WILD_CHARGE) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); ASSUME(GetMoveCategory(MOVE_WILD_CHARGE) == DAMAGE_CATEGORY_PHYSICAL); diff --git a/test/battle/exp.c b/test/battle/exp.c index c22b7fa2f5..803cdfb630 100644 --- a/test/battle/exp.c +++ b/test/battle/exp.c @@ -11,7 +11,7 @@ WILD_BATTLE_TEST("Pokemon gain experience after catching a Pokemon (Gen6+)") PARAMETRIZE { level = 50; config = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_EXP_CATCH, config); + WITH_CONFIG(B_EXP_CATCH, config); PLAYER(SPECIES_WOBBUFFET) { Level(level); } OPPONENT(SPECIES_CATERPIE) { HP(1); } } WHEN { diff --git a/test/battle/form_change/end_battle.c b/test/battle/form_change/end_battle.c index c3ae62f77d..4d18693827 100644 --- a/test/battle/form_change/end_battle.c +++ b/test/battle/form_change/end_battle.c @@ -125,7 +125,7 @@ SINGLE_BATTLE_TEST("Meloetta returns to Aria form upon battle end after using Re SINGLE_BATTLE_TEST("Battle Bond Greninja returns to base form upon battle end after knocking out an opponent") { GIVEN { - WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(B_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND); OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -194,7 +194,7 @@ SINGLE_BATTLE_TEST("Mimikyu Busted reverts to Disguised form upon battle end aft PARAMETRIZE { species = SPECIES_MIMIKYU_DISGUISED; } PARAMETRIZE { species = SPECIES_MIMIKYU_TOTEM_DISGUISED; } GIVEN { - WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_7); + WITH_CONFIG(B_DISGUISE_HP_LOSS, GEN_7); PLAYER(species) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/form_change/mega_evolution.c b/test/battle/form_change/mega_evolution.c index 8e1945c558..bd076f2cc0 100644 --- a/test/battle/form_change/mega_evolution.c +++ b/test/battle/form_change/mega_evolution.c @@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Rayquaza can Mega Evolve knowing Dragon Ascent") SINGLE_BATTLE_TEST("Mega Evolution doesn't affect turn order (Gen6)") { GIVEN { - WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_6); + WITH_CONFIG(B_MEGA_EVO_TURN_ORDER, GEN_6); PLAYER(SPECIES_GARDEVOIR) { Item(ITEM_GARDEVOIRITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -90,7 +90,7 @@ SINGLE_BATTLE_TEST("Mega Evolution doesn't affect turn order (Gen6)") SINGLE_BATTLE_TEST("Mega Evolution affects turn order (Gen7+)") { GIVEN { - WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); + WITH_CONFIG(B_MEGA_EVO_TURN_ORDER, GEN_7); PLAYER(SPECIES_GARDEVOIR) { Item(ITEM_GARDEVOIRITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -106,7 +106,7 @@ SINGLE_BATTLE_TEST("Mega Evolution affects turn order (Gen7+)") SINGLE_BATTLE_TEST("Abilities replaced by Mega Evolution do not affect turn order") { GIVEN { - WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); + WITH_CONFIG(B_MEGA_EVO_TURN_ORDER, GEN_7); ASSUME(GetSpeciesAbility(SPECIES_SABLEYE_MEGA, 0) != ABILITY_STALL && GetSpeciesAbility(SPECIES_SABLEYE_MEGA, 1) != ABILITY_STALL); PLAYER(SPECIES_SABLEYE) { Item(ITEM_SABLENITE); Ability(ABILITY_STALL); Speed(105); } diff --git a/test/battle/form_change/ultra_burst.c b/test/battle/form_change/ultra_burst.c index 1db0bf7fd8..899e2a8a47 100644 --- a/test/battle/form_change/ultra_burst.c +++ b/test/battle/form_change/ultra_burst.c @@ -58,7 +58,7 @@ DOUBLE_BATTLE_TEST("Ultra Burst's order is determined by Speed - player faster") SINGLE_BATTLE_TEST("Ultra Burst affects turn order") { GIVEN { - WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); + WITH_CONFIG(B_MEGA_EVO_TURN_ORDER, GEN_7); PLAYER(SPECIES_NECROZMA_DUSK_MANE) { Item(ITEM_ULTRANECROZIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index e47cd2ca86..787682417f 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -423,7 +423,7 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon that changes forms does not gain { u16 capturedHP, finalHP; GIVEN { - WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(B_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND) { Ability(ABILITY_BATTLE_BOND); HP(100); Speed(100); } OPPONENT(SPECIES_CATERPIE) { HP(1); Speed(1000); } OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } @@ -940,7 +940,7 @@ SINGLE_BATTLE_TEST("Dynamax: G-Max Stonesurge sets up Stealth Rocks") SINGLE_BATTLE_TEST("Dynamax: G-Max Steelsurge sets up sharp steel") { GIVEN { - WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_6); + WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, GEN_6); ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STEELSURGE, MOVE_EFFECT_STEELSURGE)); PLAYER(SPECIES_COPPERAJAH) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); @@ -1434,7 +1434,7 @@ DOUBLE_BATTLE_TEST("Dynamax: G-Max Chi Strike boosts allies' crit chance by 1 st { u32 j; GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, GEN_6); + WITH_CONFIG(B_CRIT_CHANCE, GEN_6); ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CHI_STRIKE, MOVE_EFFECT_CRIT_PLUS_SIDE)); PLAYER(SPECIES_MACHAMP) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_MACHOP); @@ -1597,7 +1597,7 @@ SINGLE_BATTLE_TEST("Dynamax: Max Moves don't bypass absorbing abilities") ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); ASSUME(GetMoveType(MOVE_MUD_BOMB) == TYPE_GROUND); ASSUME(GetMoveType(MOVE_VINE_WHIP) == TYPE_GRASS); - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index 74f4ea3675..99ea302098 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -6,7 +6,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves do not retain priority") { GIVEN { - WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); // TODO: Decouple this config from other gimmicks + WITH_CONFIG(B_MEGA_EVO_TURN_ORDER, GEN_7); // TODO: Decouple this config from other gimmicks ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } @@ -124,7 +124,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_BOOST_CRITS raises a battler's critical hi PARAMETRIZE { genConfig = j; chance = 2; } // 50% PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(GetMoveType(MOVE_FORESIGHT) == TYPE_NORMAL); ASSUME(GetMoveZEffect(MOVE_FORESIGHT) == Z_EFFECT_BOOST_CRITS); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } @@ -533,7 +533,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) 10,000,000 Volt Thunderbolt has an increased critic PARAMETRIZE { genConfig = j; chance = 2; } PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_10_000_000_VOLT_THUNDERBOLT) == 2); ASSUME(GetSpeciesBaseSpeed(SPECIES_PIKACHU_PARTNER) == 90); PLAYER(SPECIES_PIKACHU_PARTNER) { Item(ITEM_PIKASHUNIUM_Z); } diff --git a/test/battle/hold_effect/booster_energy.c b/test/battle/hold_effect/booster_energy.c index 9916fe5792..24208c38a7 100644 --- a/test/battle/hold_effect/booster_energy.c +++ b/test/battle/hold_effect/booster_energy.c @@ -38,7 +38,7 @@ SINGLE_BATTLE_TEST("Booster Energy will activate Quark Drive after Electric Terr SINGLE_BATTLE_TEST("Booster Energy will activate Protosynthesis after harsh sunlight ends") { GIVEN { - WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(B_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_RAGING_BOLT) { Attack(100); Defense(100); Speed(100); SpAttack(110); SpDefense(100); Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } OPPONENT(SPECIES_TORKOAL) { Speed(100); Ability(ABILITY_DROUGHT); } } WHEN { diff --git a/test/battle/hold_effect/critical_up.c b/test/battle/hold_effect/critical_up.c index 163d8f1c27..92dfb4fe80 100644 --- a/test/battle/hold_effect/critical_up.c +++ b/test/battle/hold_effect/critical_up.c @@ -57,7 +57,7 @@ SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by 2 sta PARAMETRIZE { genConfig = j; chance = 2; } // 50% PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SCRATCH) == 0); PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_LANSAT_BERRY); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/hold_effect/iron_ball.c b/test/battle/hold_effect/iron_ball.c index 48c87dbccb..d661df8f78 100644 --- a/test/battle/hold_effect/iron_ball.c +++ b/test/battle/hold_effect/iron_ball.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Ground-type moves do neutral damage to non-grounded Flying t PARAMETRIZE { config = GEN_4; } PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_IRON_BALL, config); + WITH_CONFIG(B_IRON_BALL, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SKARMORY) { Item(ITEM_IRON_BALL); } } WHEN { diff --git a/test/battle/hold_effect/leek.c b/test/battle/hold_effect/leek.c index 025686485c..d29a0753c7 100644 --- a/test/battle/hold_effect/leek.c +++ b/test/battle/hold_effect/leek.c @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Leek increases critical hit ratio by 2 stages for the Farfet } PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(GetSpeciesBaseSpeed(SPECIES_FARFETCHD) == 60); ASSUME(GetSpeciesBaseSpeed(SPECIES_FARFETCHD_GALAR) == 55); ASSUME(GetSpeciesBaseSpeed(SPECIES_SIRFETCHD) == 65); diff --git a/test/battle/hold_effect/life_orb.c b/test/battle/hold_effect/life_orb.c index 39891ca53b..435765767b 100644 --- a/test/battle/hold_effect/life_orb.c +++ b/test/battle/hold_effect/life_orb.c @@ -110,7 +110,7 @@ SINGLE_BATTLE_TEST("Life Orb does not activate if on a confusion hit") SINGLE_BATTLE_TEST("Life Orb does not activate if move was absorbed by target") { GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } } WHEN { diff --git a/test/battle/hold_effect/light_ball.c b/test/battle/hold_effect/light_ball.c index c35dd75343..4d5e897aa5 100644 --- a/test/battle/hold_effect/light_ball.c +++ b/test/battle/hold_effect/light_ball.c @@ -71,7 +71,7 @@ SINGLE_BATTLE_TEST("Light Ball doubles Pikachu's Attack (Gen4+)", s16 damage) } GIVEN { - WITH_CONFIG(CONFIG_LIGHT_BALL_ATTACK_BOOST, config); + WITH_CONFIG(B_LIGHT_BALL_ATTACK_BOOST, config); ASSUME(GetMoveCategory(MOVE_SPARK) == DAMAGE_CATEGORY_PHYSICAL); if (species == SPECIES_PIKACHU_GMAX) { PLAYER(SPECIES_PIKACHU) { Item(item); GigantamaxFactor(TRUE); } diff --git a/test/battle/hold_effect/lucky_punch.c b/test/battle/hold_effect/lucky_punch.c index bbc379d977..817f5d397e 100644 --- a/test/battle/hold_effect/lucky_punch.c +++ b/test/battle/hold_effect/lucky_punch.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Lucky Punch increases critical hit ratio by 2 stages for Cha PARAMETRIZE { genConfig = j; passes = 1; trials = 2; } // 50% PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(gItemsInfo[ITEM_LUCKY_PUNCH].holdEffect == HOLD_EFFECT_LUCKY_PUNCH); ASSUME(GetSpeciesBaseSpeed(SPECIES_CHANSEY) == 50); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/hold_effect/safety_goggles.c b/test/battle/hold_effect/safety_goggles.c index a5cfca0769..cbbee6f958 100644 --- a/test/battle/hold_effect/safety_goggles.c +++ b/test/battle/hold_effect/safety_goggles.c @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Safety Goggles blocks Effect Spore's effect") KNOWN_FAILING; PASSES_RANDOMLY(100, 100, RNG_EFFECT_SPORE); GIVEN { - WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_5); // Setting it to Gen 6 causes it to pass + WITH_CONFIG(B_POWDER_GRASS, GEN_5); // Setting it to Gen 6 causes it to pass ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); } OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } diff --git a/test/battle/hold_effect/scope_lens.c b/test/battle/hold_effect/scope_lens.c index f74a06a1c5..5135c251c1 100644 --- a/test/battle/hold_effect/scope_lens.c +++ b/test/battle/hold_effect/scope_lens.c @@ -9,7 +9,7 @@ SINGLE_BATTLE_TEST("Scope Lens increases the critical hit ratio by 1 stage") PARAMETRIZE { genConfig = j; passes = 1; trials = 8; } // 12.5% PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS); ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SCOPE_LENS); } diff --git a/test/battle/item_effect/dire_hit.c b/test/battle/item_effect/dire_hit.c index 27f62e7d07..1f66684d5f 100644 --- a/test/battle/item_effect/dire_hit.c +++ b/test/battle/item_effect/dire_hit.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Dire Hit increases a battler's critical hit chance by 2 stag PARAMETRIZE { genConfig = j; chance = 2; } // 50% PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(gItemsInfo[ITEM_DIRE_HIT].battleUsage == EFFECT_ITEM_SET_FOCUS_ENERGY); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move.c b/test/battle/move.c index f77e61aaf8..87ffab3742 100644 --- a/test/battle/move.c +++ b/test/battle/move.c @@ -142,7 +142,7 @@ SINGLE_BATTLE_TEST("Critical hits deal 100% (Gen 1-5) or 50% (Gen 6+) more damag PARAMETRIZE { criticalHit = TRUE; genConfig = GEN_5; } PARAMETRIZE { criticalHit = TRUE; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_CRIT_MULTIPLIER, genConfig); + WITH_CONFIG(B_CRIT_MULTIPLIER, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/after_you.c b/test/battle/move_effect/after_you.c index 91742f4595..3fc28bd21a 100644 --- a/test/battle/move_effect/after_you.c +++ b/test/battle/move_effect/after_you.c @@ -89,7 +89,7 @@ DOUBLE_BATTLE_TEST("After You calculates correct turn order if only one Pokémon DOUBLE_BATTLE_TEST("After You fails if the turn order remains the same after After You (Gen5-7)") { GIVEN { - WITH_CONFIG(CONFIG_AFTER_YOU_TURN_ORDER, GEN_7); + WITH_CONFIG(B_AFTER_YOU_TURN_ORDER, GEN_7); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WYNAUT) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } @@ -114,7 +114,7 @@ DOUBLE_BATTLE_TEST("After You fails if the turn order remains the same after Aft DOUBLE_BATTLE_TEST("After You doesn't fail if the turn order remains the same after After You (Gen8+)") { GIVEN { - WITH_CONFIG(CONFIG_AFTER_YOU_TURN_ORDER, GEN_8); + WITH_CONFIG(B_AFTER_YOU_TURN_ORDER, GEN_8); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WYNAUT) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } diff --git a/test/battle/move_effect/ally_switch.c b/test/battle/move_effect/ally_switch.c index af4e1810fc..a82816ef24 100644 --- a/test/battle/move_effect/ally_switch.c +++ b/test/battle/move_effect/ally_switch.c @@ -188,7 +188,7 @@ DOUBLE_BATTLE_TEST("Ally Switch doesn't make self-targeting status moves fail") DOUBLE_BATTLE_TEST("Ally Switch doesn't increase the Protect-like moves counter (Gen5-8)") { GIVEN { - WITH_CONFIG(CONFIG_ALLY_SWITCH_FAIL_CHANCE, GEN_8); + WITH_CONFIG(B_ALLY_SWITCH_FAIL_CHANCE, GEN_8); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -203,7 +203,7 @@ DOUBLE_BATTLE_TEST("Ally Switch doesn't increase the Protect-like moves counter DOUBLE_BATTLE_TEST("Ally Switch increases the Protect-like moves counter (Gen9+)") { GIVEN { - WITH_CONFIG(CONFIG_ALLY_SWITCH_FAIL_CHANCE, GEN_9); + WITH_CONFIG(B_ALLY_SWITCH_FAIL_CHANCE, GEN_9); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/beat_up.c b/test/battle/move_effect/beat_up.c index 719772c38c..9810f88543 100644 --- a/test/battle/move_effect/beat_up.c +++ b/test/battle/move_effect/beat_up.c @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Beat Up hits the target for each non-fainted, non-statused m PARAMETRIZE { gen = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, gen); + WITH_CONFIG(B_BEAT_UP, gen); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_PICHU) @@ -66,7 +66,7 @@ SINGLE_BATTLE_TEST("Beat Up doesn't consider Comatose as a status") SINGLE_BATTLE_TEST("Beat Up doesn't list party member's name (Gen5+)") { GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + WITH_CONFIG(B_BEAT_UP, GEN_5); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -89,7 +89,7 @@ SINGLE_BATTLE_TEST("Beat Up's damage is Dark-typed (Gen5+)", s16 damage) ASSUME(GetMoveType(MOVE_BEAT_UP) == TYPE_DARK); GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + WITH_CONFIG(B_BEAT_UP, GEN_5); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(targetIsFairy ? SPECIES_SYLVEON : SPECIES_WOBBUFFET); @@ -109,7 +109,7 @@ SINGLE_BATTLE_TEST("Beat Up's base power is determined by each striking Pokémon s16 firstHit, secondHit; GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + WITH_CONFIG(B_BEAT_UP, GEN_5); PLAYER(SPECIES_SHUCKLE); PLAYER(SPECIES_DEOXYS_ATTACK); PLAYER(SPECIES_WYNAUT) { HP(0); } @@ -135,7 +135,7 @@ SINGLE_BATTLE_TEST("Beat Up's damage considers stat stage changes (Gen5+)", s16 PARAMETRIZE { boosted = TRUE; } GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + WITH_CONFIG(B_BEAT_UP, GEN_5); PLAYER(SPECIES_UMBREON); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -163,7 +163,7 @@ SINGLE_BATTLE_TEST("Beat Up's damage considers Huge Power and Choice Band (Gen5+ PARAMETRIZE { ability = ABILITY_THICK_FAT; item = ITEM_CHOICE_BAND; } GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + WITH_CONFIG(B_BEAT_UP, GEN_5); PLAYER(SPECIES_AZUMARILL) { Ability(ability); Item(item); Moves(MOVE_BEAT_UP); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -183,7 +183,7 @@ SINGLE_BATTLE_TEST("Beat Up's damage considers Huge Power and Choice Band (Gen5+ SINGLE_BATTLE_TEST("Beat Up lists each party member's name") { GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + WITH_CONFIG(B_BEAT_UP, GEN_3); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WYNAUT) { HP(0); } @@ -225,7 +225,7 @@ SINGLE_BATTLE_TEST("Beat Up's damage is typeless", s16 damage) PARAMETRIZE { defender = SPECIES_SYLVEON; } // Fairy GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + WITH_CONFIG(B_BEAT_UP, GEN_3); type1 = GetSpeciesType(defender, 0); type2 = GetSpeciesType(defender, 1); ASSUME(type2 == type1 || type2 == TYPE_MYSTERY); // Ensure monotype targets @@ -250,7 +250,7 @@ SINGLE_BATTLE_TEST("Beat Up's damage doesn't consider STAB") { s16 damage; GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + WITH_CONFIG(B_BEAT_UP, GEN_3); damage = 0; PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT) { HP(0); } @@ -271,7 +271,7 @@ SINGLE_BATTLE_TEST("Beat Up's base power is the same for each strike") { s16 firstHit, secondHit; GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + WITH_CONFIG(B_BEAT_UP, GEN_3); firstHit = 0; secondHit = 0; PLAYER(SPECIES_WYNAUT); @@ -296,7 +296,7 @@ SINGLE_BATTLE_TEST("Beat Up's damage is determined by each striking Pokémon's b { s16 shuckleHit, deoxysHit; GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + WITH_CONFIG(B_BEAT_UP, GEN_3); shuckleHit = 0; deoxysHit = 0; PLAYER(SPECIES_SHUCKLE); @@ -330,7 +330,7 @@ SINGLE_BATTLE_TEST("Beat Up ignores stat stage changes", s16 damage) PARAMETRIZE { boosted = TRUE; } GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + WITH_CONFIG(B_BEAT_UP, GEN_3); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -356,7 +356,7 @@ SINGLE_BATTLE_TEST("Beat Up ignores Huge Power", s16 damage) PARAMETRIZE { ability = ABILITY_HUGE_POWER; } GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + WITH_CONFIG(B_BEAT_UP, GEN_3); PLAYER(SPECIES_AZUMARILL) { Ability(ability); Moves(MOVE_BEAT_UP); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -379,7 +379,7 @@ SINGLE_BATTLE_TEST("Beat Up ignores Choice Band", s16 damage) PARAMETRIZE { item = ITEM_CHOICE_BAND; } GIVEN { - WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + WITH_CONFIG(B_BEAT_UP, GEN_3); PLAYER(SPECIES_URSARING) { Item(item); Moves(MOVE_BEAT_UP); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/conversion_2.c b/test/battle/move_effect/conversion_2.c index 169243019b..e52dd17445 100644 --- a/test/battle/move_effect/conversion_2.c +++ b/test/battle/move_effect/conversion_2.c @@ -6,7 +6,7 @@ TO_DO_BATTLE_TEST("Conversion 2's type change considers Inverse Battles"); SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last move that hit the user (Gen 1-4)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_4); + WITH_CONFIG(B_UPDATED_CONVERSION_2, GEN_4); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type SINGLE_BATTLE_TEST("Conversion 2's type change considers Struggle to be Normal type (Gen 1-4)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_4); + WITH_CONFIG(B_UPDATED_CONVERSION_2, GEN_4); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -46,7 +46,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers Struggle to be Normal t SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last used target's move (Gen 5+)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); + WITH_CONFIG(B_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -65,7 +65,7 @@ SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type SINGLE_BATTLE_TEST("Conversion 2's type change considers status moves (Gen 5+)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); + WITH_CONFIG(B_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -85,7 +85,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers status moves (Gen 5+)") SINGLE_BATTLE_TEST("Conversion 2's type change considers the type of moves called by other moves") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); + WITH_CONFIG(B_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -105,7 +105,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers the type of moves calle SINGLE_BATTLE_TEST("Conversion 2's type change considers dynamic type moves") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); + WITH_CONFIG(B_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -127,7 +127,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers dynamic type moves") SINGLE_BATTLE_TEST("Conversion 2's type change considers move types changed by Normalize and Electrify") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); + WITH_CONFIG(B_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_NORMALIZE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -158,7 +158,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers move types changed by N SINGLE_BATTLE_TEST("Conversion 2's type change fails targeting Struggle (Gen 5+)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); + WITH_CONFIG(B_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -176,7 +176,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change fails targeting Struggle (Gen 5+) SINGLE_BATTLE_TEST("Conversion 2 fails if the move used is of typeless damage (Gen 5+)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); + WITH_CONFIG(B_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ENTEI); } WHEN { @@ -228,7 +228,7 @@ SINGLE_BATTLE_TEST("Conversion 2 fails if used by a Terastallized Pokemon") SINGLE_BATTLE_TEST("Conversion 2 fails if last hit by a Stellar-type move (Gen 1-4)") { GIVEN { - WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_4); + WITH_CONFIG(B_UPDATED_CONVERSION_2, GEN_4); PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/copycat.c b/test/battle/move_effect/copycat.c index d834564b13..cd063be4c0 100644 --- a/test/battle/move_effect/copycat.c +++ b/test/battle/move_effect/copycat.c @@ -45,7 +45,7 @@ SINGLE_BATTLE_TEST("Copycat deducts power points from itself, not the copied mov DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their base moves copied by Copycat") { GIVEN { - WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); // TODO: Decouple this config from other gimmicks + WITH_CONFIG(B_MEGA_EVO_TURN_ORDER, GEN_7); // TODO: Decouple this config from other gimmicks PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/court_change.c b/test/battle/move_effect/court_change.c index 7b2946f40a..e3136cbcd6 100644 --- a/test/battle/move_effect/court_change.c +++ b/test/battle/move_effect/court_change.c @@ -81,7 +81,7 @@ DOUBLE_BATTLE_TEST("Court Change swaps entry hazards used by the player") DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Aurora Veil, Reflect, Light Screen, Tailwind") { GIVEN { - WITH_CONFIG(CONFIG_TAILWIND_TURNS, GEN_5); + WITH_CONFIG(B_TAILWIND_TURNS, GEN_5); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WYNAUT); @@ -120,7 +120,7 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Auror DOUBLE_BATTLE_TEST("Court Change used by the opponent swaps Mist, Safeguard, Aurora Veil, Reflect, Light Screen, Tailwind") { GIVEN { - WITH_CONFIG(CONFIG_TAILWIND_TURNS, GEN_5); + WITH_CONFIG(B_TAILWIND_TURNS, GEN_5); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/defog.c b/test/battle/move_effect/defog.c index 4ff5eb8b0e..68b1f017e9 100644 --- a/test/battle/move_effect/defog.c +++ b/test/battle/move_effect/defog.c @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Defog fails if target has minimum evasion stat change") SINGLE_BATTLE_TEST("Defog lowers evasiveness of target behind Substitute (Gen4)") { GIVEN { - WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_4); + WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, GEN_4); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } } WHEN { @@ -78,7 +78,7 @@ SINGLE_BATTLE_TEST("Defog lowers evasiveness of target behind Substitute (Gen4)" SINGLE_BATTLE_TEST("Defog fails if target has minimum evasion stat change behind Substitute (Gen4)") { GIVEN { - WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_4); + WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, GEN_4); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Ability(ABILITY_SIMPLE); } } WHEN { @@ -105,7 +105,7 @@ SINGLE_BATTLE_TEST("Defog does not lower evasiveness if target behind Substitute PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { - WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_5); + WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, GEN_5); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } } WHEN { @@ -333,7 +333,7 @@ DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from user's side ( PARAMETRIZE { move = MOVE_DEFOG; config = GEN_5; } PARAMETRIZE { move = MOVE_DEFOG; config = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); + WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WOBBUFFET) { Speed(3); } PLAYER(SPECIES_WOBBUFFET) { Speed(3); } @@ -417,7 +417,7 @@ SINGLE_BATTLE_TEST("Defog removes Spikes from user's side (Gen 6+)") PARAMETRIZE { move = MOVE_DEFOG; config = GEN_5; } PARAMETRIZE { move = MOVE_DEFOG; config = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); + WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(2); } PLAYER(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } @@ -457,7 +457,7 @@ SINGLE_BATTLE_TEST("Defog removes terrain (Gen 8+)") PARAMETRIZE { move = MOVE_MISTY_TERRAIN; config = GEN_8; } PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; config = GEN_8; } GIVEN { - WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); + WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } } WHEN { @@ -534,7 +534,7 @@ SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from user's side (Gen 6+)") PARAMETRIZE { move = MOVE_DEFOG; config = GEN_5; } PARAMETRIZE { move = MOVE_DEFOG; config = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); + WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(5); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } @@ -650,7 +650,7 @@ DOUBLE_BATTLE_TEST("Defog removes everything it can") PARAMETRIZE { config = GEN_5; } PARAMETRIZE { config = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); + WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, config); ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_GLALIE) { Speed(4); } @@ -728,7 +728,7 @@ SINGLE_BATTLE_TEST("Defog is used on the correct side if opposing mon is behind PARAMETRIZE { config = GEN_4; } PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); + WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/destiny_bond.c b/test/battle/move_effect/destiny_bond.c index 3be2384003..76b1a49f92 100644 --- a/test/battle/move_effect/destiny_bond.c +++ b/test/battle/move_effect/destiny_bond.c @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Destiny Bond faints the opposing mon if it fainted from the SINGLE_BATTLE_TEST("Destiny Bond doesn't fail if used sequentially (Gen2-6)") { GIVEN { - WITH_CONFIG(CONFIG_DESTINY_BOND_FAIL, GEN_6); + WITH_CONFIG(B_DESTINY_BOND_FAIL, GEN_6); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -48,7 +48,7 @@ SINGLE_BATTLE_TEST("Destiny Bond doesn't fail if used sequentially (Gen2-6)") SINGLE_BATTLE_TEST("Destiny Bond fails if used sequentially (Gen7+)") { GIVEN { - WITH_CONFIG(CONFIG_DESTINY_BOND_FAIL, GEN_7); + WITH_CONFIG(B_DESTINY_BOND_FAIL, GEN_7); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -66,7 +66,7 @@ SINGLE_BATTLE_TEST("Destiny Bond fails if used sequentially (Gen7+)") SINGLE_BATTLE_TEST("Destiny Bond does not fail if used repeatedly separated by other moves (Gen7+)") { GIVEN { - WITH_CONFIG(CONFIG_DESTINY_BOND_FAIL, GEN_7); + WITH_CONFIG(B_DESTINY_BOND_FAIL, GEN_7); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -85,7 +85,7 @@ SINGLE_BATTLE_TEST("Destiny Bond does not fail if used repeatedly separated by o SINGLE_BATTLE_TEST("Destiny Bond does not fail if used after failing (Gen7+)") { GIVEN { - WITH_CONFIG(CONFIG_DESTINY_BOND_FAIL, GEN_7); + WITH_CONFIG(B_DESTINY_BOND_FAIL, GEN_7); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); diff --git a/test/battle/move_effect/dragon_cheer.c b/test/battle/move_effect/dragon_cheer.c index e7b24f3495..c40b1734e8 100644 --- a/test/battle/move_effect/dragon_cheer.c +++ b/test/battle/move_effect/dragon_cheer.c @@ -28,7 +28,7 @@ DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 1 on non-Dragon } PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SCRATCH) == 0); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -62,7 +62,7 @@ DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 2 on Dragon typ } PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SCRATCH) == 0); ASSUME(GetSpeciesBaseSpeed(SPECIES_DRATINI) == 50); PLAYER(SPECIES_WOBBUFFET); @@ -126,6 +126,3 @@ AI_DOUBLE_BATTLE_TEST("AI uses Dragon Cheer") TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_DRAGON_CHEER); } } } - - - diff --git a/test/battle/move_effect/encore.c b/test/battle/move_effect/encore.c index e98f00df3e..64cf73f224 100644 --- a/test/battle/move_effect/encore.c +++ b/test/battle/move_effect/encore.c @@ -14,7 +14,7 @@ SINGLE_BATTLE_TEST("Encore forces consecutive move uses for 3 turns: Encore used PARAMETRIZE { encoreUser = opponent; encoreTarget = player; speedPlayer = 10; speedOpponent = 20; } PARAMETRIZE { encoreUser = player; encoreTarget = opponent; speedPlayer = 20; speedOpponent = 10; } GIVEN { - WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); + WITH_CONFIG(B_ENCORE_TARGET, GEN_3); PLAYER(SPECIES_WOBBUFFET) { Speed(speedPlayer); } OPPONENT(SPECIES_WOBBUFFET) { Speed(speedOpponent); } } WHEN { @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Encore forces consecutive move uses for 3 turns for player: PARAMETRIZE { encoreUser = opponent; encoreTarget = player; speedPlayer = 20; speedOpponent = 10; } PARAMETRIZE { encoreUser = player; encoreTarget = opponent; speedPlayer = 10; speedOpponent = 20; } GIVEN { - WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); + WITH_CONFIG(B_ENCORE_TARGET, GEN_3); PLAYER(SPECIES_WOBBUFFET) { Speed(speedPlayer); } OPPONENT(SPECIES_WOBBUFFET) { Speed(speedOpponent); } } WHEN { diff --git a/test/battle/move_effect/fail_if_not_arg_type.c b/test/battle/move_effect/fail_if_not_arg_type.c index 9714c15752..0fa013a98b 100644 --- a/test/battle/move_effect/fail_if_not_arg_type.c +++ b/test/battle/move_effect/fail_if_not_arg_type.c @@ -43,7 +43,7 @@ TO_DO_BATTLE_TEST("Burn Up doesn't thaw the user if it fails due to the user not SINGLE_BATTLE_TEST("Burn Up fails if the user has Protean/Libero and is not a Fire-type") { GIVEN { - WITH_CONFIG(CONFIG_PROTEAN_LIBERO, GEN_6); + WITH_CONFIG(B_PROTEAN_LIBERO, GEN_6); PLAYER(SPECIES_REGIROCK); OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/fell_stinger.c b/test/battle/move_effect/fell_stinger.c index 8d395080fe..42a609d731 100644 --- a/test/battle/move_effect/fell_stinger.c +++ b/test/battle/move_effect/fell_stinger.c @@ -9,7 +9,7 @@ SINGLE_BATTLE_TEST("Fell Stinger raises user's Attack by 2 stages (Gen6) or 3 st PARAMETRIZE { config = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_FELL_STINGER_STAT_RAISE, config); + WITH_CONFIG(B_FELL_STINGER_STAT_RAISE, config); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_FELL_STINGER); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/fling.c b/test/battle/move_effect/fling.c index 440d43ccb6..e2ae81047b 100644 --- a/test/battle/move_effect/fling.c +++ b/test/battle/move_effect/fling.c @@ -66,7 +66,7 @@ SINGLE_BATTLE_TEST("Fling fails for Pokémon with Klutz ability (Gen5+)") PARAMETRIZE { ability = ABILITY_KLUTZ; config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_KLUTZ_FLING_INTERACTION, config); + WITH_CONFIG(B_KLUTZ_FLING_INTERACTION, config); PLAYER(SPECIES_BUNEARY) { Item(ITEM_RAZOR_CLAW); Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/focus_energy.c b/test/battle/move_effect/focus_energy.c index ffc9370572..11fcb848d9 100644 --- a/test/battle/move_effect/focus_energy.c +++ b/test/battle/move_effect/focus_energy.c @@ -23,8 +23,8 @@ SINGLE_BATTLE_TEST("Focus Energy increases the user's critical hit ratio by 1 st } PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, (genConfig == GEN_1)? GEN_2 : genConfig); - WITH_CONFIG(CONFIG_FOCUS_ENERGY_CRIT_RATIO, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, (genConfig == GEN_1)? GEN_2 : genConfig); + WITH_CONFIG(B_FOCUS_ENERGY_CRIT_RATIO, genConfig); ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -50,8 +50,8 @@ SINGLE_BATTLE_TEST("Focus Energy multiplies crit chance by 4 with gen 1 crit cha } PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, GEN_1); - WITH_CONFIG(CONFIG_FOCUS_ENERGY_CRIT_RATIO, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, GEN_1); + WITH_CONFIG(B_FOCUS_ENERGY_CRIT_RATIO, genConfig); ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/foresight.c b/test/battle/move_effect/foresight.c index 9879774bab..ecfd64ab44 100644 --- a/test/battle/move_effect/foresight.c +++ b/test/battle/move_effect/foresight.c @@ -82,7 +82,7 @@ SINGLE_BATTLE_TEST("Foresight fails if the target is already under its effect (G PARAMETRIZE { genConfig = GEN_2; } PARAMETRIZE { genConfig = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_FORESIGHT_FAIL, genConfig); + WITH_CONFIG(B_FORESIGHT_FAIL, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -101,7 +101,7 @@ SINGLE_BATTLE_TEST("Foresight doesn't fail if the target is already under its ef PARAMETRIZE { genConfig = GEN_3; } PARAMETRIZE { genConfig = GEN_4; } GIVEN { - WITH_CONFIG(CONFIG_FORESIGHT_FAIL, genConfig); + WITH_CONFIG(B_FORESIGHT_FAIL, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/heal_bell.c b/test/battle/move_effect/heal_bell.c index 66a754df5c..e0dda9a34e 100644 --- a/test/battle/move_effect/heal_bell.c +++ b/test/battle/move_effect/heal_bell.c @@ -96,7 +96,7 @@ DOUBLE_BATTLE_TEST("Heal Bell does not cure Soundproof partners (Gen 4, Gen 6+)" GIVEN { ASSUME(IsSoundMove(MOVE_HEAL_BELL)); - WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(B_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); @@ -124,7 +124,7 @@ SINGLE_BATTLE_TEST("Heal Bell cures inactive Soundproof Pokemon (Gen5+)") GIVEN { ASSUME(IsSoundMove(MOVE_HEAL_BELL)); - WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(B_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); @@ -152,7 +152,7 @@ SINGLE_BATTLE_TEST("Heal Bell cures a Soundproof user (Gen5, Gen8+)") PARAMETRIZE { config = GEN_8; } GIVEN { ASSUME(IsSoundMove(MOVE_HEAL_BELL)); - WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(B_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_EXPLOUD) { Ability(ABILITY_SOUNDPROOF); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); } WHEN { @@ -178,7 +178,7 @@ DOUBLE_BATTLE_TEST("Aromatherapy cure Soundproof battlers regardless of config") GIVEN { ASSUME(!IsSoundMove(MOVE_AROMATHERAPY)); - WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(B_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_WOBBUFFET) { Ability(ability); Status1(STATUS1_POISON); } PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); @@ -203,7 +203,7 @@ SINGLE_BATTLE_TEST("Aromatherapy cures inactive Soundproof Pokemon regardless of GIVEN { ASSUME(!IsSoundMove(MOVE_AROMATHERAPY)); - WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(B_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_WOBBUFFET) { } PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/move_effect/healing_wish.c b/test/battle/move_effect/healing_wish.c index ca78fd049e..cc5cbeeb20 100644 --- a/test/battle/move_effect/healing_wish.c +++ b/test/battle/move_effect/healing_wish.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Healing Wish causes the user to faint and heals the replacement's HP and status (singles)") { GIVEN { - WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + WITH_CONFIG(B_HEALING_WISH_SWITCH, GEN_7); ASSUME(GetMovePP(MOVE_SCRATCH) == 35); ASSUME(GetMovePP(MOVE_WATER_GUN) == 25); ASSUME(GetMovePP(MOVE_LEAFAGE) == 40); @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Healing Wish causes the user to faint and heals the replacem DOUBLE_BATTLE_TEST("Healing Wish causes the user to faint and heals the replacement's HP and status (doubles)") { GIVEN { - WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + WITH_CONFIG(B_HEALING_WISH_SWITCH, GEN_7); ASSUME(GetMovePP(MOVE_SCRATCH) == 35); ASSUME(GetMovePP(MOVE_WATER_GUN) == 25); ASSUME(GetMovePP(MOVE_LEAFAGE) == 40); @@ -77,7 +77,7 @@ DOUBLE_BATTLE_TEST("Healing Wish causes the user to faint and heals the replacem SINGLE_BATTLE_TEST("Healing Wish effect activates even if the the switched Pokémon can't be healed (Gen4-7)") { GIVEN { - WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + WITH_CONFIG(B_HEALING_WISH_SWITCH, GEN_7); PLAYER(SPECIES_GARDEVOIR) { Speed(300); } PLAYER(SPECIES_NINJASK) { Speed(400); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } @@ -99,7 +99,7 @@ SINGLE_BATTLE_TEST("Healing Wish effect activates only if the switched Pokémon PARAMETRIZE { switchTo = 3; } PARAMETRIZE { switchTo = 4; } GIVEN { - WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_8); + WITH_CONFIG(B_HEALING_WISH_SWITCH, GEN_8); PLAYER(SPECIES_GARDEVOIR) { Speed(300); } PLAYER(SPECIES_NINJASK) { Speed(400); } PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); Speed(50); } diff --git a/test/battle/move_effect/instruct.c b/test/battle/move_effect/instruct.c index 2f97cda162..b0bd715ddd 100644 --- a/test/battle/move_effect/instruct.c +++ b/test/battle/move_effect/instruct.c @@ -260,7 +260,7 @@ DOUBLE_BATTLE_TEST("Instructed move will be redirected and absorbed by Lightning PARAMETRIZE { moveTarget = opponentLeft; } PARAMETRIZE { moveTarget = opponentRight; } GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_PIKACHU) { Ability(ABILITY_LIGHTNING_ROD); } @@ -317,7 +317,7 @@ DOUBLE_BATTLE_TEST("Instructed move will be redirected by Rage Powder after inst PARAMETRIZE { moveTarget = opponentLeft; } PARAMETRIZE { moveTarget = opponentRight; } GIVEN { - WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(B_POWDER_GRASS, GEN_6); ASSUME(GetMoveEffect(MOVE_RAGE_POWDER) == EFFECT_FOLLOW_ME); ASSUME(IsPowderMove(MOVE_RAGE_POWDER) == TRUE); ASSUME(GetMoveEffect(MOVE_SOAK) == EFFECT_SOAK); diff --git a/test/battle/move_effect/lunar_dance.c b/test/battle/move_effect/lunar_dance.c index 4714516b1f..dc4eda0c41 100644 --- a/test/battle/move_effect/lunar_dance.c +++ b/test/battle/move_effect/lunar_dance.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Lunar Dance causes the user to faint and heals the replacement's HP, PP and status (singles)") { GIVEN { - WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + WITH_CONFIG(B_HEALING_WISH_SWITCH, GEN_7); ASSUME(GetMovePP(MOVE_SCRATCH) == 35); ASSUME(GetMovePP(MOVE_WATER_GUN) == 25); ASSUME(GetMovePP(MOVE_LEAFAGE) == 40); @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Lunar Dance causes the user to faint and heals the replaceme DOUBLE_BATTLE_TEST("Lunar Dance causes the user to faint and heals the replacement's HP, PP and status (doubles)") { GIVEN { - WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + WITH_CONFIG(B_HEALING_WISH_SWITCH, GEN_7); ASSUME(GetMovePP(MOVE_SCRATCH) == 35); ASSUME(GetMovePP(MOVE_WATER_GUN) == 25); ASSUME(GetMovePP(MOVE_LEAFAGE) == 40); @@ -76,7 +76,7 @@ DOUBLE_BATTLE_TEST("Lunar Dance causes the user to faint and heals the replaceme SINGLE_BATTLE_TEST("Lunar Dance effect activates even if the the switched Pokémon can't be healed (Gen4-7)") { GIVEN { - WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + WITH_CONFIG(B_HEALING_WISH_SWITCH, GEN_7); PLAYER(SPECIES_GARDEVOIR) { Speed(300); } PLAYER(SPECIES_NINJASK) { Speed(400); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } @@ -99,7 +99,7 @@ SINGLE_BATTLE_TEST("Lunar Dance effect activates only if the switched Pokémon c PARAMETRIZE { switchTo = 4; } GIVEN { ASSUME(GetMovePP(MOVE_SCRATCH) == 35); - WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_8); + WITH_CONFIG(B_HEALING_WISH_SWITCH, GEN_8); PLAYER(SPECIES_GARDEVOIR) { Speed(300); } PLAYER(SPECIES_NINJASK) { Speed(400); } PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); Speed(50); } diff --git a/test/battle/move_effect/metronome.c b/test/battle/move_effect/metronome.c index 7415594a64..5f1b38b450 100644 --- a/test/battle/move_effect/metronome.c +++ b/test/battle/move_effect/metronome.c @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Metronome picks a random move") SINGLE_BATTLE_TEST("Metronome's called powder move fails against Grass Types") { GIVEN { - WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(B_POWDER_GRASS, GEN_6); ASSUME(IsPowderMove(MOVE_POISON_POWDER)); ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); diff --git a/test/battle/move_effect/minimize.c b/test/battle/move_effect/minimize.c index b6730fca9b..4de9726851 100644 --- a/test/battle/move_effect/minimize.c +++ b/test/battle/move_effect/minimize.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Minimize increases the user's Evasion by 2 stages (Gen5+) or PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_MINIMIZE_EVASION, config); + WITH_CONFIG(B_MINIMIZE_EVASION, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/miracle_eye.c b/test/battle/move_effect/miracle_eye.c index 4f819036a5..2a60d478e5 100644 --- a/test/battle/move_effect/miracle_eye.c +++ b/test/battle/move_effect/miracle_eye.c @@ -76,7 +76,7 @@ SINGLE_BATTLE_TEST("Miracle Eye causes moves against the target to ignore positi SINGLE_BATTLE_TEST("Miracle Eye fails if the target is already affected by Miracle Eye (Gen5+)") { GIVEN { - WITH_CONFIG(CONFIG_MIRACLE_EYE_FAIL, GEN_5); + WITH_CONFIG(B_MIRACLE_EYE_FAIL, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -92,7 +92,7 @@ SINGLE_BATTLE_TEST("Miracle Eye fails if the target is already affected by Mirac SINGLE_BATTLE_TEST("Miracle Eye does not fail if the target is already affected by Miracle Eye (Gen4)") { GIVEN { - WITH_CONFIG(CONFIG_MIRACLE_EYE_FAIL, GEN_4); + WITH_CONFIG(B_MIRACLE_EYE_FAIL, GEN_4); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/mirror_move.c b/test/battle/move_effect/mirror_move.c index c07dc6b84e..cfe28cb487 100644 --- a/test/battle/move_effect/mirror_move.c +++ b/test/battle/move_effect/mirror_move.c @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Mirror Move fails if no move was used before") SINGLE_BATTLE_TEST("Mirror Move's called powder move fails against Grass Types") { GIVEN { - WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(B_POWDER_GRASS, GEN_6); ASSUME(IsPowderMove(MOVE_STUN_SPORE)); ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_NON_VOLATILE_STATUS); diff --git a/test/battle/move_effect/moonlight.c b/test/battle/move_effect/moonlight.c index 428227b66c..f741188294 100644 --- a/test/battle/move_effect/moonlight.c +++ b/test/battle/move_effect/moonlight.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Moonlight recovers 1/2 of the user's max HP (Gen3+)") { GIVEN { - WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(B_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Moonlight recovers 1/2 of the user's max HP (Gen3+)") SINGLE_BATTLE_TEST("Moonlight recovers 2/3 of the user's max HP in Sunlight (Gen3+)") { GIVEN { - WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(B_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Moonlight recovers 1/4 of the user's max HP in Rain, Sandsto PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { - WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(B_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/morning_sun.c b/test/battle/move_effect/morning_sun.c index 10d69ae568..7505ddab25 100644 --- a/test/battle/move_effect/morning_sun.c +++ b/test/battle/move_effect/morning_sun.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Morning Sun recovers 1/2 of the user's max HP (Gen3+)") { GIVEN { - WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(B_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Morning Sun recovers 1/2 of the user's max HP (Gen3+)") SINGLE_BATTLE_TEST("Morning Sun recovers 2/3 of the user's max HP in Sunlight (Gen3+)") { GIVEN { - WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(B_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Morning Sun recovers 1/4 of the user's max HP in Rain, Sands PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { - WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(B_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/mud_sport.c b/test/battle/move_effect/mud_sport.c index 31e0ea18ff..4a44436f7f 100644 --- a/test/battle/move_effect/mud_sport.c +++ b/test/battle/move_effect/mud_sport.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Mud Sport reduces the damage of Electric Type moves by 50% ( PARAMETRIZE { config = GEN_4; } PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_SPORT_DMG_REDUCTION, config); + WITH_CONFIG(B_SPORT_DMG_REDUCTION, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c index 62f9556879..635f2f7482 100644 --- a/test/battle/move_effect/multi_hit.c +++ b/test/battle/move_effect/multi_hit.c @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit twice 37.5/35% of the time") PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(B_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit thrice 37.5/35% of the time") PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(B_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit four times 12.5/15% of the time") PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(B_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -96,7 +96,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit five times 12.5/15% of the time") PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(B_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/parting_shot.c b/test/battle/move_effect/parting_shot.c index 58c5ba5218..3e327605fa 100644 --- a/test/battle/move_effect/parting_shot.c +++ b/test/battle/move_effect/parting_shot.c @@ -162,7 +162,7 @@ SINGLE_BATTLE_TEST("Parting Shot: Mirror Armor switches even if reflected stats SINGLE_BATTLE_TEST("Parting Shot: Does not switch if both stats are at minimum (Gen7+)") { GIVEN { - WITH_CONFIG(CONFIG_PARTING_SHOT_SWITCH, GEN_7); + WITH_CONFIG(B_PARTING_SHOT_SWITCH, GEN_7); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_PARTING_SHOT, MOVE_TOPSY_TURVY, MOVE_CELEBRATE); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_OMASTAR) { Moves(MOVE_SHELL_SMASH, MOVE_CELEBRATE); } @@ -184,7 +184,7 @@ SINGLE_BATTLE_TEST("Parting Shot: Does not switch if both stats are at minimum ( SINGLE_BATTLE_TEST("Parting Shot: Does not switch if Contrary is at maximum stats (Gen7+)") { GIVEN { - WITH_CONFIG(CONFIG_PARTING_SHOT_SWITCH, GEN_7); + WITH_CONFIG(B_PARTING_SHOT_SWITCH, GEN_7); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_PARTING_SHOT, MOVE_TOPSY_TURVY, MOVE_CELEBRATE); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_INKAY) { Ability(ABILITY_CONTRARY); Moves(MOVE_SHELL_SMASH, MOVE_CELEBRATE); } @@ -213,7 +213,7 @@ SINGLE_BATTLE_TEST("Parting Shot: Stat drop prevention by abilities/items does n PARAMETRIZE { species = SPECIES_LUCARIO; ability = ABILITY_INNER_FOCUS; item = ITEM_CLEAR_AMULET; } GIVEN { - WITH_CONFIG(CONFIG_PARTING_SHOT_SWITCH, GEN_7); + WITH_CONFIG(B_PARTING_SHOT_SWITCH, GEN_7); ASSUME(gItemsInfo[ITEM_CLEAR_AMULET].holdEffect == HOLD_EFFECT_CLEAR_AMULET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_PARTING_SHOT); } PLAYER(SPECIES_WYNAUT); @@ -232,7 +232,7 @@ SINGLE_BATTLE_TEST("Parting Shot: Stat drop prevention by abilities/items does n SINGLE_BATTLE_TEST("Parting Shot: Mist prevents stat drops and does not switch (Gen7+)") { GIVEN { - WITH_CONFIG(CONFIG_PARTING_SHOT_SWITCH, GEN_7); + WITH_CONFIG(B_PARTING_SHOT_SWITCH, GEN_7); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_PARTING_SHOT, MOVE_CELEBRATE); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_MIST, MOVE_CELEBRATE); } @@ -252,7 +252,7 @@ DOUBLE_BATTLE_TEST("Parting Shot: Flower Veil prevents stat drops and does not s { GIVEN { ASSUME(GetSpeciesType(SPECIES_BULBASAUR, 0) == TYPE_GRASS); - WITH_CONFIG(CONFIG_PARTING_SHOT_SWITCH, GEN_7); + WITH_CONFIG(B_PARTING_SHOT_SWITCH, GEN_7); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_PARTING_SHOT); } PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WYNAUT); @@ -272,7 +272,7 @@ DOUBLE_BATTLE_TEST("Parting Shot: Flower Veil prevents stat drops and does not s SINGLE_BATTLE_TEST("Parting Shot: Switches if both stats are at minimum (Gen6)") { GIVEN { - WITH_CONFIG(CONFIG_PARTING_SHOT_SWITCH, GEN_6); + WITH_CONFIG(B_PARTING_SHOT_SWITCH, GEN_6); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_PARTING_SHOT, MOVE_TOPSY_TURVY, MOVE_CELEBRATE); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_OMASTAR) { Moves(MOVE_SHELL_SMASH, MOVE_CELEBRATE); } @@ -295,7 +295,7 @@ SINGLE_BATTLE_TEST("Parting Shot: Switches if both stats are at minimum (Gen6)") SINGLE_BATTLE_TEST("Parting Shot: Switches if Contrary is at maximum stats (Gen6)") { GIVEN { - WITH_CONFIG(CONFIG_PARTING_SHOT_SWITCH, GEN_6); + WITH_CONFIG(B_PARTING_SHOT_SWITCH, GEN_6); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_PARTING_SHOT, MOVE_TOPSY_TURVY, MOVE_CELEBRATE); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_INKAY) { Ability(ABILITY_CONTRARY); Moves(MOVE_SHELL_SMASH, MOVE_CELEBRATE); } @@ -325,7 +325,7 @@ SINGLE_BATTLE_TEST("Parting Shot: Stat drop prevention by abilities/items switch PARAMETRIZE { species = SPECIES_LUCARIO; ability = ABILITY_INNER_FOCUS; item = ITEM_CLEAR_AMULET; } GIVEN { - WITH_CONFIG(CONFIG_PARTING_SHOT_SWITCH, GEN_6); + WITH_CONFIG(B_PARTING_SHOT_SWITCH, GEN_6); ASSUME(gItemsInfo[ITEM_CLEAR_AMULET].holdEffect == HOLD_EFFECT_CLEAR_AMULET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_PARTING_SHOT); } PLAYER(SPECIES_WYNAUT); @@ -345,7 +345,7 @@ SINGLE_BATTLE_TEST("Parting Shot: Stat drop prevention by abilities/items switch SINGLE_BATTLE_TEST("Parting Shot: Mist prevents stat drops and switches (Gen6)") { GIVEN { - WITH_CONFIG(CONFIG_PARTING_SHOT_SWITCH, GEN_6); + WITH_CONFIG(B_PARTING_SHOT_SWITCH, GEN_6); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_PARTING_SHOT, MOVE_CELEBRATE); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_MIST, MOVE_CELEBRATE); } @@ -365,7 +365,7 @@ SINGLE_BATTLE_TEST("Parting Shot: Mist prevents stat drops and switches (Gen6)") DOUBLE_BATTLE_TEST("Parting Shot: Flower Veil prevents stat drops and switches (Gen6)") { GIVEN { - WITH_CONFIG(CONFIG_PARTING_SHOT_SWITCH, GEN_6); + WITH_CONFIG(B_PARTING_SHOT_SWITCH, GEN_6); ASSUME(GetSpeciesType(SPECIES_BULBASAUR, 0) == TYPE_GRASS); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_PARTING_SHOT); } PLAYER(SPECIES_WYNAUT); diff --git a/test/battle/move_effect/pledge.c b/test/battle/move_effect/pledge.c index 3c6b04b17a..7b5355aba1 100644 --- a/test/battle/move_effect/pledge.c +++ b/test/battle/move_effect/pledge.c @@ -910,7 +910,7 @@ DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Storm Drain") { GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_GASTRODON) { Ability(ABILITY_STORM_DRAIN); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/powder.c b/test/battle/move_effect/powder.c index 3f0a3135d9..2dd88357e9 100644 --- a/test/battle/move_effect/powder.c +++ b/test/battle/move_effect/powder.c @@ -83,7 +83,7 @@ SINGLE_BATTLE_TEST("Powder doesn't damage target if it has Magic Guard") SINGLE_BATTLE_TEST("Powder damages the target under heavy rain (Gen 6)") { GIVEN { - WITH_CONFIG(CONFIG_POWDER_RAIN, GEN_6); + WITH_CONFIG(B_POWDER_RAIN, GEN_6); PLAYER(SPECIES_KYOGRE_PRIMAL) { Ability(ABILITY_PRIMORDIAL_SEA); } OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -100,7 +100,7 @@ SINGLE_BATTLE_TEST("Powder damages the target under heavy rain (Gen 6)") SINGLE_BATTLE_TEST("Powder doesn't damage target under heavy rain (Gen 7+)") { GIVEN { - WITH_CONFIG(CONFIG_POWDER_RAIN, GEN_7); + WITH_CONFIG(B_POWDER_RAIN, GEN_7); PLAYER(SPECIES_KYOGRE_PRIMAL) { Ability(ABILITY_PRIMORDIAL_SEA); } OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -152,7 +152,7 @@ DOUBLE_BATTLE_TEST("Powder fails if target is already affected by Powder") SINGLE_BATTLE_TEST("Powder fails if the target is Grass type (Gen6+)") { GIVEN { - WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(B_POWDER_GRASS, GEN_6); ASSUME(GetSpeciesType(SPECIES_VENUSAUR, 0) == TYPE_GRASS || GetSpeciesType(SPECIES_VENUSAUR, 1) == TYPE_GRASS); PLAYER(SPECIES_VENUSAUR); OPPONENT(SPECIES_VIVILLON); @@ -168,7 +168,7 @@ SINGLE_BATTLE_TEST("Powder fails if the target is Grass type (Gen6+)") SINGLE_BATTLE_TEST("Powder fails if the target has Overcoat (Gen6+)") { GIVEN { - WITH_CONFIG(CONFIG_POWDER_OVERCOAT, GEN_6); + WITH_CONFIG(B_POWDER_OVERCOAT, GEN_6); PLAYER(SPECIES_FORRETRESS) { Ability(ABILITY_OVERCOAT); } OPPONENT(SPECIES_VIVILLON); } WHEN { diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index 930f6d829a..9dc86808ed 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -550,7 +550,7 @@ DOUBLE_BATTLE_TEST("Protect: Wide Guard can not fail on consecutive turns (Gen6+ PARAMETRIZE { config = GEN_6; passes = 2; } PASSES_RANDOMLY(passes, 2); GIVEN { - WITH_CONFIG(CONFIG_WIDE_GUARD, config); + WITH_CONFIG(B_WIDE_GUARD, config); ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -616,7 +616,7 @@ DOUBLE_BATTLE_TEST("Protect: Quick Guard can not fail on consecutive turns (Gen6 PARAMETRIZE { config = GEN_6; passes = 2; } PASSES_RANDOMLY(passes, 2); GIVEN { - WITH_CONFIG(CONFIG_QUICK_GUARD, config); + WITH_CONFIG(B_QUICK_GUARD, config); ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/psych_up.c b/test/battle/move_effect/psych_up.c index ca2ecd3f5a..220190fc8c 100644 --- a/test/battle/move_effect/psych_up.c +++ b/test/battle/move_effect/psych_up.c @@ -85,8 +85,8 @@ SINGLE_BATTLE_TEST("Psych Up does not copy the target's critical hit ratio (Gen5 { GIVEN { ASSUME(GetMoveEffect(MOVE_FOCUS_ENERGY) == EFFECT_FOCUS_ENERGY); - WITH_CONFIG(CONFIG_PSYCH_UP_CRIT_RATIO, GEN_5); - WITH_CONFIG(CONFIG_FOCUS_ENERGY_CRIT_RATIO, GEN_9); + WITH_CONFIG(B_PSYCH_UP_CRIT_RATIO, GEN_5); + WITH_CONFIG(B_FOCUS_ENERGY_CRIT_RATIO, GEN_9); PLAYER(SPECIES_TORNADUS) { Speed(66); } OPPONENT(SPECIES_LANDORUS) { Speed(99); } } WHEN { @@ -105,8 +105,8 @@ SINGLE_BATTLE_TEST("Psych Up copies the target's critical hit ratio (Gen6+)") { GIVEN { ASSUME(GetMoveEffect(MOVE_FOCUS_ENERGY) == EFFECT_FOCUS_ENERGY); - WITH_CONFIG(CONFIG_PSYCH_UP_CRIT_RATIO, GEN_6); - WITH_CONFIG(CONFIG_FOCUS_ENERGY_CRIT_RATIO, GEN_9); + WITH_CONFIG(B_PSYCH_UP_CRIT_RATIO, GEN_6); + WITH_CONFIG(B_FOCUS_ENERGY_CRIT_RATIO, GEN_9); PLAYER(SPECIES_TORNADUS) { Speed(66); } OPPONENT(SPECIES_LANDORUS) { Speed(99); } } WHEN { diff --git a/test/battle/move_effect/psychic_terrain.c b/test/battle/move_effect/psychic_terrain.c index c8fb061d9c..11015b0e7e 100644 --- a/test/battle/move_effect/psychic_terrain.c +++ b/test/battle/move_effect/psychic_terrain.c @@ -120,7 +120,7 @@ SINGLE_BATTLE_TEST("Psychic Terrain doesn't block priority moves against semi-in PARAMETRIZE { move = MOVE_SOLAR_BEAM; shouldWork = FALSE; } PARAMETRIZE { move = MOVE_FLY; shouldWork = TRUE; } GIVEN { - WITH_CONFIG(CONFIG_TOXIC_NEVER_MISS, GEN_6); + WITH_CONFIG(B_TOXIC_NEVER_MISS, GEN_6); ASSUME(IsSpeciesOfType(SPECIES_SHROODLE, TYPE_POISON)); PLAYER(SPECIES_SHROODLE) { Ability(ABILITY_PRANKSTER); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/pursuit.c b/test/battle/move_effect/pursuit.c index cc8c0a72b8..888f8eb0a6 100644 --- a/test/battle/move_effect/pursuit.c +++ b/test/battle/move_effect/pursuit.c @@ -51,7 +51,7 @@ DOUBLE_BATTLE_TEST("Pursuit doesn't attack a foe using Teleport / Baton Pass to PARAMETRIZE { move = MOVE_TELEPORT; } PARAMETRIZE { move = MOVE_BATON_PASS; } GIVEN { - WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(B_TELEPORT_BEHAVIOR, GEN_8); ASSUME(GetMoveEffect(MOVE_QUASH) == EFFECT_QUASH); ASSUME(GetMoveEffect(MOVE_TELEPORT) == EFFECT_TELEPORT); ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); diff --git a/test/battle/move_effect/quash.c b/test/battle/move_effect/quash.c index 0fc2fbd25d..9dc2f464db 100644 --- a/test/battle/move_effect/quash.c +++ b/test/battle/move_effect/quash.c @@ -26,7 +26,7 @@ DOUBLE_BATTLE_TEST("Quash-affected target will move last in the priority bracket DOUBLE_BATTLE_TEST("Quash is not affected by dynamic speed") { GIVEN { - WITH_CONFIG(CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8); + WITH_CONFIG(B_RECALC_TURN_AFTER_ACTIONS, GEN_8); ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); PLAYER(SPECIES_VOLBEAT) { Speed(10); Ability(ABILITY_PRANKSTER); } PLAYER(SPECIES_WOBBUFFET) { Speed(30); } @@ -112,7 +112,7 @@ DOUBLE_BATTLE_TEST("Quash-affected targets move from fastest to slowest (Gen 8+) DOUBLE_BATTLE_TEST("Quash-affected mon that acted early via After You is not affected by dynamic speed") { GIVEN { - WITH_CONFIG(CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8); + WITH_CONFIG(B_RECALC_TURN_AFTER_ACTIONS, GEN_8); ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); PLAYER(SPECIES_VOLBEAT) { Speed(20); Ability(ABILITY_PRANKSTER); } diff --git a/test/battle/move_effect/rage_fist.c b/test/battle/move_effect/rage_fist.c index 7a0b6bc322..c7c233e120 100644 --- a/test/battle/move_effect/rage_fist.c +++ b/test/battle/move_effect/rage_fist.c @@ -258,7 +258,7 @@ SINGLE_BATTLE_TEST("Rage Fist base power is increased if Disguise breaks (Gen7)" PARAMETRIZE { species = SPECIES_MIMIKYU_TOTEM_DISGUISED; } GIVEN { - WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_7); + WITH_CONFIG(B_DISGUISE_HP_LOSS, GEN_7); PLAYER(species) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_REGIROCK); } WHEN { @@ -285,7 +285,7 @@ SINGLE_BATTLE_TEST("Rage Fist base power is increased if Disguise breaks (Gen8+) PARAMETRIZE { species = SPECIES_MIMIKYU_TOTEM_DISGUISED; } GIVEN { - WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_8); + WITH_CONFIG(B_DISGUISE_HP_LOSS, GEN_8); PLAYER(species) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_REGIROCK); } WHEN { diff --git a/test/battle/move_effect/recoil_if_miss.c b/test/battle/move_effect/recoil_if_miss.c index 335120a5e5..939780d038 100644 --- a/test/battle/move_effect/recoil_if_miss.c +++ b/test/battle/move_effect/recoil_if_miss.c @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Recoil if miss: Jump Kick has 50% recoil on protect") SINGLE_BATTLE_TEST("Recoil if miss: Jump Kick has no recoil if no target") { GIVEN { - WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_5); + WITH_CONFIG(B_HEALING_WISH_SWITCH, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/move_effect/sheer_cold.c b/test/battle/move_effect/sheer_cold.c index c0b076f448..c6179d7831 100644 --- a/test/battle/move_effect/sheer_cold.c +++ b/test/battle/move_effect/sheer_cold.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon (Gen3-6)") { GIVEN { - WITH_CONFIG(CONFIG_SHEER_COLD_IMMUNITY, GEN_6); + WITH_CONFIG(B_SHEER_COLD_IMMUNITY, GEN_6); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_GLALIE); @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon (Gen3-6)") SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon (Gen7+)") { GIVEN { - WITH_CONFIG(CONFIG_SHEER_COLD_IMMUNITY, GEN_7); + WITH_CONFIG(B_SHEER_COLD_IMMUNITY, GEN_7); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_GLALIE); diff --git a/test/battle/move_effect/sleep_talk.c b/test/battle/move_effect/sleep_talk.c index 6980954714..94c9b1aa20 100644 --- a/test/battle/move_effect/sleep_talk.c +++ b/test/battle/move_effect/sleep_talk.c @@ -113,7 +113,7 @@ DOUBLE_BATTLE_TEST("Sleep Talk calls move and that move may be redirected by Lig { PASSES_RANDOMLY(1, 2, RNG_RANDOM_TARGET); GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveType(MOVE_SPARK) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_SPARK, MOVE_FLY, MOVE_DIG); } PLAYER(SPECIES_WOBBUFFET); @@ -133,7 +133,7 @@ DOUBLE_BATTLE_TEST("Sleep Talk calls move and that move may be redirected by Sto { PASSES_RANDOMLY(1, 2, RNG_RANDOM_TARGET); GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_WATER_GUN, MOVE_FLY, MOVE_DIG); } PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/steal_item.c b/test/battle/move_effect/steal_item.c index dffc1ecd6a..af2497f425 100644 --- a/test/battle/move_effect/steal_item.c +++ b/test/battle/move_effect/steal_item.c @@ -113,7 +113,7 @@ WILD_BATTLE_TEST("Thief and Covet steal target's held item and it's added to Bag PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } GIVEN { - WITH_CONFIG(CONFIG_STEAL_WILD_ITEMS, GEN_9); + WITH_CONFIG(B_STEAL_WILD_ITEMS, GEN_9); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); } } WHEN { diff --git a/test/battle/move_effect/synthesis.c b/test/battle/move_effect/synthesis.c index 5245ab9b38..c1b6f167fd 100644 --- a/test/battle/move_effect/synthesis.c +++ b/test/battle/move_effect/synthesis.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Synthesis recovers 1/2 of the user's max HP (Gen3+)") { GIVEN { - WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(B_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Synthesis recovers 1/2 of the user's max HP (Gen3+)") SINGLE_BATTLE_TEST("Synthesis recovers 2/3 of the user's max HP in Sunlight (Gen3+)") { GIVEN { - WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(B_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Synthesis recovers 1/4 of the user's max HP in Rain, Sandsto PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { - WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(B_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/tailwind.c b/test/battle/move_effect/tailwind.c index d22f36d285..1e566ab8d6 100644 --- a/test/battle/move_effect/tailwind.c +++ b/test/battle/move_effect/tailwind.c @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Tailwind applies for 3 turns (Gen4) or 4 turns (Gen5+)") PARAMETRIZE { config = GEN_4; } PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_TAILWIND_TURNS, config); + WITH_CONFIG(B_TAILWIND_TURNS, config); PLAYER(SPECIES_WOBBUFFET) { Speed(10); } OPPONENT(SPECIES_WOBBUFFET) { Speed(15); } } WHEN { @@ -44,7 +44,7 @@ SINGLE_BATTLE_TEST("Tailwind applies for 3 turns (Gen4) or 4 turns (Gen5+)") DOUBLE_BATTLE_TEST("Tailwind doesn't affect the partner on the same turn it's used (Gen4-7)") { GIVEN { - WITH_CONFIG(CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_7); + WITH_CONFIG(B_RECALC_TURN_AFTER_ACTIONS, GEN_7); PLAYER(SPECIES_WOBBUFFET) { Speed(20); } PLAYER(SPECIES_WYNAUT) { Speed(10); } OPPONENT(SPECIES_WOBBUFFET) { Speed(15); } @@ -62,7 +62,7 @@ DOUBLE_BATTLE_TEST("Tailwind doesn't affect the partner on the same turn it's us DOUBLE_BATTLE_TEST("Tailwind affects the partner on the same turn it's used (Gen8+)") { GIVEN { - WITH_CONFIG(CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8); + WITH_CONFIG(B_RECALC_TURN_AFTER_ACTIONS, GEN_8); PLAYER(SPECIES_WOBBUFFET) { Speed(20); } PLAYER(SPECIES_WYNAUT) { Speed(10); } OPPONENT(SPECIES_WOBBUFFET) { Speed(15); } diff --git a/test/battle/move_effect/teatime.c b/test/battle/move_effect/teatime.c index b5935d0cde..0148ac4338 100644 --- a/test/battle/move_effect/teatime.c +++ b/test/battle/move_effect/teatime.c @@ -205,7 +205,7 @@ SINGLE_BATTLE_TEST("Teatime triggers Lightning Rod if it has been affected by El PARAMETRIZE { move = MOVE_PLASMA_FISTS; item = ITEM_NONE; } GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_PIKACHU) { Ability(ABILITY_LIGHTNING_ROD); Item(item); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIECHI_BERRY); } } WHEN { diff --git a/test/battle/move_effect/teleport.c b/test/battle/move_effect/teleport.c index c3b5b53519..70454c5309 100644 --- a/test/battle/move_effect/teleport.c +++ b/test/battle/move_effect/teleport.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Teleport fails to switch out when there is no Pokémon to switch in (Gen 8+)") { GIVEN { - WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(B_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Teleport fails to switch out when there is no Pokémon to sw SINGLE_BATTLE_TEST("Teleport fails to switch out the user when there no alive Pokémon left (Gen 8+)") { GIVEN { - WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(B_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT) { HP(0); } @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Teleport fails to switch out the user when there no alive Po SINGLE_BATTLE_TEST("Teleport fails in Trainer Battles (Gen 1-7)") { GIVEN { - WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_7); + WITH_CONFIG(B_TELEPORT_BEHAVIOR, GEN_7); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Teleport fails in Trainer Battles (Gen 1-7)") SINGLE_BATTLE_TEST("Teleport forces the Pokémon to switch out in Trainer Battles (Gen 8+)") { GIVEN { - WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(B_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); @@ -70,7 +70,7 @@ SINGLE_BATTLE_TEST("Teleport forces the Pokémon to switch out in Trainer Battle SINGLE_BATTLE_TEST("Teleport does not fail if the user is trapped") { GIVEN { - WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(B_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/move_effect/toxic.c b/test/battle/move_effect/toxic.c index 55e09b24eb..d784c5de36 100644 --- a/test/battle/move_effect/toxic.c +++ b/test/battle/move_effect/toxic.c @@ -52,7 +52,7 @@ SINGLE_BATTLE_TEST("Toxic cannot miss if used by a Poison-type (Gen6+)") PARAMETRIZE { species = SPECIES_WOBBUFFET; hit = FALSE; gen = GEN_6; } PARAMETRIZE { species = SPECIES_NIDORAN_M; hit = TRUE; gen = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_TOXIC_NEVER_MISS, gen); + WITH_CONFIG(B_TOXIC_NEVER_MISS, gen); ASSUME(GetSpeciesType(SPECIES_NIDORAN_M, 0) == TYPE_POISON); PLAYER(species); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/upper_hand.c b/test/battle/move_effect/upper_hand.c index 49dc21bf49..b879303abf 100644 --- a/test/battle/move_effect/upper_hand.c +++ b/test/battle/move_effect/upper_hand.c @@ -160,7 +160,7 @@ DOUBLE_BATTLE_TEST("Upper Hand fails if the target has attempted to act even if SINGLE_BATTLE_TEST("Upper Hand failing will prevent Protean activation") { GIVEN { - WITH_CONFIG(CONFIG_PROTEAN_LIBERO, GEN_6); + WITH_CONFIG(B_PROTEAN_LIBERO, GEN_6); PLAYER(SPECIES_REGIROCK); OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/water_sport.c b/test/battle/move_effect/water_sport.c index 5cf52ed1c2..37d4fddf7e 100644 --- a/test/battle/move_effect/water_sport.c +++ b/test/battle/move_effect/water_sport.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Water Sport reduces the damage of Fire Type moves by 50% (Ge PARAMETRIZE { config = GEN_4; } PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_SPORT_DMG_REDUCTION, config); + WITH_CONFIG(B_SPORT_DMG_REDUCTION, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/wish.c b/test/battle/move_effect/wish.c index 6e9114bc09..a9f93820bb 100644 --- a/test/battle/move_effect/wish.c +++ b/test/battle/move_effect/wish.c @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Wish restores 50% of the user's HP when not switching") PARAMETRIZE { config = GEN_4; } PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_WISH_HP_SOURCE, config); + WITH_CONFIG(B_WISH_HP_SOURCE, config); PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Wish restores 50% of the user's HP when not switching") SINGLE_BATTLE_TEST("Wish restores 50% of the user's HP when switching (Gen5+)") { GIVEN { - WITH_CONFIG(CONFIG_WISH_HP_SOURCE, GEN_5); + WITH_CONFIG(B_WISH_HP_SOURCE, GEN_5); PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); } PLAYER(SPECIES_WOBBUFFET) { HP(100); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); @@ -50,7 +50,7 @@ SINGLE_BATTLE_TEST("Wish restores 50% of the user's HP when switching (Gen5+)") SINGLE_BATTLE_TEST("Wish restores 50% of the recipient's HP when switching (Gen3-4)") { GIVEN { - WITH_CONFIG(CONFIG_WISH_HP_SOURCE, GEN_4); + WITH_CONFIG(B_WISH_HP_SOURCE, GEN_4); PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); } PLAYER(SPECIES_WOBBUFFET) { HP(100); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect_secondary/dire_claw.c b/test/battle/move_effect_secondary/dire_claw.c index e45b8e3947..c90b763c1a 100644 --- a/test/battle/move_effect_secondary/dire_claw.c +++ b/test/battle/move_effect_secondary/dire_claw.c @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze poison/electric types respe PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_RAICHU; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = MOVE_EFFECT_POISON; species = SPECIES_ARBOK; } GIVEN { - WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, GEN_6); + WITH_CONFIG(B_PARALYZE_ELECTRIC, GEN_6); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species); } WHEN { diff --git a/test/battle/move_effect_secondary/paralysis.c b/test/battle/move_effect_secondary/paralysis.c index 121d7ac6e9..942c57fe56 100644 --- a/test/battle/move_effect_secondary/paralysis.c +++ b/test/battle/move_effect_secondary/paralysis.c @@ -27,7 +27,7 @@ SINGLE_BATTLE_TEST("Thunder Shock cannot paralyze an Electric-type (Gen6+)") PARAMETRIZE { gen = GEN_5; } PARAMETRIZE { gen = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, gen); + WITH_CONFIG(B_PARALYZE_ELECTRIC, gen); ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIKACHU); diff --git a/test/battle/move_effect_secondary/tri_attack.c b/test/battle/move_effect_secondary/tri_attack.c index 308e3914fd..c10d2e9d2a 100644 --- a/test/battle/move_effect_secondary/tri_attack.c +++ b/test/battle/move_effect_secondary/tri_attack.c @@ -50,7 +50,7 @@ SINGLE_BATTLE_TEST("Tri Attack cannot paralyze/burn/freeze electric/fire/ice typ PARAMETRIZE { statusAnim = B_ANIM_STATUS_BRN; rng = MOVE_EFFECT_BURN; species = SPECIES_ARCANINE; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_FRZ; rng = MOVE_EFFECT_FREEZE_OR_FROSTBITE; species = SPECIES_GLALIE; } GIVEN { - WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, GEN_6); + WITH_CONFIG(B_PARALYZE_ELECTRIC, GEN_6); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species); } WHEN { diff --git a/test/battle/move_effect_secondary/wrap.c b/test/battle/move_effect_secondary/wrap.c index 2e430871fd..5d6b7c1d27 100644 --- a/test/battle/move_effect_secondary/wrap.c +++ b/test/battle/move_effect_secondary/wrap.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon for 5 turns 25% (Gen3-4) or PARAMETRIZE { config = GEN_5; passes = 50; trials = 100; } PASSES_RANDOMLY(passes, trials, RNG_WRAP); GIVEN { - WITH_CONFIG(CONFIG_BINDING_TURNS, config); + WITH_CONFIG(B_BINDING_TURNS, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon for 4 turns 25% (Gen3-4) or PARAMETRIZE { config = GEN_5; passes = 50; trials = 100; } PASSES_RANDOMLY(passes, trials, RNG_WRAP); GIVEN { - WITH_CONFIG(CONFIG_BINDING_TURNS, config); + WITH_CONFIG(B_BINDING_TURNS, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -70,7 +70,7 @@ SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon 5 turns (Gen4) or 7 turns (G PARAMETRIZE { config = GEN_4; } PARAMETRIZE { config = GEN_5; } GIVEN { - WITH_CONFIG(CONFIG_BINDING_TURNS, config); + WITH_CONFIG(B_BINDING_TURNS, config); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_GRIP_CLAW); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effects_combined/triple_arrows.c b/test/battle/move_effects_combined/triple_arrows.c index f9e0e550b8..5295418b35 100644 --- a/test/battle/move_effects_combined/triple_arrows.c +++ b/test/battle/move_effects_combined/triple_arrows.c @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Triple Arrows has an increased critical hit ratio") } PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_TRIPLE_ARROWS) == 1); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_flags/cant_use_twice.c b/test/battle/move_flags/cant_use_twice.c index 1945a2b198..d489dcca3f 100644 --- a/test/battle/move_flags/cant_use_twice.c +++ b/test/battle/move_flags/cant_use_twice.c @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Moves with the cantUseTwice flag strike again if fast encore PARAMETRIZE { move = MOVE_GIGATON_HAMMER; } PARAMETRIZE { move = MOVE_BLOOD_MOON; } GIVEN { - WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); + WITH_CONFIG(B_ENCORE_TARGET, GEN_3); ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_flags/critical_hit_stage.c b/test/battle/move_flags/critical_hit_stage.c index 0712d49ace..820e1964ff 100644 --- a/test/battle/move_flags/critical_hit_stage.c +++ b/test/battle/move_flags/critical_hit_stage.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("criticalHitStage set to 1 increases critical hits occur at a } PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(B_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1); ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_flags/powder.c b/test/battle/move_flags/powder.c index bb109a252e..6de27dbdf6 100644 --- a/test/battle/move_flags/powder.c +++ b/test/battle/move_flags/powder.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Powder moves are blocked by Grass-type Pokémon (Gen6+)") PARAMETRIZE { gen = GEN_5; } PARAMETRIZE { gen = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_POWDER_GRASS, gen); + WITH_CONFIG(B_POWDER_GRASS, gen); ASSUME(IsPowderMove(MOVE_STUN_SPORE)); ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); PLAYER(SPECIES_WYNAUT); diff --git a/test/battle/sleep_clause.c b/test/battle/sleep_clause.c index ba14671b43..5341aff179 100644 --- a/test/battle/sleep_clause.c +++ b/test/battle/sleep_clause.c @@ -307,7 +307,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% (Gen5+) of the t PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(MoveMakesContact(MOVE_SCRATCH)); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); @@ -332,7 +332,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% (Gen5+) of the t PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(MoveMakesContact(MOVE_SCRATCH)); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); @@ -360,7 +360,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep from Effect Spore will not activate slee PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(MoveMakesContact(MOVE_SCRATCH)); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); @@ -388,7 +388,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep from Effect Spore will not activate slee PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(MoveMakesContact(MOVE_SCRATCH)); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); @@ -841,7 +841,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo PASSES_RANDOMLY(passes, 100, RNG_SHED_SKIN); GIVEN { - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, config); FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); @@ -1219,7 +1219,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep caused by Effect Spore does not prevent PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); @@ -1256,7 +1256,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Waking up after Effect Spore doesn't deactivat PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(MoveMakesContact(MOVE_SCRATCH)); @@ -1296,7 +1296,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Waking up after Effect Spore doesn't deactivat PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); @@ -1473,7 +1473,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Yawn'd Pokémon slept due to Effect Spore befo PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); + WITH_CONFIG(B_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); @@ -1778,7 +1778,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep Clause does not prevent sleeping your pa DOUBLE_BATTLE_TEST("Sleep Clause: Sleep moves used after being Encore'd are prevented when sleep clause is active") { GIVEN { - WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); + WITH_CONFIG(B_ENCORE_TARGET, GEN_3); FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); diff --git a/test/battle/spread_moves.c b/test/battle/spread_moves.c index 477af564c8..268633940e 100644 --- a/test/battle/spread_moves.c +++ b/test/battle/spread_moves.c @@ -172,7 +172,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: A spread move attack will be weakened by stron DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (right) and Lightning Rod (left)") { GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); @@ -192,7 +192,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (right) and DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (left) and Lightning Rod (right)") { GIVEN { - WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/status1/burn.c b/test/battle/status1/burn.c index d283307590..ce85e76d87 100644 --- a/test/battle/status1/burn.c +++ b/test/battle/status1/burn.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Burn deals 1/8th damage (Gen2-6) or 1/16th (Gen1 and Gen7+) PARAMETRIZE { config = GEN_7; value = 16; } PARAMETRIZE { config = GEN_6; value = 8; } GIVEN { - WITH_CONFIG(CONFIG_BURN_DAMAGE, config); + WITH_CONFIG(B_BURN_DAMAGE, config); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/status1/frostbite.c b/test/battle/status1/frostbite.c index 9ae86a8738..825dff3831 100644 --- a/test/battle/status1/frostbite.c +++ b/test/battle/status1/frostbite.c @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Frostbite deals 1/8th damage (Gen1-6) or 1/16th (Gen7+) per PARAMETRIZE { config = GEN_7; value = 16; } PARAMETRIZE { config = GEN_6; value = 8; } GIVEN { - WITH_CONFIG(CONFIG_BURN_DAMAGE, config); + WITH_CONFIG(B_BURN_DAMAGE, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_FROSTBITE); } } WHEN { diff --git a/test/battle/status1/paralysis.c b/test/battle/status1/paralysis.c index fa78387af7..3f2d3627c0 100644 --- a/test/battle/status1/paralysis.c +++ b/test/battle/status1/paralysis.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Paralysis reduces Speed by 50% (Gen 7+) or 75% (Gen 1-6)") PARAMETRIZE { playerSpeed = 98; playerFirst = FALSE; genConfig = GEN_7; } PARAMETRIZE { playerSpeed = 102; playerFirst = TRUE; genConfig = GEN_7; } GIVEN { - WITH_CONFIG(CONFIG_PARALYSIS_SPEED, genConfig); + WITH_CONFIG(B_PARALYSIS_SPEED, genConfig); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_PARALYSIS); Speed(playerSpeed); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } } WHEN { @@ -56,7 +56,7 @@ AI_SINGLE_BATTLE_TEST("AI avoids Thunder Wave when it can not paralyse target") PARAMETRIZE { species = SPECIES_PIKACHU; ability = ABILITY_STATIC; } GIVEN { - WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, GEN_6); + WITH_CONFIG(B_PARALYZE_ELECTRIC, GEN_6); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_THUNDER_WAVE); } @@ -71,7 +71,7 @@ SINGLE_BATTLE_TEST("Thunder Wave doesn't affect Electric types (Gen6+)") PARAMETRIZE { gen = GEN_5; } PARAMETRIZE { gen = GEN_6; } GIVEN { - WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, gen); + WITH_CONFIG(B_PARALYZE_ELECTRIC, gen); ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIKACHU); diff --git a/test/battle/status1/sleep.c b/test/battle/status1/sleep.c index 5cb60668b9..a087cc3290 100644 --- a/test/battle/status1/sleep.c +++ b/test/battle/status1/sleep.c @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Sleep prevents the battler from using a move") SINGLE_BATTLE_TEST("Sleep: Spore affects grass types (Gen1-5)") { GIVEN { - WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_5); + WITH_CONFIG(B_POWDER_GRASS, GEN_5); ASSUME(IsPowderMove(MOVE_SPORE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CHIKORITA); @@ -39,7 +39,7 @@ SINGLE_BATTLE_TEST("Sleep: Spore affects grass types (Gen1-5)") SINGLE_BATTLE_TEST("Sleep: Spore doesn't affect grass types (Gen6+)") { GIVEN { - WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(B_POWDER_GRASS, GEN_6); ASSUME(IsPowderMove(MOVE_SPORE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CHIKORITA); diff --git a/test/battle/trainer_slides.c b/test/battle/trainer_slides.c index 8f7bae9b09..7c9f7e7d99 100644 --- a/test/battle/trainer_slides.c +++ b/test/battle/trainer_slides.c @@ -109,7 +109,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Enemy Mon Unaffected") { gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; GIVEN { - WITH_CONFIG(CONFIG_SHEER_COLD_IMMUNITY, GEN_7); + WITH_CONFIG(B_SHEER_COLD_IMMUNITY, GEN_7); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_GLALIE); diff --git a/test/battle/volatiles/confusion.c b/test/battle/volatiles/confusion.c index b9a1237955..7fc8cc54c4 100644 --- a/test/battle/volatiles/confusion.c +++ b/test/battle/volatiles/confusion.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Confusion adds a 50/33% chance to hit self with 40 power") PARAMETRIZE { genConfig = GEN_7; pctChance = 33; } PASSES_RANDOMLY(pctChance, 100, RNG_CONFUSION); GIVEN { - WITH_CONFIG(CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); + WITH_CONFIG(B_CONFUSION_SELF_DMG_CHANCE, genConfig); ASSUME(GetMovePower(MOVE_SCRATCH) == 40); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } @@ -38,7 +38,7 @@ SINGLE_BATTLE_TEST("Confusion self hit does not consume Gems") PARAMETRIZE { genConfig = GEN_7; pctChance = 33; } PASSES_RANDOMLY(pctChance, 100, RNG_CONFUSION); GIVEN { - WITH_CONFIG(CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); + WITH_CONFIG(B_CONFUSION_SELF_DMG_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/weather/sandstorm.c b/test/battle/weather/sandstorm.c index 55b5907ffb..930b017f4e 100644 --- a/test/battle/weather/sandstorm.c +++ b/test/battle/weather/sandstorm.c @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Sandstorm multiplies the special defense of Rock-types by 1. PARAMETRIZE { move = MOVE_SANDSTORM; config = GEN_3; } PARAMETRIZE { move = MOVE_SANDSTORM; config = GEN_4; } GIVEN { - WITH_CONFIG(CONFIG_SANDSTORM_SPDEF_BOOST, config); + WITH_CONFIG(B_SANDSTORM_SPDEF_BOOST, config); ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET) ; OPPONENT(SPECIES_NOSEPASS); From eb7d055d6bb78f19dbeb2a842236be6337903aee Mon Sep 17 00:00:00 2001 From: GGbond Date: Sat, 7 Feb 2026 01:45:36 +0800 Subject: [PATCH 36/36] =?UTF-8?q?Fix=20Rare=20Candy=20reviving=20fainted?= =?UTF-8?q?=20level=20100=20Pok=C3=A9mon=20(#9117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pokemon.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/pokemon.c b/src/pokemon.c index 90273d1709..96b661bf52 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -3725,6 +3725,9 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov u8 effectFlags; s8 evChange; u16 evCount; + u8 levelBefore; + bool8 didLevelUp = FALSE; + bool8 isLevelUpItem; // Determine the EV cap to use u32 maxAllowedEVs = !B_EV_ITEMS_CAP ? MAX_TOTAL_EVS : GetCurrentEVCap(); @@ -3746,6 +3749,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov // Get item effect itemEffect = GetItemEffect(item); + isLevelUpItem = (itemEffect[3] & ITEM3_LEVEL_UP) != 0; + levelBefore = GetMonData(mon, MON_DATA_LEVEL, NULL); // Do item effect for (i = 0; i < ITEM_EFFECT_ARG_START; i++) @@ -3800,6 +3805,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov { SetMonData(mon, MON_DATA_EXP, &dataUnsigned); CalculateMonStats(mon); + if (GetMonData(mon, MON_DATA_LEVEL, NULL) > levelBefore) + didLevelUp = TRUE; retVal = FALSE; } } @@ -3918,6 +3925,11 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov { u32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); u32 maxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL); + if (isLevelUpItem && !didLevelUp && (effectFlags & (ITEM4_REVIVE >> 2))) + { + itemEffectParam++; + break; + } // Check use validity. if ((effectFlags & (ITEM4_REVIVE >> 2) && currentHP != 0) || (!(effectFlags & (ITEM4_REVIVE >> 2)) && currentHP == 0))