diff --git a/audio/engine.asm b/audio/engine.asm index 65e0e75..40e8421 100644 --- a/audio/engine.asm +++ b/audio/engine.asm @@ -2687,6 +2687,7 @@ _PlaySFX:: jr nz, .start_channels ret +PlayStereoSFX:: ld a, [wce5f] bit 5, a ; Stereo flag? jr z, _PlaySFX diff --git a/audio/sfx.asm b/audio/sfx.asm index cd226c1..62eb45e 100644 --- a/audio/sfx.asm +++ b/audio/sfx.asm @@ -2,9 +2,9 @@ INCLUDE "constants.asm" SECTION "audio/sfx.asm", ROMX -Sfx_00: +Sfx_BallWobble: channel_count 1 - channel 5, Sfx_00_Ch5 + channel 5, Sfx_BallWobble_Ch5 Sfx_Potion: channel_count 1 @@ -22,183 +22,183 @@ Sfx_ReadText: channel_count 1 channel 5, Sfx_ReadText_Ch5 -Sfx_06: +Sfx_Poison: channel_count 1 - channel 5, Sfx_06_Ch5 + channel 5, Sfx_Poison_Ch5 -Sfx_07: +Sfx_TradeMachine: channel_count 1 - channel 5, Sfx_07_Ch5 - -Sfx_08: - channel_count 1 - channel 5, Sfx_08_Ch5 - -Sfx_09: - channel_count 1 - channel 5, Sfx_09_Ch5 + channel 5, Sfx_TradeMachine_Ch5 Sfx_BootPC: channel_count 1 channel 5, Sfx_BootPC_Ch5 +Sfx_ShutDownPC: + channel_count 1 + channel 5, Sfx_ShutDownPC_Ch5 + +Sfx_ChoosePCOption: + channel_count 1 + channel 5, Sfx_ChoosePCOption_Ch5 + Sfx_EscapeRope: channel_count 1 channel 5, Sfx_EscapeRope_Ch5 -Sfx_0c: +Sfx_PressSwitch: channel_count 1 - channel 5, Sfx_0c_Ch5 + channel 5, Sfx_PressSwitch_Ch5 -Sfx_0d: +Sfx_HealingMachine: channel_count 1 - channel 5, Sfx_0d_Ch5 + channel 5, Sfx_HealingMachine_Ch5 -Sfx_0e: +Sfx_WarpTo: channel_count 1 - channel 5, Sfx_0e_Ch5 + channel 5, Sfx_WarpTo_Ch5 -Sfx_0f: +Sfx_TeleportEnter1: channel_count 1 - channel 5, Sfx_0f_Ch5 + channel 5, Sfx_TeleportEnter1_Ch5 -Sfx_10: +Sfx_TeleportExit2: channel_count 1 - channel 5, Sfx_10_Ch5 + channel 5, Sfx_TeleportExit2_Ch5 -Sfx_11: +Sfx_JumpOverLedge: channel_count 1 - channel 5, Sfx_11_Ch5 + channel 5, Sfx_JumpOverLedge_Ch5 -Sfx_12: +Sfx_TeleportEnter2: channel_count 1 - channel 8, Sfx_12_Ch8 + channel 8, Sfx_TeleportEnter2_Ch8 -Sfx_13: +Sfx_Fly: channel_count 1 - channel 8, Sfx_13_Ch8 + channel 8, Sfx_Fly_Ch8 Sfx_Wrong: channel_count 2 channel 5, Sfx_Wrong_Ch5 channel 6, Sfx_Wrong_Ch6 -Sfx_15: +Sfx_ArrowTiles: channel_count 1 - channel 5, Sfx_15_Ch5 + channel 5, Sfx_ArrowTiles_Ch5 -Sfx_16: +Sfx_Strength: channel_count 1 - channel 8, Sfx_16_Ch8 + channel 8, Sfx_Strength_Ch8 -Sfx_17: +Sfx_Megaphone: channel_count 2 - channel 5, Sfx_17_Ch5 - channel 6, Sfx_17_Ch6 + channel 5, Sfx_Megaphone_Ch5 + channel 6, Sfx_Megaphone_Ch6 -Sfx_18: +Sfx_WithdrawDeposit: channel_count 1 - channel 5, Sfx_18_Ch5 + channel 5, Sfx_WithdrawDeposit_Ch5 -Sfx_19: +Sfx_CutRG: channel_count 1 - channel 8, Sfx_19_Ch8 + channel 8, Sfx_CutRG_Ch8 -Sfx_1a: +Sfx_GoInside: channel_count 1 - channel 8, Sfx_1a_Ch8 + channel 8, Sfx_GoInside_Ch8 Sfx_SwitchPokemon: channel_count 2 channel 5, Sfx_SwitchPokemon_Ch5 channel 6, Sfx_SwitchPokemon_Ch6 -Sfx_1c: +Sfx_BellyDrum: channel_count 2 - channel 5, Sfx_1c_Ch5 - channel 6, Sfx_1c_Ch6 + channel 5, Sfx_BellyDrum_Ch5 + channel 6, Sfx_BellyDrum_Ch6 -Sfx_1d: +Sfx_Purchase: channel_count 2 - channel 5, Sfx_1d_Ch5 - channel 6, Sfx_1d_Ch6 + channel 5, Sfx_Purchase_Ch5 + channel 6, Sfx_Purchase_Ch6 -Sfx_1e: +Sfx_Collision: channel_count 1 - channel 5, Sfx_1e_Ch5 + channel 5, Sfx_Collision_Ch5 -Sfx_1f: +Sfx_GoOutside: channel_count 1 - channel 8, Sfx_1f_Ch8 + channel 8, Sfx_GoOutside_Ch8 -Sfx_20: +Sfx_Save: channel_count 2 - channel 5, Sfx_20_Ch5 - channel 6, Sfx_20_Ch6 + channel 5, Sfx_Save_Ch5 + channel 6, Sfx_Save_Ch6 Sfx_Pokeflute: channel_count 1 channel 7, Sfx_Pokeflute_Ch7 -Sfx_22: +Sfx_SafariZonePA: channel_count 1 - channel 5, Sfx_22_Ch5 + channel 5, Sfx_SafariZonePA_Ch5 -Sfx_23: +Sfx_ThrowBall: channel_count 2 - channel 5, Sfx_23_Ch5 - channel 6, Sfx_23_Ch6 + channel 5, Sfx_ThrowBall_Ch5 + channel 6, Sfx_ThrowBall_Ch6 -Sfx_24: +Sfx_BallPoof: channel_count 2 - channel 5, Sfx_24_Ch5 - channel 8, Sfx_24_Ch8 + channel 5, Sfx_BallPoof_Ch5 + channel 8, Sfx_BallPoof_Ch8 -Sfx_25: +Sfx_Faint: channel_count 2 - channel 5, Sfx_25_Ch5 - channel 8, Sfx_25_Ch8 + channel 5, Sfx_Faint_Ch5 + channel 8, Sfx_Faint_Ch8 -Sfx_26: +Sfx_Run: channel_count 1 - channel 8, Sfx_26_Ch8 + channel 8, Sfx_Run_Ch8 Sfx_PokedexRegistration: channel_count 2 channel 5, Sfx_PokedexRegistration_Ch5 channel 6, Sfx_PokedexRegistration_Ch6 -Sfx_28: +Sfx_IntroLungeRG: channel_count 1 - channel 8, Sfx_28_Ch8 + channel 8, Sfx_IntroLungeRG_Ch8 -Sfx_29: +Sfx_Unknown29: channel_count 1 - channel 8, Sfx_29_Ch8 + channel 8, Sfx_Unknown29_Ch8 -Sfx_2a: +Sfx_Unknown2a: channel_count 1 - channel 8, Sfx_2a_Ch8 + channel 8, Sfx_Unknown2a_Ch8 -Sfx_2b: +Sfx_IntroRaiseRG: channel_count 1 - channel 8, Sfx_2b_Ch8 + channel 8, Sfx_IntroRaiseRG_Ch8 -Sfx_2c: +Sfx_IntroCrashRG: channel_count 1 - channel 8, Sfx_2c_Ch8 + channel 8, Sfx_IntroCrashRG_Ch8 Sfx_TitleEntrance: channel_count 1 channel 8, Sfx_TitleEntrance_Ch8 -Sfx_2e: +Sfx_SlotsStopWheel: channel_count 1 - channel 5, Sfx_2e_Ch5 + channel 5, Sfx_SlotsStopWheel_Ch5 -Sfx_2f: +Sfx_SlotsReward: channel_count 1 - channel 5, Sfx_2f_Ch5 + channel 5, Sfx_SlotsReward_Ch5 Sfx_PayDay: channel_count 2 @@ -209,229 +209,229 @@ Sfx_GameFreakLogoRG: channel_count 1 channel 5, Sfx_GameFreakLogoRG_Ch5 -Sfx_32: +Sfx_Peck: channel_count 1 - channel 8, Sfx_32_Ch8 + channel 8, Sfx_Peck_Ch8 -Sfx_33: +Sfx_Kinesis: channel_count 1 - channel 5, Sfx_33_Ch5 + channel 5, Sfx_Kinesis_Ch5 -Sfx_34: +Sfx_Lick: channel_count 1 - channel 5, Sfx_34_Ch5 + channel 5, Sfx_Lick_Ch5 -Sfx_35: +Sfx_Pound: channel_count 1 - channel 8, Sfx_35_Ch8 + channel 8, Sfx_Pound_Ch8 -Sfx_36: +Sfx_Thrash: channel_count 1 - channel 8, Sfx_36_Ch8 + channel 8, Sfx_Thrash_Ch8 -Sfx_37: +Sfx_CometPunch: channel_count 1 - channel 8, Sfx_37_Ch8 + channel 8, Sfx_CometPunch_Ch8 -Sfx_38: +Sfx_MegaPunch: channel_count 1 - channel 8, Sfx_38_Ch8 + channel 8, Sfx_MegaPunch_Ch8 -Sfx_39: +Sfx_Scratch: channel_count 1 - channel 8, Sfx_39_Ch8 + channel 8, Sfx_Scratch_Ch8 -Sfx_3a: +Sfx_ViceGrip: channel_count 1 - channel 8, Sfx_3a_Ch8 + channel 8, Sfx_ViceGrip_Ch8 -Sfx_3b: +Sfx_RazorWind: channel_count 1 - channel 8, Sfx_3b_Ch8 + channel 8, Sfx_RazorWind_Ch8 -Sfx_3c: +Sfx_Cut: channel_count 1 - channel 8, Sfx_3c_Ch8 + channel 8, Sfx_Cut_Ch8 -Sfx_3d: +Sfx_WingAttack: channel_count 1 - channel 8, Sfx_3d_Ch8 + channel 8, Sfx_WingAttack_Ch8 -Sfx_3e: +Sfx_Whirlwind: channel_count 1 - channel 8, Sfx_3e_Ch8 + channel 8, Sfx_Whirlwind_Ch8 -Sfx_3f: +Sfx_Bind: channel_count 1 - channel 8, Sfx_3f_Ch8 + channel 8, Sfx_Bind_Ch8 -Sfx_40: +Sfx_VineWhip: channel_count 1 - channel 8, Sfx_40_Ch8 + channel 8, Sfx_VineWhip_Ch8 -Sfx_41: +Sfx_DoubleKick: channel_count 1 - channel 8, Sfx_41_Ch8 + channel 8, Sfx_DoubleKick_Ch8 -Sfx_42: +Sfx_MegaKick: channel_count 1 - channel 8, Sfx_42_Ch8 + channel 8, Sfx_MegaKick_Ch8 -Sfx_43: +Sfx_Headbutt: channel_count 1 - channel 8, Sfx_43_Ch8 + channel 8, Sfx_Headbutt_Ch8 -Sfx_44: +Sfx_HornAttack: channel_count 1 - channel 8, Sfx_44_Ch8 + channel 8, Sfx_HornAttack_Ch8 -Sfx_45: +Sfx_Tackle: channel_count 1 - channel 8, Sfx_45_Ch8 + channel 8, Sfx_Tackle_Ch8 -Sfx_46: +Sfx_PoisonSting: channel_count 1 - channel 8, Sfx_46_Ch8 + channel 8, Sfx_PoisonSting_Ch8 -Sfx_47: +Sfx_Powder: channel_count 1 - channel 8, Sfx_47_Ch8 + channel 8, Sfx_Powder_Ch8 -Sfx_48: +Sfx_Doubleslap: channel_count 1 - channel 8, Sfx_48_Ch8 + channel 8, Sfx_Doubleslap_Ch8 -Sfx_49: +Sfx_Bite: channel_count 2 - channel 5, Sfx_49_Ch5 - channel 8, Sfx_49_Ch8 + channel 5, Sfx_Bite_Ch5 + channel 8, Sfx_Bite_Ch8 -Sfx_4a: +Sfx_JumpKick: channel_count 1 - channel 8, Sfx_4a_Ch8 + channel 8, Sfx_JumpKick_Ch8 -Sfx_4b: +Sfx_Stomp: channel_count 1 - channel 8, Sfx_4b_Ch8 + channel 8, Sfx_Stomp_Ch8 -Sfx_4c: +Sfx_TailWhip: channel_count 1 - channel 8, Sfx_4c_Ch8 + channel 8, Sfx_TailWhip_Ch8 -Sfx_4d: +Sfx_KarateChop: channel_count 1 - channel 8, Sfx_4d_Ch8 + channel 8, Sfx_KarateChop_Ch8 -Sfx_4e: +Sfx_Submission: channel_count 1 - channel 8, Sfx_4e_Ch8 + channel 8, Sfx_Submission_Ch8 -Sfx_4f: +Sfx_WaterGun: channel_count 2 - channel 5, Sfx_4f_Ch5 - channel 8, Sfx_4f_Ch8 + channel 5, Sfx_WaterGun_Ch5 + channel 8, Sfx_WaterGun_Ch8 -Sfx_50: +Sfx_SwordsDance: channel_count 1 - channel 8, Sfx_50_Ch8 + channel 8, Sfx_SwordsDance_Ch8 -Sfx_51: +Sfx_Thunder: channel_count 1 - channel 8, Sfx_51_Ch8 + channel 8, Sfx_Thunder_Ch8 -Sfx_52: +Sfx_Supersonic: channel_count 3 - channel 5, Sfx_52_Ch5 - channel 6, Sfx_52_Ch6 - channel 8, Sfx_52_Ch8 + channel 5, Sfx_Supersonic_Ch5 + channel 6, Sfx_Supersonic_Ch6 + channel 8, Sfx_Supersonic_Ch8 -Sfx_53: +Sfx_Leer: channel_count 3 - channel 5, Sfx_53_Ch5 - channel 6, Sfx_53_Ch6 - channel 8, Sfx_53_Ch8 + channel 5, Sfx_Leer_Ch5 + channel 6, Sfx_Leer_Ch6 + channel 8, Sfx_Leer_Ch8 -Sfx_54: +Sfx_Ember: channel_count 2 - channel 5, Sfx_54_Ch5 - channel 8, Sfx_54_Ch8 + channel 5, Sfx_Ember_Ch5 + channel 8, Sfx_Ember_Ch8 -Sfx_55: +Sfx_Bubblebeam: channel_count 3 - channel 5, Sfx_55_Ch5 - channel 6, Sfx_55_Ch6 - channel 8, Sfx_55_Ch8 + channel 5, Sfx_Bubblebeam_Ch5 + channel 6, Sfx_Bubblebeam_Ch6 + channel 8, Sfx_Bubblebeam_Ch8 -Sfx_56: +Sfx_HydroPump: channel_count 2 - channel 5, Sfx_56_Ch5 - channel 8, Sfx_56_Ch8 + channel 5, Sfx_HydroPump_Ch5 + channel 8, Sfx_HydroPump_Ch8 -Sfx_57: +Sfx_Surf: channel_count 3 - channel 5, Sfx_57_Ch5 - channel 6, Sfx_57_Ch6 - channel 8, Sfx_57_Ch8 + channel 5, Sfx_Surf_Ch5 + channel 6, Sfx_Surf_Ch6 + channel 8, Sfx_Surf_Ch8 -Sfx_58: +Sfx_Psybeam: channel_count 3 - channel 5, Sfx_58_Ch5 - channel 6, Sfx_58_Ch6 - channel 8, Sfx_58_Ch8 + channel 5, Sfx_Psybeam_Ch5 + channel 6, Sfx_Psybeam_Ch6 + channel 8, Sfx_Psybeam_Ch8 -Sfx_59: +Sfx_Charge: channel_count 3 - channel 5, Sfx_59_Ch5 - channel 6, Sfx_59_Ch6 - channel 8, Sfx_59_Ch8 + channel 5, Sfx_Charge_Ch5 + channel 6, Sfx_Charge_Ch6 + channel 8, Sfx_Charge_Ch8 -Sfx_5a: +Sfx_Thundershock: channel_count 3 - channel 5, Sfx_5a_Ch5 - channel 6, Sfx_5a_Ch6 - channel 8, Sfx_5a_Ch8 + channel 5, Sfx_Thundershock_Ch5 + channel 6, Sfx_Thundershock_Ch6 + channel 8, Sfx_Thundershock_Ch8 -Sfx_5b: +Sfx_Psychic: channel_count 3 - channel 5, Sfx_5b_Ch5 - channel 6, Sfx_5b_Ch6 - channel 8, Sfx_5b_Ch8 + channel 5, Sfx_Psychic_Ch5 + channel 6, Sfx_Psychic_Ch6 + channel 8, Sfx_Psychic_Ch8 -Sfx_5c: +Sfx_Screech: channel_count 2 - channel 5, Sfx_5c_Ch5 - channel 6, Sfx_5c_Ch6 + channel 5, Sfx_Screech_Ch5 + channel 6, Sfx_Screech_Ch6 -Sfx_5d: +Sfx_BoneClub: channel_count 2 - channel 5, Sfx_5d_Ch5 - channel 6, Sfx_5d_Ch6 + channel 5, Sfx_BoneClub_Ch5 + channel 6, Sfx_BoneClub_Ch6 -Sfx_5e: +Sfx_Sharpen: channel_count 2 - channel 5, Sfx_5e_Ch5 - channel 6, Sfx_5e_Ch6 + channel 5, Sfx_Sharpen_Ch5 + channel 6, Sfx_Sharpen_Ch6 -Sfx_5f: +Sfx_EggBomb: channel_count 3 - channel 5, Sfx_5f_Ch5 - channel 6, Sfx_5f_Ch6 - channel 8, Sfx_5f_Ch8 + channel 5, Sfx_EggBomb_Ch5 + channel 6, Sfx_EggBomb_Ch6 + channel 8, Sfx_EggBomb_Ch8 -Sfx_60: +Sfx_Sing: channel_count 2 - channel 5, Sfx_60_Ch5 - channel 6, Sfx_60_Ch6 + channel 5, Sfx_Sing_Ch5 + channel 6, Sfx_Sing_Ch6 -Sfx_61: +Sfx_HyperBeam: channel_count 3 - channel 5, Sfx_61_Ch5 - channel 6, Sfx_61_Ch6 - channel 8, Sfx_61_Ch8 + channel 5, Sfx_HyperBeam_Ch5 + channel 6, Sfx_HyperBeam_Ch6 + channel 8, Sfx_HyperBeam_Ch8 -Sfx_62: +Sfx_Shine: channel_count 1 - channel 5, Sfx_62_Ch5 + channel 5, Sfx_Shine_Ch5 Sfx_GetItemRG: channel_count 3 @@ -517,7 +517,7 @@ Sfx_Pokeflute_Ch7: rest 12 sound_ret -Sfx_19_Ch8: +Sfx_CutRG_Ch8: noise_note 2, 15, 7, 36 noise_note 2, 15, 7, 52 noise_note 4, 15, 7, 68 @@ -525,7 +525,7 @@ Sfx_19_Ch8: noise_note 8, 15, 1, 68 sound_ret -Sfx_1a_Ch8: +Sfx_GoInside_Ch8: noise_note 9, 15, 1, 68 noise_note 8, 13, 1, 67 sound_ret @@ -541,7 +541,7 @@ Sfx_SwitchPokemon_Ch6: square_note 8, 11, 1, 1857 sound_ret -Sfx_00_Ch5: +Sfx_BallWobble_Ch5: duty_cycle 2 pitch_sweep 3, -2 square_note 4, 15, 2, 512 @@ -550,38 +550,38 @@ Sfx_00_Ch5: pitch_sweep 0, 8 sound_ret -Sfx_1c_Ch5: +Sfx_BellyDrum_Ch5: duty_cycle 2 square_note 4, 15, 1, 1920 sound_ret -Sfx_1c_Ch6: +Sfx_BellyDrum_Ch6: duty_cycle 2 square_note 1, 0, 8, 0 square_note 4, 10, 1, 1889 sound_ret -Sfx_1d_Ch5: +Sfx_Purchase_Ch5: duty_cycle 2 square_note 4, 14, 1, 1792 square_note 8, 15, 2, 2016 sound_ret -Sfx_1d_Ch6: +Sfx_Purchase_Ch6: duty_cycle 2 square_note 1, 0, 8, 0 square_note 4, 9, 1, 1729 square_note 8, 10, 2, 1953 sound_ret -Sfx_1e_Ch5: +Sfx_Collision_Ch5: duty_cycle 2 pitch_sweep 5, -2 square_note 15, 15, 1, 768 pitch_sweep 0, 8 sound_ret -Sfx_1f_Ch8: +Sfx_GoOutside_Ch8: noise_note 2, 15, 1, 84 noise_note 12, 7, 1, 35 noise_note 2, 11, 1, 84 @@ -597,7 +597,7 @@ Sfx_ReadText_Ch5: square_note 12, 10, 1, 2000 sound_ret -Sfx_20_Ch5: +Sfx_Save_Ch5: duty_cycle 2 square_note 2, 15, 4, 1792 square_note 2, 14, 4, 1536 @@ -608,7 +608,7 @@ Sfx_20_Ch5: square_note 15, 15, 2, 2016 sound_ret -Sfx_20_Ch6: +Sfx_Save_Ch6: duty_cycle 2 square_note 2, 0, 8, 0 square_note 2, 13, 4, 1793 @@ -628,7 +628,7 @@ Sfx_Potion_Ch5: pitch_sweep 0, 8 sound_ret -Sfx_06_Ch5: +Sfx_Poison_Ch5: .loop duty_cycle 0 pitch_sweep 1, 4 @@ -648,7 +648,7 @@ Sfx_FullHeal_Ch5: pitch_sweep 0, 8 sound_ret -Sfx_07_Ch5: +Sfx_TradeMachine_Ch5: duty_cycle 2 pitch_sweep 1, 5 square_note 15, 15, 0, 1264 @@ -656,7 +656,7 @@ Sfx_07_Ch5: pitch_sweep 0, 8 sound_ret -Sfx_08_Ch5: +Sfx_BootPC_Ch5: duty_cycle 2 square_note 15, 15, 2, 1984 square_note 15, 0, 0, 0 @@ -670,7 +670,7 @@ Sfx_08_Ch5: square_note 8, 10, 1, 1792 sound_ret -Sfx_09_Ch5: +Sfx_ShutDownPC_Ch5: duty_cycle 2 square_note 4, 15, 0, 1536 square_note 4, 15, 0, 1024 @@ -678,7 +678,7 @@ Sfx_09_Ch5: square_note 1, 0, 0, 0 sound_ret -Sfx_BootPC_Ch5: +Sfx_ChoosePCOption_Ch5: duty_cycle 2 square_note 6, 15, 0, 1792 square_note 4, 0, 0, 0 @@ -697,7 +697,7 @@ Sfx_EscapeRope_Ch5: pitch_sweep 0, 8 sound_ret -Sfx_0c_Ch5: +Sfx_PressSwitch_Ch5: duty_cycle 2 square_note 4, 0, 0, 0 square_note 2, 15, 1, 1664 @@ -706,7 +706,7 @@ Sfx_0c_Ch5: square_note 4, 0, 0, 0 sound_ret -Sfx_0d_Ch5: +Sfx_HealingMachine_Ch5: duty_cycle 2 pitch_sweep 2, -4 square_note 4, 15, 2, 1280 @@ -716,7 +716,7 @@ Sfx_0d_Ch5: square_note 1, 0, 0, 0 sound_ret -Sfx_0e_Ch5: +Sfx_WarpTo_Ch5: duty_cycle 1 pitch_sweep 1, 7 square_note 15, 13, 7, 1280 @@ -727,7 +727,7 @@ Sfx_0e_Ch5: pitch_sweep 0, 8 sound_ret -Sfx_0f_Ch5: +Sfx_TeleportEnter1_Ch5: duty_cycle 1 pitch_sweep 1, 7 square_note 15, 13, 7, 1792 @@ -738,28 +738,28 @@ Sfx_0f_Ch5: pitch_sweep 0, 8 sound_ret -Sfx_10_Ch5: +Sfx_TeleportExit2_Ch5: duty_cycle 1 pitch_sweep 1, 6 square_note 15, 13, 2, 1280 pitch_sweep 0, 8 sound_ret -Sfx_11_Ch5: +Sfx_JumpOverLedge_Ch5: duty_cycle 2 pitch_sweep 9, 5 square_note 15, 15, 2, 1024 pitch_sweep 0, 8 sound_ret -Sfx_12_Ch8: +Sfx_TeleportEnter2_Ch8: noise_note 2, 15, 1, 50 noise_note 2, 0, 0, 0 noise_note 2, 15, 1, 34 noise_note 1, 0, 0, 0 sound_ret -Sfx_13_Ch8: +Sfx_Fly_Ch8: noise_note 2, 15, 1, 18 noise_note 2, 0, 0, 0 noise_note 2, 10, 1, 18 @@ -796,14 +796,14 @@ Sfx_Wrong_Ch6: square_note 1, 0, 0, 0 sound_ret -Sfx_15_Ch5: +Sfx_ArrowTiles_Ch5: duty_cycle 0 pitch_sweep 1, 7 square_note 15, 13, 2, 1792 pitch_sweep 0, 8 sound_ret -Sfx_16_Ch8: +Sfx_Strength_Ch8: noise_note 4, 10, 2, 35 noise_note 8, 15, 1, 52 noise_note 15, 0, 0, 0 @@ -814,7 +814,7 @@ Sfx_16_Ch8: noise_note 8, 15, 1, 68 sound_ret -Sfx_17_Ch5: +Sfx_Megaphone_Ch5: duty_cycle 2 square_note 15, 15, 0, 1280 square_note 4, 0, 0, 0 @@ -825,7 +825,7 @@ Sfx_17_Ch5: square_note 15, 15, 2, 1280 sound_ret -Sfx_17_Ch6: +Sfx_Megaphone_Ch6: duty_cycle 3 square_note 15, 15, 0, 1154 square_note 4, 0, 0, 0 @@ -836,7 +836,7 @@ Sfx_17_Ch6: square_note 15, 15, 2, 1154 sound_ret -Sfx_18_Ch5: +Sfx_WithdrawDeposit_Ch5: duty_cycle 1 pitch_sweep 3, -2 square_note 4, 15, 2, 1280 @@ -849,7 +849,7 @@ Sfx_18_Ch5: pitch_sweep 0, 8 sound_ret -Sfx_22_Ch5: +Sfx_SafariZonePA_Ch5: duty_cycle 2 square_note 15, 15, 3, 1840 square_note 8, 6, 5, 1840 @@ -859,18 +859,18 @@ Sfx_22_Ch5: square_note 15, 2, 4, 1792 sound_ret -Sfx_23_Ch5: +Sfx_ThrowBall_Ch5: duty_cycle 2 pitch_sweep 2, -7 square_note 15, 15, 2, 1920 sound_ret -Sfx_23_Ch6: +Sfx_ThrowBall_Ch6: duty_cycle 2 square_note 15, 12, 2, 1922 sound_ret -Sfx_62_Ch5: +Sfx_Shine_Ch5: duty_cycle 0 square_note 0, 13, 2, 1792 square_note 0, 13, 2, 1856 @@ -880,29 +880,29 @@ Sfx_62_Ch5: square_note 1, 0, 0, 0 sound_ret -Sfx_24_Ch5: +Sfx_BallPoof_Ch5: duty_cycle 2 pitch_sweep 1, 6 square_note 15, 15, 2, 1024 pitch_sweep 0, 8 sound_ret -Sfx_24_Ch8: +Sfx_BallPoof_Ch8: noise_note 15, 10, 2, 34 sound_ret -Sfx_25_Ch5: +Sfx_Faint_Ch5: square_note 15, 13, 1, 512 pitch_sweep 0, 8 sound_ret -Sfx_25_Ch8: +Sfx_Faint_Ch8: noise_note 4, 15, 5, 51 noise_note 8, 15, 4, 34 noise_note 15, 15, 2, 33 sound_ret -Sfx_26_Ch8: +Sfx_Run_Ch8: noise_note 2, 6, 1, 35 noise_note 2, 10, 1, 51 noise_note 2, 12, 1, 51 @@ -931,70 +931,70 @@ Sfx_PokedexRegistration_Ch6: square_note 15, 9, 2, 1922 sound_ret -Sfx_32_Ch8: +Sfx_Peck_Ch8: noise_note 2, 10, 1, 18 sound_ret -Sfx_33_Ch5: +Sfx_Kinesis_Ch5: duty_cycle 1 pitch_sweep 10, -7 square_note 15, 15, 2, 1920 pitch_sweep 0, 8 sound_ret -Sfx_34_Ch5: +Sfx_Lick_Ch5: duty_cycle 1 pitch_sweep 9, 7 square_note 15, 15, 2, 1280 pitch_sweep 0, 8 sound_ret -Sfx_35_Ch8: +Sfx_Pound_Ch8: noise_note 2, 10, 1, 34 sound_ret -Sfx_36_Ch8: +Sfx_Thrash_Ch8: noise_note 8, 15, 1, 84 sound_ret -Sfx_37_Ch8: +Sfx_CometPunch_Ch8: noise_note 15, 8, -7, 17 noise_note 4, 15, -7, 18 noise_note 10, 15, 1, 85 sound_ret -Sfx_38_Ch8: +Sfx_MegaPunch_Ch8: noise_note 15, 8, -7, 52 noise_note 8, 15, 2, 53 noise_note 10, 15, 1, 85 sound_ret -Sfx_39_Ch8: +Sfx_Scratch_Ch8: noise_note 15, 9, -7, 35 noise_note 8, 15, 1, 33 sound_ret -Sfx_3a_Ch8: +Sfx_ViceGrip_Ch8: noise_note 2, 14, 1, 75 noise_note 10, 15, 1, 68 noise_note 2, 14, 1, 58 noise_note 6, 15, 1, 52 sound_ret -Sfx_3b_Ch8: +Sfx_RazorWind_Ch8: noise_note 2, 15, 4, 68 noise_note 2, 15, 4, 20 noise_note 15, 15, 1, 50 sound_ret -Sfx_3c_Ch8: +Sfx_Cut_Ch8: noise_note 4, 8, -7, 85 noise_note 2, 15, 4, 68 noise_note 8, 15, 4, 34 noise_note 15, 15, 2, 33 sound_ret -Sfx_3d_Ch8: +Sfx_WingAttack_Ch8: .loop noise_note 8, 4, -7, 35 noise_note 4, 12, 4, 34 @@ -1002,21 +1002,21 @@ Sfx_3d_Ch8: sound_loop 4, .loop sound_ret -Sfx_3e_Ch8: +Sfx_Whirlwind_Ch8: noise_note 8, 4, -7, 51 noise_note 4, 12, 4, 34 noise_note 6, 15, 2, 35 noise_note 15, 15, 2, 34 sound_ret -Sfx_3f_Ch8: +Sfx_Bind_Ch8: noise_note 8, 15, -7, 50 noise_note 8, 15, 4, 67 noise_note 8, 15, 2, 84 noise_note 8, 15, 1, 101 sound_ret -Sfx_40_Ch8: +Sfx_VineWhip_Ch8: noise_note 1, 12, 2, 51 noise_note 2, 15, 2, 33 noise_note 1, 14, 2, 51 @@ -1027,52 +1027,52 @@ Sfx_40_Ch8: noise_note 8, 15, 2, 65 sound_ret -Sfx_41_Ch8: +Sfx_DoubleKick_Ch8: noise_note 1, 9, 4, 35 noise_note 1, 11, 4, 34 noise_note 8, 15, 1, 68 sound_ret -Sfx_42_Ch8: +Sfx_MegaKick_Ch8: noise_note 2, 9, 4, 51 noise_note 4, 11, 4, 34 noise_note 4, 15, 1, 68 noise_note 8, 15, 1, 85 sound_ret -Sfx_43_Ch8: +Sfx_Headbutt_Ch8: noise_note 4, 15, -7, 85 noise_note 8, 15, 1, 101 sound_ret -Sfx_44_Ch8: +Sfx_HornAttack_Ch8: noise_note 2, 8, 4, 67 noise_note 2, 12, 4, 34 noise_note 8, 15, 2, 52 sound_ret -Sfx_45_Ch8: +Sfx_Tackle_Ch8: noise_note 4, 15, 1, 52 noise_note 15, 15, 2, 100 sound_ret -Sfx_46_Ch8: +Sfx_PoisonSting_Ch8: noise_note 2, 15, 1, 34 noise_note 15, 15, 2, 18 sound_ret -Sfx_47_Ch8: +Sfx_Powder_Ch8: noise_note 2, 12, 2, 1 noise_note 15, 15, 4, 1 noise_note 15, 15, 2, 1 sound_ret -Sfx_48_Ch8: +Sfx_Doubleslap_Ch8: noise_note 8, 15, 1, 50 noise_note 8, 15, 1, 51 sound_ret -Sfx_49_Ch5: +Sfx_Bite_Ch5: duty_cycle 0 pitch_sweep 3, -2 square_note 4, 15, 2, 512 @@ -1081,26 +1081,26 @@ Sfx_49_Ch5: pitch_sweep 0, 8 sound_ret -Sfx_49_Ch8: +Sfx_Bite_Ch8: noise_note 0, 13, 1, 66 noise_note 4, 10, 1, 50 noise_note 0, 13, 1, 34 noise_note 6, 10, 1, 50 sound_ret -Sfx_4a_Ch8: +Sfx_JumpKick_Ch8: noise_note 3, 9, 2, 49 noise_note 3, 11, 2, 50 noise_note 3, 12, 2, 51 noise_note 8, 15, 1, 84 sound_ret -Sfx_4b_Ch8: +Sfx_Stomp_Ch8: noise_note 12, 15, 1, 84 noise_note 8, 15, 1, 100 sound_ret -Sfx_4c_Ch8: +Sfx_TailWhip_Ch8: noise_note 2, 15, 1, 51 noise_note 2, 12, 1, 50 noise_note 2, 10, 1, 49 @@ -1108,12 +1108,12 @@ Sfx_4c_Ch8: noise_note 8, 15, 1, 52 sound_ret -Sfx_4d_Ch8: +Sfx_KarateChop_Ch8: noise_note 2, 13, 2, 50 noise_note 15, 15, 2, 67 sound_ret -Sfx_4e_Ch8: +Sfx_Submission_Ch8: noise_note 2, 15, 2, 67 noise_note 4, 11, 5, 50 noise_note 9, 8, 6, 49 @@ -1121,19 +1121,19 @@ Sfx_4e_Ch8: noise_note 15, 15, 2, 85 sound_ret -Sfx_4f_Ch5: +Sfx_WaterGun_Ch5: duty_cycle 1 pitch_sweep 9, 7 square_note 15, 15, 2, 1792 pitch_sweep 0, 8 sound_ret -Sfx_4f_Ch8: +Sfx_WaterGun_Ch8: noise_note 15, 3, -7, 34 noise_note 15, 15, 2, 33 sound_ret -Sfx_50_Ch8: +Sfx_SwordsDance_Ch8: noise_note 15, 4, -7, 65 noise_note 8, 8, -7, 65 noise_note 8, 12, -7, 65 @@ -1141,7 +1141,7 @@ Sfx_50_Ch8: noise_note 15, 15, 2, 65 sound_ret -Sfx_51_Ch8: +Sfx_Thunder_Ch8: noise_note 10, 15, -7, 80 noise_note 15, 15, -7, 81 noise_note 8, 15, 2, 81 @@ -1151,7 +1151,7 @@ Sfx_51_Ch8: noise_note 15, 15, 2, 84 sound_ret -Sfx_52_Ch5: +Sfx_Supersonic_Ch5: duty_cycle 2 square_note 15, 3, -7, 1984 .loop @@ -1160,7 +1160,7 @@ Sfx_52_Ch5: square_note 15, 13, 1, 1984 sound_ret -Sfx_52_Ch6: +Sfx_Supersonic_Ch6: duty_cycle_pattern 2, 3, 0, 3 square_note 15, 2, -7, 1992 .loop @@ -1169,14 +1169,14 @@ Sfx_52_Ch6: square_note 15, 12, 1, 1992 sound_ret -Sfx_52_Ch8: +Sfx_Supersonic_Ch8: .loop noise_note 3, 9, 7, 18 noise_note 3, 10, 1, 17 sound_loop 10, .loop sound_ret -Sfx_53_Ch5: +Sfx_Leer_Ch5: .loop duty_cycle 0 square_note 0, 15, 1, 1984 @@ -1184,7 +1184,7 @@ Sfx_53_Ch5: sound_loop 12, .loop sound_ret -Sfx_53_Ch6: +Sfx_Leer_Ch6: .loop duty_cycle_pattern 2, 3, 0, 3 square_note 0, 14, 1, 1985 @@ -1192,14 +1192,14 @@ Sfx_53_Ch6: sound_loop 12, .loop sound_ret -Sfx_53_Ch8: +Sfx_Leer_Ch8: .loop noise_note 1, 13, 1, 73 noise_note 1, 13, 1, 41 sound_loop 6, .loop sound_ret -Sfx_54_Ch5: +Sfx_Ember_Ch5: .loop duty_cycle_pattern 3, 0, 2, 1 square_note 11, 15, 3, 288 @@ -1209,7 +1209,7 @@ Sfx_54_Ch5: square_note 15, 12, 2, 272 sound_ret -Sfx_54_Ch8: +Sfx_Ember_Ch8: .loop noise_note 10, 15, 3, 53 noise_note 14, 15, 6, 69 @@ -1219,7 +1219,7 @@ Sfx_54_Ch8: noise_note 15, 15, 4, 172 sound_ret -Sfx_55_Ch5: +Sfx_Bubblebeam_Ch5: .loop duty_cycle_pattern 0, 3, 2, 1 square_note 4, 15, 4, 1536 @@ -1230,7 +1230,7 @@ Sfx_55_Ch5: square_note 8, 13, 1, 1536 sound_ret -Sfx_55_Ch6: +Sfx_Bubblebeam_Ch6: .loop duty_cycle_pattern 2, 0, 3, 1 square_note 5, 14, 4, 1504 @@ -1240,7 +1240,7 @@ Sfx_55_Ch6: sound_loop 3, .loop sound_ret -Sfx_55_Ch8: +Sfx_Bubblebeam_Ch8: .loop noise_note 5, 12, 3, 51 noise_note 3, 9, 2, 67 @@ -1249,7 +1249,7 @@ Sfx_55_Ch8: sound_loop 2, .loop sound_ret -Sfx_56_Ch5: +Sfx_HydroPump_Ch5: .loop duty_cycle_pattern 3, 1, 0, 2 square_note 3, 8, 1, 768 @@ -1261,7 +1261,7 @@ Sfx_56_Ch5: square_note 8, 8, 1, 1024 sound_ret -Sfx_56_Ch8: +Sfx_HydroPump_Ch8: .loop noise_note 3, 6, 2, 34 noise_note 3, 10, 2, 50 @@ -1272,7 +1272,7 @@ Sfx_56_Ch8: noise_note 8, 8, 1, 18 sound_ret -Sfx_57_Ch5: +Sfx_Surf_Ch5: .loop duty_cycle_pattern 0, 3, 2, 1 square_note 15, 15, 4, 1280 @@ -1281,7 +1281,7 @@ Sfx_57_Ch5: sound_loop 3, .loop sound_ret -Sfx_57_Ch6: +Sfx_Surf_Ch6: .loop duty_cycle_pattern 2, 0, 3, 1 square_note 7, 14, 4, 1072 @@ -1290,7 +1290,7 @@ Sfx_57_Ch6: sound_loop 4, .loop sound_ret -Sfx_57_Ch8: +Sfx_Surf_Ch8: .loop noise_note 9, 15, 4, 68 noise_note 9, 15, 2, 67 @@ -1299,7 +1299,7 @@ Sfx_57_Ch8: sound_loop 3, .loop sound_ret -Sfx_58_Ch5: +Sfx_Psybeam_Ch5: .loop duty_cycle_pattern 2, 2, 0, 1 square_note 10, 15, 1, 1600 @@ -1309,7 +1309,7 @@ Sfx_58_Ch5: square_note 10, 15, 1, 1600 sound_ret -Sfx_58_Ch6: +Sfx_Psybeam_Ch6: .loop duty_cycle_pattern 2, 3, 0, 3 square_note 10, 15, 3, 1393 @@ -1319,14 +1319,14 @@ Sfx_58_Ch6: square_note 10, 15, 1, 1393 sound_ret -Sfx_58_Ch8: +Sfx_Psybeam_Ch8: .loop noise_note 2, 13, 1, 74 noise_note 2, 13, 2, 42 sound_loop 21, .loop sound_ret -Sfx_59_Ch5: +Sfx_Charge_Ch5: .loop duty_cycle 0 square_note 2, 15, 1, 512 @@ -1336,7 +1336,7 @@ Sfx_59_Ch5: sound_loop 8, .loop sound_ret -Sfx_59_Ch6: +Sfx_Charge_Ch6: .loop duty_cycle_pattern 2, 3, 0, 3 square_note 2, 14, 1, 770 @@ -1346,7 +1346,7 @@ Sfx_59_Ch6: sound_loop 8, .loop sound_ret -Sfx_59_Ch8: +Sfx_Charge_Ch8: .loop noise_note 2, 13, 3, 16 noise_note 3, 13, 3, 17 @@ -1355,7 +1355,7 @@ Sfx_59_Ch8: sound_loop 9, .loop sound_ret -Sfx_5a_Ch5: +Sfx_Thundershock_Ch5: .loop duty_cycle_pattern 0, 2, 2, 3 square_note 3, 15, 1, 2032 @@ -1363,7 +1363,7 @@ Sfx_5a_Ch5: sound_loop 8, .loop sound_ret -Sfx_5a_Ch6: +Sfx_Thundershock_Ch6: .loop duty_cycle_pattern 2, 3, 0, 3 square_note 4, 14, 2, 514 @@ -1371,14 +1371,14 @@ Sfx_5a_Ch6: sound_loop 9, .loop sound_ret -Sfx_5a_Ch8: +Sfx_Thundershock_Ch8: .loop noise_note 4, 15, -7, 67 noise_note 4, 15, 2, 68 sound_loop 9, .loop sound_ret -Sfx_5b_Ch5: +Sfx_Psychic_Ch5: duty_cycle 2 pitch_sweep 15, 7 square_note 8, 12, 4, 1981 @@ -1390,7 +1390,7 @@ Sfx_5b_Ch5: pitch_sweep 0, 8 sound_ret -Sfx_5b_Ch6: +Sfx_Psychic_Ch6: duty_cycle 2 square_note 8, 12, 4, 1904 square_note 8, 12, 4, 1889 @@ -1400,7 +1400,7 @@ Sfx_5b_Ch6: square_note 15, 15, 2, 1892 sound_ret -Sfx_5b_Ch8: +Sfx_Psychic_Ch8: noise_note 15, 3, -7, 20 noise_note 15, 12, -7, 19 noise_note 15, 12, -7, 18 @@ -1409,7 +1409,7 @@ Sfx_5b_Ch8: noise_note 15, 12, 2, 16 sound_ret -Sfx_5c_Ch5: +Sfx_Screech_Ch5: duty_cycle 2 square_note 15, 15, -7, 2016 square_note 15, 15, -7, 2016 @@ -1418,7 +1418,7 @@ Sfx_5c_Ch5: square_note 15, 15, 2, 2016 sound_ret -Sfx_5c_Ch6: +Sfx_Screech_Ch6: duty_cycle 3 square_note 15, 15, -7, 2018 square_note 15, 15, -7, 2017 @@ -1427,19 +1427,19 @@ Sfx_5c_Ch6: square_note 15, 15, 2, 2018 sound_ret -Sfx_5d_Ch5: +Sfx_BoneClub_Ch5: duty_cycle 2 pitch_sweep 10, -7 square_note 8, 15, 1, 1792 pitch_sweep 0, 8 sound_ret -Sfx_5d_Ch6: +Sfx_BoneClub_Ch6: duty_cycle 3 square_note 8, 15, 1, 1793 sound_ret -Sfx_5e_Ch5: +Sfx_Sharpen_Ch5: duty_cycle 2 square_note 6, 15, 1, 1280 square_note 6, 15, 1, 1408 @@ -1448,7 +1448,7 @@ Sfx_5e_Ch5: square_note 8, 15, 1, 1792 sound_ret -Sfx_5e_Ch6: +Sfx_Sharpen_Ch6: duty_cycle 3 square_note 6, 14, 1, 1296 square_note 6, 14, 1, 1424 @@ -1457,28 +1457,28 @@ Sfx_5e_Ch6: square_note 8, 14, 1, 1808 sound_ret -Sfx_5f_Ch5: +Sfx_EggBomb_Ch5: duty_cycle_pattern 3, 2, 3, 1 square_note 8, 15, -7, 1016 square_note 15, 15, -7, 1024 square_note 15, 15, 3, 1024 sound_ret -Sfx_5f_Ch6: +Sfx_EggBomb_Ch6: duty_cycle_pattern 2, 3, 1, 0 square_note 8, 14, -7, 960 square_note 15, 14, -7, 960 square_note 15, 14, 3, 960 sound_ret -Sfx_5f_Ch8: +Sfx_EggBomb_Ch8: noise_note 4, 15, -7, 81 noise_note 8, 15, -7, 84 noise_note 15, 15, -7, 85 noise_note 15, 15, 3, 86 sound_ret -Sfx_60_Ch5: +Sfx_Sing_Ch5: toggle_sfx vibrato 10, 2, 4 duty_cycle 2 @@ -1492,7 +1492,7 @@ Sfx_60_Ch5: note G_, 8 sound_ret -Sfx_60_Ch6: +Sfx_Sing_Ch6: toggle_sfx vibrato 10, 2, 3 duty_cycle 2 @@ -1507,7 +1507,7 @@ Sfx_60_Ch6: note G_, 8 sound_ret -Sfx_61_Ch5: +Sfx_HyperBeam_Ch5: duty_cycle 0 square_note 2, 15, 1, 1920 square_note 2, 15, 1, 1792 @@ -1527,7 +1527,7 @@ Sfx_61_Ch5: square_note 15, 15, 1, 1792 sound_ret -Sfx_61_Ch6: +Sfx_HyperBeam_Ch6: duty_cycle_pattern 2, 3, 0, 3 square_note 2, 15, 1, 1921 square_note 2, 15, 1, 1793 @@ -1547,14 +1547,14 @@ Sfx_61_Ch6: square_note 15, 15, 1, 1793 sound_ret -Sfx_61_Ch8: +Sfx_HyperBeam_Ch8: .loop noise_note 1, 13, 1, 73 noise_note 1, 13, 1, 41 sound_loop 26, .loop sound_ret -Sfx_28_Ch8: +Sfx_IntroLungeRG_Ch8: noise_note 6, 2, 0, 16 noise_note 6, 2, -7, 64 noise_note 6, 4, -7, 65 @@ -1565,21 +1565,21 @@ Sfx_28_Ch8: noise_note 15, 15, 2, 67 sound_ret -Sfx_29_Ch8: +Sfx_Unknown29_Ch8: noise_note 4, 13, 1, 65 sound_ret -Sfx_2a_Ch8: +Sfx_Unknown2a_Ch8: noise_note 4, 12, 1, 66 sound_ret -Sfx_2b_Ch8: +Sfx_IntroRaiseRG_Ch8: noise_note 2, 6, -7, 33 noise_note 2, 10, -7, 49 noise_note 15, 15, 2, 65 sound_ret -Sfx_2c_Ch8: +Sfx_IntroCrashRG_Ch8: noise_note 2, 13, 2, 50 noise_note 15, 15, 2, 67 sound_ret @@ -1592,14 +1592,14 @@ Sfx_TitleEntrance_Ch8: noise_note 15, 13, 2, 35 sound_ret -Sfx_2e_Ch5: +Sfx_SlotsStopWheel_Ch5: duty_cycle 2 square_note 1, 15, 2, 1696 square_note 1, 15, 2, 1760 square_note 8, 15, 1, 1792 sound_ret -Sfx_2f_Ch5: +Sfx_SlotsReward_Ch5: duty_cycle 2 square_note 2, 15, 1, 1792 square_note 8, 8, 1, 2016 diff --git a/audio/sfx_pointers.asm b/audio/sfx_pointers.asm index 5ef042f..86f5ebd 100644 --- a/audio/sfx_pointers.asm +++ b/audio/sfx_pointers.asm @@ -4,105 +4,105 @@ SECTION "audio/sfx_pointers.asm", ROMX SFX:: ; entries correspond to SFX_* constants - dba Sfx_00 + dba Sfx_BallWobble dba Sfx_Potion dba Sfx_FullHeal dba Sfx_Menu dba Sfx_ReadText dba Sfx_ReadText - dba Sfx_06 - dba Sfx_07 - dba Sfx_08 - dba Sfx_09 + dba Sfx_Poison + dba Sfx_TradeMachine dba Sfx_BootPC + dba Sfx_ShutDownPC + dba Sfx_ChoosePCOption dba Sfx_EscapeRope - dba Sfx_0c - dba Sfx_0d - dba Sfx_0e - dba Sfx_0f - dba Sfx_10 - dba Sfx_11 - dba Sfx_12 - dba Sfx_13 + dba Sfx_PressSwitch + dba Sfx_HealingMachine + dba Sfx_WarpTo + dba Sfx_TeleportEnter1 + dba Sfx_TeleportExit2 + dba Sfx_JumpOverLedge + dba Sfx_TeleportEnter2 + dba Sfx_Fly dba Sfx_Wrong - dba Sfx_15 - dba Sfx_16 - dba Sfx_17 - dba Sfx_18 - dba Sfx_19 - dba Sfx_1a + dba Sfx_ArrowTiles + dba Sfx_Strength + dba Sfx_Megaphone + dba Sfx_WithdrawDeposit + dba Sfx_CutRG + dba Sfx_GoInside dba Sfx_SwitchPokemon - dba Sfx_1c - dba Sfx_1d - dba Sfx_1e - dba Sfx_1f - dba Sfx_20 + dba Sfx_BellyDrum + dba Sfx_Purchase + dba Sfx_Collision + dba Sfx_GoOutside + dba Sfx_Save dba Sfx_Pokeflute - dba Sfx_22 - dba Sfx_23 - dba Sfx_24 - dba Sfx_25 - dba Sfx_26 + dba Sfx_SafariZonePA + dba Sfx_ThrowBall + dba Sfx_BallPoof + dba Sfx_Faint + dba Sfx_Run dba Sfx_PokedexRegistration - dba Sfx_28 - dba Sfx_29 - dba Sfx_2a - dba Sfx_2b - dba Sfx_2c + dba Sfx_IntroLungeRG + dba Sfx_Unknown29 + dba Sfx_Unknown2a + dba Sfx_IntroRaiseRG + dba Sfx_IntroCrashRG dba Sfx_TitleEntrance - dba Sfx_2e - dba Sfx_2f + dba Sfx_SlotsStopWheel + dba Sfx_SlotsReward dba Sfx_PayDay dba Sfx_GameFreakLogoRG - dba Sfx_32 - dba Sfx_33 - dba Sfx_34 - dba Sfx_35 - dba Sfx_36 - dba Sfx_37 - dba Sfx_38 - dba Sfx_39 - dba Sfx_3a - dba Sfx_3b - dba Sfx_3c - dba Sfx_3d - dba Sfx_3e - dba Sfx_3f - dba Sfx_40 - dba Sfx_41 - dba Sfx_42 - dba Sfx_43 - dba Sfx_44 - dba Sfx_45 - dba Sfx_46 - dba Sfx_47 - dba Sfx_48 - dba Sfx_49 - dba Sfx_4a - dba Sfx_4b - dba Sfx_4c - dba Sfx_4d - dba Sfx_4e - dba Sfx_4f - dba Sfx_50 - dba Sfx_51 - dba Sfx_52 - dba Sfx_53 - dba Sfx_54 - dba Sfx_55 - dba Sfx_56 - dba Sfx_57 - dba Sfx_58 - dba Sfx_59 - dba Sfx_5a - dba Sfx_5b - dba Sfx_5c - dba Sfx_5d - dba Sfx_5e - dba Sfx_5f - dba Sfx_60 - dba Sfx_61 - dba Sfx_62 + dba Sfx_Peck + dba Sfx_Kinesis + dba Sfx_Lick + dba Sfx_Pound + dba Sfx_Thrash + dba Sfx_CometPunch + dba Sfx_MegaPunch + dba Sfx_Scratch + dba Sfx_ViceGrip + dba Sfx_RazorWind + dba Sfx_Cut + dba Sfx_WingAttack + dba Sfx_Whirlwind + dba Sfx_Bind + dba Sfx_VineWhip + dba Sfx_DoubleKick + dba Sfx_MegaKick + dba Sfx_Headbutt + dba Sfx_HornAttack + dba Sfx_Tackle + dba Sfx_PoisonSting + dba Sfx_Powder + dba Sfx_Doubleslap + dba Sfx_Bite + dba Sfx_JumpKick + dba Sfx_Stomp + dba Sfx_TailWhip + dba Sfx_KarateChop + dba Sfx_Submission + dba Sfx_WaterGun + dba Sfx_SwordsDance + dba Sfx_Thunder + dba Sfx_Supersonic + dba Sfx_Leer + dba Sfx_Ember + dba Sfx_Bubblebeam + dba Sfx_HydroPump + dba Sfx_Surf + dba Sfx_Psybeam + dba Sfx_Charge + dba Sfx_Thundershock + dba Sfx_Psychic + dba Sfx_Screech + dba Sfx_BoneClub + dba Sfx_Sharpen + dba Sfx_EggBomb + dba Sfx_Sing + dba Sfx_HyperBeam + dba Sfx_Shine dba Sfx_GetItemRG dba Sfx_UnusedFanfare1 dba Sfx_PokedexEvaluationRG diff --git a/constants.asm b/constants.asm index cd5a022..1beb2ac 100644 --- a/constants.asm +++ b/constants.asm @@ -16,6 +16,7 @@ INCLUDE "macros/maps.asm" INCLUDE "macros/battle_commands.asm" INCLUDE "macros/oam_anims.asm" +INCLUDE "macros/battle_anims.asm" INCLUDE "macros/asserts.asm" INCLUDE "constants/audio_constants.asm" diff --git a/constants/battle_anim_constants.asm b/constants/battle_anim_constants.asm index 1a887f1..fda7096 100644 --- a/constants/battle_anim_constants.asm +++ b/constants/battle_anim_constants.asm @@ -2,11 +2,11 @@ const_def const BATTLEANIMSTRUCT_INDEX const BATTLEANIMSTRUCT_OAMFLAGS - const BATTLEANIMSTRUCT_02 + const BATTLEANIMSTRUCT_FIX_Y const BATTLEANIMSTRUCT_FRAMESET_ID const BATTLEANIMSTRUCT_FUNCTION - const BATTLEANIMSTRUCT_PALETTE const BATTLEANIMSTRUCT_TILEID +DEF BATTLEANIMOBJ_LENGTH EQU const_value - 1 const BATTLEANIMSTRUCT_XCOORD const BATTLEANIMSTRUCT_YCOORD const BATTLEANIMSTRUCT_XOFFSET @@ -17,741 +17,730 @@ const BATTLEANIMSTRUCT_JUMPTABLE_INDEX const BATTLEANIMSTRUCT_VAR1 const BATTLEANIMSTRUCT_VAR2 - const_skip 7 DEF BATTLEANIMSTRUCT_LENGTH EQU const_value +DEF NUM_BATTLE_ANIM_STRUCTS EQU 10 ; see wActiveAnimObjects + +DEF BATTLEANIMSTRUCT_OAMFLAGS_FIX_COORDS_F EQU 0 + +; wBattleAnimTileDict size (see wram.asm) +DEF NUM_BATTLEANIMTILEDICT_ENTRIES EQU 5 + +; Start tile for battle animation graphics +DEF BATTLEANIM_BASE_TILE EQU 7 * 7 ; Maximum size of a pokemon picture ; BattleAnimObjects indexes (see data/battle_anims/objects.asm) const_def - const ANIM_OBJ_00 - const ANIM_OBJ_01 - const ANIM_OBJ_02 - const ANIM_OBJ_03 - const ANIM_OBJ_04 - const ANIM_OBJ_05 - const ANIM_OBJ_06 - const ANIM_OBJ_07 - const ANIM_OBJ_08 - const ANIM_OBJ_FANG - const ANIM_OBJ_0A - const ANIM_OBJ_EMBER - const ANIM_OBJ_DRAGON_RAGE - const ANIM_OBJ_FLAMETHROWER - const ANIM_OBJ_FIRE_SPIN - const ANIM_OBJ_FIRE_BLAST - const ANIM_OBJ_BURNED - const ANIM_OBJ_BLIZZARD - const ANIM_OBJ_12 - const ANIM_OBJ_ICE_BEAM - const ANIM_OBJ_RAZOR_LEAF - const ANIM_OBJ_POKE_BALL - const ANIM_OBJ_POKE_BALL_BLOCKED - const ANIM_OBJ_17 - const ANIM_OBJ_18 - const ANIM_OBJ_19 - const ANIM_OBJ_1A - const ANIM_OBJ_1B - const ANIM_OBJ_BALL_POOF - const ANIM_OBJ_BIG_ROCK - const ANIM_OBJ_SMALL_ROCK - const ANIM_OBJ_STRENGTH - const ANIM_OBJ_SEISMIC_TOSS - const ANIM_OBJ_BUBBLE - const ANIM_OBJ_SURF - const ANIM_OBJ_SING - const ANIM_OBJ_WATER_GUN - const ANIM_OBJ_HYDRO_PUMP - const ANIM_OBJ_POWDER - const ANIM_OBJ_27 - const ANIM_OBJ_28 - const ANIM_OBJ_ICE_BUILDUP - const ANIM_OBJ_FROZEN - const ANIM_OBJ_MASTER_BALL_SPARKLE - const ANIM_OBJ_RECOVER - const ANIM_OBJ_2D - const ANIM_OBJ_2E - const ANIM_OBJ_2F - const ANIM_OBJ_THUNDER_WAVE - const ANIM_OBJ_31 - const ANIM_OBJ_LIGHTNING_BOLT - const ANIM_OBJ_33 - const ANIM_OBJ_34 - const ANIM_OBJ_CLAMP - const ANIM_OBJ_BITE - const ANIM_OBJ_37 - const ANIM_OBJ_38 - const ANIM_OBJ_39 - const ANIM_OBJ_3A - const ANIM_OBJ_3B - const ANIM_OBJ_3C - const ANIM_OBJ_3D - const ANIM_OBJ_GUST - const ANIM_OBJ_3F - const ANIM_OBJ_40 - const ANIM_OBJ_41 - const ANIM_OBJ_42 - const ANIM_OBJ_SONICBOOM_JP - const ANIM_OBJ_44 - const ANIM_OBJ_ABSORB - const ANIM_OBJ_EGG - const ANIM_OBJ_47 - const ANIM_OBJ_48 - const ANIM_OBJ_49 - const ANIM_OBJ_LEECH_SEED - const ANIM_OBJ_4B - const ANIM_OBJ_WAVE - const ANIM_OBJ_CONFUSE_RAY - const ANIM_OBJ_4E - const ANIM_OBJ_4F - const ANIM_OBJ_SCREEN - const ANIM_OBJ_HARDEN - const ANIM_OBJ_CHICK - const ANIM_OBJ_AMNESIA - const ANIM_OBJ_ASLEEP - const ANIM_OBJ_SKULL - const ANIM_OBJ_56 - const ANIM_OBJ_57 - const ANIM_OBJ_58 - const ANIM_OBJ_PARALYZED - const ANIM_OBJ_STRING_SHOT - const ANIM_OBJ_HAZE - const ANIM_OBJ_MIST - const ANIM_OBJ_SMOG - const ANIM_OBJ_POISON_GAS - const ANIM_OBJ_HORN - const ANIM_OBJ_60 - const ANIM_OBJ_PETAL_DANCE - const ANIM_OBJ_SLUDGE_BOMB - const ANIM_OBJ_PAY_DAY - const ANIM_OBJ_64 - const ANIM_OBJ_MIMIC - const ANIM_OBJ_ATTRACT - const ANIM_OBJ_BONEMERANG - const ANIM_OBJ_BONE_CLUB - const ANIM_OBJ_BONE_RUSH - const ANIM_OBJ_SWIFT - const ANIM_OBJ_KINESIS - const ANIM_OBJ_FLASH - const ANIM_OBJ_SHINY - const ANIM_OBJ_SKY_ATTACK - const ANIM_OBJ_LICK - const ANIM_OBJ_WITHDRAW - const ANIM_OBJ_71 - const ANIM_OBJ_GROWTH - const ANIM_OBJ_CONVERSION2 - const ANIM_OBJ_SMOKE - const ANIM_OBJ_SMOKESCREEN - const ANIM_OBJ_SWORDS_DANCE - const ANIM_OBJ_SPEED_LINE - const ANIM_OBJ_SHARPEN - const ANIM_OBJ_DEFENSE_CURL - const ANIM_OBJ_7A - const ANIM_OBJ_7B - const ANIM_OBJ_DISABLE - const ANIM_OBJ_AGILITY - const ANIM_OBJ_HEART - const ANIM_OBJ_FLAME_WHEEL - const ANIM_OBJ_SACRED_FIRE - const ANIM_OBJ_COTTON_SPORE - const ANIM_OBJ_MILK_DRINK - const ANIM_OBJ_ANGER - const ANIM_OBJ_84 - const ANIM_OBJ_85 - const ANIM_OBJ_BATON_PASS - const ANIM_OBJ_LOCK_ON - const ANIM_OBJ_MIND_READER - const ANIM_OBJ_SAFEGUARD - const ANIM_OBJ_PROTECT - const ANIM_OBJ_THIEF - const ANIM_OBJ_OCTAZOOKA - const ANIM_OBJ_PRESENT - const ANIM_OBJ_SPIKES - const ANIM_OBJ_POWDER_SNOW - const ANIM_OBJ_DRAGONBREATH - const ANIM_OBJ_CONVERSION - const ANIM_OBJ_SPIDER_WEB - const ANIM_OBJ_93 - const ANIM_OBJ_NIGHTMARE - const ANIM_OBJ_IN_NIGHTMARE - const ANIM_OBJ_LOVELY_KISS - const ANIM_OBJ_SWEET_KISS - const ANIM_OBJ_SKETCH - const ANIM_OBJ_99 - const ANIM_OBJ_9A - const ANIM_OBJ_DESTINY_BOND - const ANIM_OBJ_MORNING_SUN - const ANIM_OBJ_GLIMMER - const ANIM_OBJ_MOONLIGHT - const ANIM_OBJ_HIDDEN_POWER - const ANIM_OBJ_A0 - const ANIM_OBJ_A1 - const ANIM_OBJ_SANDSTORM - const ANIM_OBJ_ZAP_CANNON - const ANIM_OBJ_SPITE - const ANIM_OBJ_CURSE - const ANIM_OBJ_PERISH_SONG - const ANIM_OBJ_FORESIGHT - const ANIM_OBJ_RAPID_SPIN - const ANIM_OBJ_SWAGGER - const ANIM_OBJ_AA - const ANIM_OBJ_AB - const ANIM_OBJ_MEAN_LOOK - const ANIM_OBJ_AD - const ANIM_OBJ_AE - const ANIM_OBJ_RAIN - const ANIM_OBJ_B0 - const ANIM_OBJ_PSYCH_UP - const ANIM_OBJ_ANCIENTPOWER - const ANIM_OBJ_AEROBLAST - const ANIM_OBJ_SHADOW_BALL - const ANIM_OBJ_ROCK_SMASH - const ANIM_OBJ_FLOWER - const ANIM_OBJ_COTTON - -DEF const_value = $b1 - const ANIM_OBJ_PLAYERFEETFOLLOW - const ANIM_OBJ_ENEMYFEETFOLLOW - const ANIM_OBJ_PLAYERHEADFOLLOW - const ANIM_OBJ_ENEMYHEADFOLLOW + const BATTLE_ANIM_OBJ_HIT_BIG_YFIX ; 00 + const BATTLE_ANIM_OBJ_HIT_YFIX ; 01 + const BATTLE_ANIM_OBJ_HIT_SMALL_YFIX ; 02 + const BATTLE_ANIM_OBJ_HIT_BIG ; 03 + const BATTLE_ANIM_OBJ_HIT ; 04 + const BATTLE_ANIM_OBJ_HIT_SMALL ; 05 + const BATTLE_ANIM_OBJ_PUNCH ; 06 + const BATTLE_ANIM_OBJ_KICK ; 07 + const BATTLE_ANIM_OBJ_PALM ; 08 + const BATTLE_ANIM_OBJ_FANG ; 09 + const BATTLE_ANIM_OBJ_PUNCH_SHAKE ; 0a + const BATTLE_ANIM_OBJ_EMBER ; 0b + const BATTLE_ANIM_OBJ_DRAGON_RAGE ; 0c + const BATTLE_ANIM_OBJ_FLAMETHROWER ; 0d + const BATTLE_ANIM_OBJ_FIRE_SPIN ; 0e + const BATTLE_ANIM_OBJ_FIRE_BLAST ; 0f + const BATTLE_ANIM_OBJ_BURNED ; 10 + const BATTLE_ANIM_OBJ_BLIZZARD ; 11 + const BATTLE_ANIM_OBJ_ICE ; 12 + const BATTLE_ANIM_OBJ_ICE_BEAM ; 13 + const BATTLE_ANIM_OBJ_RAZOR_LEAF ; 14 + const BATTLE_ANIM_OBJ_POKE_BALL ; 15 + const BATTLE_ANIM_OBJ_POKE_BALL_BLOCKED ; 16 + const BATTLE_ANIM_OBJ_EXPLOSION1 ; 17 + const BATTLE_ANIM_OBJ_EXPLOSION2 ; 18 + const BATTLE_ANIM_OBJ_ACID ; 19 + const BATTLE_ANIM_OBJ_SLUDGE ; 1a + const BATTLE_ANIM_OBJ_BETA_BALL_POOF ; 1b + const BATTLE_ANIM_OBJ_BALL_POOF ; 1c + const BATTLE_ANIM_OBJ_BIG_ROCK ; 1d + const BATTLE_ANIM_OBJ_SMALL_ROCK ; 1e + const BATTLE_ANIM_OBJ_STRENGTH ; 1f + const BATTLE_ANIM_OBJ_SEISMIC_TOSS ; 20 + const BATTLE_ANIM_OBJ_BUBBLE ; 21 + const BATTLE_ANIM_OBJ_SURF ; 22 + const BATTLE_ANIM_OBJ_SING ; 23 + const BATTLE_ANIM_OBJ_WATER_GUN ; 24 + const BATTLE_ANIM_OBJ_HYDRO_PUMP ; 25 + const BATTLE_ANIM_OBJ_POWDER ; 26 + const BATTLE_ANIM_OBJ_BEAM ; 27 + const BATTLE_ANIM_OBJ_BEAM_TIP ; 28 + const BATTLE_ANIM_OBJ_ICE_BUILDUP ; 29 + const BATTLE_ANIM_OBJ_FROZEN ; 2a + const BATTLE_ANIM_OBJ_MASTER_BALL_SPARKLE ; 2b + const BATTLE_ANIM_OBJ_RECOVER ; 2c + const BATTLE_ANIM_OBJ_THUNDER_CENTER ; 2d + const BATTLE_ANIM_OBJ_THUNDER_LEFT ; 2e + const BATTLE_ANIM_OBJ_THUNDER_RIGHT ; 2f + const BATTLE_ANIM_OBJ_THUNDER_WAVE ; 30 + const BATTLE_ANIM_OBJ_SPARKS_CIRCLE_BIG ; 31 + const BATTLE_ANIM_OBJ_THUNDERBOLT_BALL ; 32 + const BATTLE_ANIM_OBJ_SPARKS_CIRCLE ; 33 + const BATTLE_ANIM_OBJ_THUNDERSHOCK_BALL ; 34 + const BATTLE_ANIM_OBJ_CLAMP ; 35 + const BATTLE_ANIM_OBJ_BITE ; 36 + const BATTLE_ANIM_OBJ_CUT_DOWN_LEFT ; 37 + const BATTLE_ANIM_OBJ_CUT_DOWN_RIGHT ; 38 + const BATTLE_ANIM_OBJ_CUT_UP_RIGHT ; 39 + const BATTLE_ANIM_OBJ_CUT_LONG_DOWN_LEFT ; 3a + const BATTLE_ANIM_OBJ_CUT_LONG_DOWN_RIGHT ; 3b + const BATTLE_ANIM_OBJ_SOLAR_BEAM_CHARGE ; 3c + const BATTLE_ANIM_OBJ_ABSORB_CENTER ; 3d + const BATTLE_ANIM_OBJ_GUST ; 3e + const BATTLE_ANIM_OBJ_VINE_WHIP1 ; 3f + const BATTLE_ANIM_OBJ_VINE_WHIP2 ; 40 + const BATTLE_ANIM_OBJ_RAZOR_WIND1 ; 41 + const BATTLE_ANIM_OBJ_RAZOR_WIND2 ; 42 + const BATTLE_ANIM_OBJ_SONICBOOM ; 43 + const BATTLE_ANIM_OBJ_WARP ; 44 + const BATTLE_ANIM_OBJ_ABSORB ; 45 + const BATTLE_ANIM_OBJ_EGG ; 46 + const BATTLE_ANIM_OBJ_FOCUS ; 47 + const BATTLE_ANIM_OBJ_BIND1 ; 48 + const BATTLE_ANIM_OBJ_BIND2 ; 49 + const BATTLE_ANIM_OBJ_LEECH_SEED ; 4a + const BATTLE_ANIM_OBJ_SOUND ; 4b + const BATTLE_ANIM_OBJ_WAVE ; 4c + const BATTLE_ANIM_OBJ_CONFUSE_RAY ; 4d + const BATTLE_ANIM_OBJ_LEER ; 4e + const BATTLE_ANIM_OBJ_LEER_TIP ; 4f + const BATTLE_ANIM_OBJ_SCREEN ; 50 + const BATTLE_ANIM_OBJ_HARDEN ; 51 + const BATTLE_ANIM_OBJ_CHICK ; 52 + const BATTLE_ANIM_OBJ_AMNESIA ; 53 + const BATTLE_ANIM_OBJ_ASLEEP ; 54 + const BATTLE_ANIM_OBJ_SKULL ; 55 + const BATTLE_ANIM_OBJ_DIG_SAND ; 56 + const BATTLE_ANIM_OBJ_DIG_PILE ; 57 + const BATTLE_ANIM_OBJ_SAND ; 58 + const BATTLE_ANIM_OBJ_PARALYZED ; 59 + const BATTLE_ANIM_OBJ_STRING_SHOT ; 5a + const BATTLE_ANIM_OBJ_HAZE ; 5b + const BATTLE_ANIM_OBJ_MIST ; 5c + const BATTLE_ANIM_OBJ_SMOG ; 5d + const BATTLE_ANIM_OBJ_POISON_GAS ; 5e + const BATTLE_ANIM_OBJ_HORN ; 5f + const BATTLE_ANIM_OBJ_NEEDLE ; 60 + const BATTLE_ANIM_OBJ_PETAL_DANCE ; 61 + const BATTLE_ANIM_OBJ_SLUDGE_BOMB ; 62 + const BATTLE_ANIM_OBJ_PAY_DAY ; 63 + const BATTLE_ANIM_OBJ_COIN_HURL ; 64 + const BATTLE_ANIM_OBJ_MIMIC ; 65 + const BATTLE_ANIM_OBJ_ATTRACT ; 66 + const BATTLE_ANIM_OBJ_BONEMERANG ; 67 + const BATTLE_ANIM_OBJ_BONE_CLUB ; 68 + const BATTLE_ANIM_OBJ_BONE_RUSH ; 69 + const BATTLE_ANIM_OBJ_SWIFT ; 6a + const BATTLE_ANIM_OBJ_KINESIS ; 6b + const BATTLE_ANIM_OBJ_FLASH ; 6c + const BATTLE_ANIM_OBJ_SHINY ; 6d + const BATTLE_ANIM_OBJ_SKY_ATTACK ; 6e + const BATTLE_ANIM_OBJ_LICK ; 6f + const BATTLE_ANIM_OBJ_WITHDRAW ; 70 + const BATTLE_ANIM_OBJ_DRAIN ; 71 + const BATTLE_ANIM_OBJ_GROWTH ; 72 + const BATTLE_ANIM_OBJ_CONVERSION ; 73 + const BATTLE_ANIM_OBJ_SMOKE ; 74 + const BATTLE_ANIM_OBJ_SMOKESCREEN ; 75 + const BATTLE_ANIM_OBJ_SWORDS_DANCE ; 76 + const BATTLE_ANIM_OBJ_SPEED_LINE ; 77 + const BATTLE_ANIM_OBJ_SHARPEN ; 78 + const BATTLE_ANIM_OBJ_DEFENSE_CURL ; 79 + const BATTLE_ANIM_OBJ_METRONOME_HAND ; 7a + const BATTLE_ANIM_OBJ_METRONOME_SPARKLE ; 7b + const BATTLE_ANIM_OBJ_DISABLE ; 7c + const BATTLE_ANIM_OBJ_AGILITY ; 7d + const BATTLE_ANIM_OBJ_HEART ; 7e + const BATTLE_ANIM_OBJ_FLAME_WHEEL ; 7f + const BATTLE_ANIM_OBJ_SACRED_FIRE ; 80 + const BATTLE_ANIM_OBJ_COTTON_SPORE ; 81 + const BATTLE_ANIM_OBJ_MILK_DRINK ; 82 + const BATTLE_ANIM_OBJ_ANGER ; 83 + const BATTLE_ANIM_OBJ_BELL_CHIME ; 84 + const BATTLE_ANIM_OBJ_BELL_CHIME_NOTE ; 85 + const BATTLE_ANIM_OBJ_BATON_PASS ; 86 + const BATTLE_ANIM_OBJ_LOCK_ON ; 87 + const BATTLE_ANIM_OBJ_MIND_READER ; 88 + const BATTLE_ANIM_OBJ_SAFEGUARD ; 89 + const BATTLE_ANIM_OBJ_MEGAPHONE ; 8a + const BATTLE_ANIM_OBJ_PROTECT ; 8b + const BATTLE_ANIM_OBJ_THIEF ; 8c + const BATTLE_ANIM_OBJ_OCTAZOOKA ; 8d + const BATTLE_ANIM_OBJ_PRESENT ; 8e + const BATTLE_ANIM_OBJ_SPIKES ; 8f + const BATTLE_ANIM_OBJ_POWDER_SNOW ; 90 + const BATTLE_ANIM_OBJ_DRAGONBREATH ; 91 + const BATTLE_ANIM_OBJ_CONVERSION2 ; 92 + const BATTLE_ANIM_OBJ_SPIDER_WEB ; 93 + const BATTLE_ANIM_OBJ_CAKE_TEMPT ; 94 + const BATTLE_ANIM_OBJ_NIGHTMARE ; 95 + const BATTLE_ANIM_OBJ_IN_NIGHTMARE ; 96 + const BATTLE_ANIM_OBJ_LOVELY_KISS ; 97 + const BATTLE_ANIM_OBJ_SWEET_KISS ; 98 + const BATTLE_ANIM_OBJ_SKETCH ; 99 + const BATTLE_ANIM_OBJ_ENCORE_HAND ; 9a + const BATTLE_ANIM_OBJ_ENCORE_STAR ; 9b + const BATTLE_ANIM_OBJ_DESTINY_BOND ; 9c + const BATTLE_ANIM_OBJ_MORNING_SUN ; 9d + const BATTLE_ANIM_OBJ_GLIMMER ; 9e + const BATTLE_ANIM_OBJ_MOONLIGHT ; 9f + const BATTLE_ANIM_OBJ_HIDDEN_POWER ; a0 + const BATTLE_ANIM_OBJ_CROSS_CUTTER1 ; a1 + const BATTLE_ANIM_OBJ_CROSS_CUTTER2 ; a2 + const BATTLE_ANIM_OBJ_SANDSTORM ; a3 + const BATTLE_ANIM_OBJ_ZAP_CANNON ; a4 + const BATTLE_ANIM_OBJ_SPITE ; a5 + const BATTLE_ANIM_OBJ_NAIL_DOWN ; a6 + const BATTLE_ANIM_OBJ_PERISH_SONG ; a7 + const BATTLE_ANIM_OBJ_FORESIGHT ; a8 + const BATTLE_ANIM_OBJ_RAPID_SPIN ; a9 + const BATTLE_ANIM_OBJ_SWAGGER ; aa + const BATTLE_ANIM_OBJ_BELLY_DRUM_HAND ; ab + const BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE ; ac + const BATTLE_ANIM_OBJ_STALKER ; ad + const BATTLE_ANIM_OBJ_BETA_PURSUIT ; ae + const BATTLE_ANIM_OBJ_SHOOTING_SPARKLE ; af + const BATTLE_ANIM_OBJ_RAIN ; b0 + const BATTLE_ANIM_OBJ_ENEMYFEET_1ROW ; b1 + const BATTLE_ANIM_OBJ_PLAYERHEAD_1ROW ; b2 + const BATTLE_ANIM_OBJ_ENEMYFEET_2ROW ; b3 + const BATTLE_ANIM_OBJ_PLAYERHEAD_2ROW ; b4 +DEF NUM_BATTLE_ANIM_OBJS EQU const_value ; DoBattleAnimFrame arguments (see engine/battle_anims/functions.asm) const_def - const BATTLEANIMFUNC_00 - const BATTLEANIMFUNC_01 - const BATTLEANIMFUNC_02 - const BATTLEANIMFUNC_03 - const BATTLEANIMFUNC_04 - const BATTLEANIMFUNC_05 - const BATTLEANIMFUNC_06 - const BATTLEANIMFUNC_07 - const BATTLEANIMFUNC_08 - const BATTLEANIMFUNC_09 - const BATTLEANIMFUNC_0A - const BATTLEANIMFUNC_RAZOR_LEAF - const BATTLEANIMFUNC_0C - const BATTLEANIMFUNC_0D - const BATTLEANIMFUNC_0E - const BATTLEANIMFUNC_0F - const BATTLEANIMFUNC_10 - const BATTLEANIMFUNC_11 - const BATTLEANIMFUNC_12 - const BATTLEANIMFUNC_13 - const BATTLEANIMFUNC_14 - const BATTLEANIMFUNC_15 - const BATTLEANIMFUNC_16 - const BATTLEANIMFUNC_17 - const BATTLEANIMFUNC_18 - const BATTLEANIMFUNC_19 - const BATTLEANIMFUNC_1A - const BATTLEANIMFUNC_1B - const BATTLEANIMFUNC_1C - const BATTLEANIMFUNC_1D - const BATTLEANIMFUNC_1E - const BATTLEANIMFUNC_1F - const BATTLEANIMFUNC_LEECH_SEED - const BATTLEANIMFUNC_21 - const BATTLEANIMFUNC_22 - const BATTLEANIMFUNC_23 - const BATTLEANIMFUNC_24 - const BATTLEANIMFUNC_25 - const BATTLEANIMFUNC_26 - const BATTLEANIMFUNC_27 - const BATTLEANIMFUNC_28 - const BATTLEANIMFUNC_SPRIAL_DESCENT - const BATTLEANIMFUNC_POISON_GAS - const BATTLEANIMFUNC_HORN - const BATTLEANIMFUNC_2C - const BATTLEANIMFUNC_2D - const BATTLEANIMFUNC_2E - const BATTLEANIMFUNC_2F - const BATTLEANIMFUNC_30 - const BATTLEANIMFUNC_31 - const BATTLEANIMFUNC_32 - const BATTLEANIMFUNC_33 - const BATTLEANIMFUNC_34 - const BATTLEANIMFUNC_35 - const BATTLEANIMFUNC_36 - const BATTLEANIMFUNC_37 - const BATTLEANIMFUNC_38 - const BATTLEANIMFUNC_39 - const BATTLEANIMFUNC_3A - const BATTLEANIMFUNC_3B - const BATTLEANIMFUNC_3C - const BATTLEANIMFUNC_3D - const BATTLEANIMFUNC_3E - const BATTLEANIMFUNC_3F - const BATTLEANIMFUNC_40 - const BATTLEANIMFUNC_41 - const BATTLEANIMFUNC_42 - const BATTLEANIMFUNC_43 - const BATTLEANIMFUNC_44 - const BATTLEANIMFUNC_45 - const BATTLEANIMFUNC_46 - const BATTLEANIMFUNC_47 - const BATTLEANIMFUNC_48 - const BATTLEANIMFUNC_49 - const BATTLEANIMFUNC_4A - const BATTLEANIMFUNC_4B - const BATTLEANIMFUNC_4C - const BATTLEANIMFUNC_4D - const BATTLEANIMFUNC_4E - const BATTLEANIMFUNC_4F + const BATTLE_ANIM_FUNC_NULL ; 00 + const BATTLE_ANIM_FUNC_USER_TO_TARGET ; 01 + const BATTLE_ANIM_FUNC_USER_TO_TARGET_DISAPPEAR ; 02 + const BATTLE_ANIM_FUNC_MOVE_IN_CIRCLE ; 03 + const BATTLE_ANIM_FUNC_WAVE_TO_TARGET ; 04 + const BATTLE_ANIM_FUNC_THROW_TO_TARGET ; 05 + const BATTLE_ANIM_FUNC_THROW_TO_TARGET_DISAPPEAR ; 06 + const BATTLE_ANIM_FUNC_DROP ; 07 + const BATTLE_ANIM_FUNC_USER_TO_TARGET_SPIN ; 08 + const BATTLE_ANIM_FUNC_SHAKE ; 09 + const BATTLE_ANIM_FUNC_FIRE_BLAST ; 0a + const BATTLE_ANIM_FUNC_RAZOR_LEAF ; 0b + const BATTLE_ANIM_FUNC_BUBBLE ; 0c + const BATTLE_ANIM_FUNC_SURF ; 0d + const BATTLE_ANIM_FUNC_SING ; 0e + const BATTLE_ANIM_FUNC_WATER_GUN ; 0f + const BATTLE_ANIM_FUNC_EMBER ; 10 + const BATTLE_ANIM_FUNC_POWDER ; 11 + const BATTLE_ANIM_FUNC_POKEBALL ; 12 + const BATTLE_ANIM_FUNC_POKEBALL_BLOCKED ; 13 + const BATTLE_ANIM_FUNC_RECOVER ; 14 + const BATTLE_ANIM_FUNC_THUNDER_WAVE ; 15 + const BATTLE_ANIM_FUNC_CLAMP_ENCORE ; 16 + const BATTLE_ANIM_FUNC_BITE ; 17 + const BATTLE_ANIM_FUNC_SOLAR_BEAM ; 18 + const BATTLE_ANIM_FUNC_GUST ; 19 + const BATTLE_ANIM_FUNC_RAZOR_WIND ; 1a + const BATTLE_ANIM_FUNC_KICK ; 1b + const BATTLE_ANIM_FUNC_ABSORB ; 1c + const BATTLE_ANIM_FUNC_EGG ; 1d + const BATTLE_ANIM_FUNC_MOVE_UP ; 1e + const BATTLE_ANIM_FUNC_WRAP ; 1f + const BATTLE_ANIM_FUNC_LEECH_SEED ; 20 + const BATTLE_ANIM_FUNC_SOUND ; 21 + const BATTLE_ANIM_FUNC_CONFUSE_RAY ; 22 + const BATTLE_ANIM_FUNC_DIZZY ; 23 + const BATTLE_ANIM_FUNC_AMNESIA ; 24 + const BATTLE_ANIM_FUNC_FLOAT_UP ; 25 + const BATTLE_ANIM_FUNC_DIG ; 26 + const BATTLE_ANIM_FUNC_STRING ; 27 + const BATTLE_ANIM_FUNC_PARALYZED ; 28 + const BATTLE_ANIM_FUNC_SPIRAL_DESCENT ; 29 + const BATTLE_ANIM_FUNC_POISON_GAS ; 2a + const BATTLE_ANIM_FUNC_HORN ; 2b + const BATTLE_ANIM_FUNC_NEEDLE ; 2c + const BATTLE_ANIM_FUNC_PETAL_DANCE ; 2d + const BATTLE_ANIM_FUNC_THIEF_PAYDAY ; 2e + const BATTLE_ANIM_FUNC_ABSORB_CIRCLE ; 2f + const BATTLE_ANIM_FUNC_BONEMERANG ; 30 + const BATTLE_ANIM_FUNC_SHINY ; 31 + const BATTLE_ANIM_FUNC_SKY_ATTACK ; 32 + const BATTLE_ANIM_FUNC_GROWTH_SWORDS_DANCE ; 33 + const BATTLE_ANIM_FUNC_SMOKE_FLAME_WHEEL ; 34 + const BATTLE_ANIM_FUNC_PRESENT_SMOKESCREEN ; 35 + const BATTLE_ANIM_FUNC_STRENGTH_SEISMIC_TOSS ; 36 + const BATTLE_ANIM_FUNC_SPEED_LINE ; 37 + const BATTLE_ANIM_FUNC_SLUDGE ; 38 + const BATTLE_ANIM_FUNC_METRONOME_HAND ; 39 + const BATTLE_ANIM_FUNC_METRONOME_SPARKLE_SKETCH ; 3a + const BATTLE_ANIM_FUNC_AGILITY ; 3b + const BATTLE_ANIM_FUNC_SACRED_FIRE ; 3c + const BATTLE_ANIM_FUNC_SAFEGUARD_PROTECT ; 3d + const BATTLE_ANIM_FUNC_LOCK_ON_MIND_READER ; 3e + const BATTLE_ANIM_FUNC_SPIKES ; 3f + const BATTLE_ANIM_FUNC_BELL_CHIME_NOTES ; 40 + const BATTLE_ANIM_FUNC_BATON_PASS ; 41 + const BATTLE_ANIM_FUNC_CONVERSION2 ; 42 + const BATTLE_ANIM_FUNC_ENCORE_BELLY_DRUM ; 43 + const BATTLE_ANIM_FUNC_SWAGGER_MORNING_SUN ; 44 + const BATTLE_ANIM_FUNC_HIDDEN_POWER ; 45 + const BATTLE_ANIM_FUNC_NAIL_DOWN ; 46 + const BATTLE_ANIM_FUNC_PERISH_SONG ; 47 + const BATTLE_ANIM_FUNC_RAPID_SPIN ; 48 + const BATTLE_ANIM_FUNC_BETA_PURSUIT ; 49 + const BATTLE_ANIM_FUNC_RAIN ; 4a +DEF NUM_BATTLE_ANIM_FUNCS EQU const_value ; BattleAnimFrameData indexes (see data/battle_anims/framesets.asm) const_def - const BATTLEANIMFRAMESET_00 - const BATTLEANIMFRAMESET_01 - const BATTLEANIMFRAMESET_02 - const BATTLEANIMFRAMESET_03 - const BATTLEANIMFRAMESET_04 - const BATTLEANIMFRAMESET_05 - const BATTLEANIMFRAMESET_06 - const BATTLEANIMFRAMESET_07 - const BATTLEANIMFRAMESET_08 - const BATTLEANIMFRAMESET_09 - const BATTLEANIMFRAMESET_0A - const BATTLEANIMFRAMESET_0B - const BATTLEANIMFRAMESET_0C - const BATTLEANIMFRAMESET_0D - const BATTLEANIMFRAMESET_0E - const BATTLEANIMFRAMESET_0F - const BATTLEANIMFRAMESET_10 - const BATTLEANIMFRAMESET_11 - const BATTLEANIMFRAMESET_12 - const BATTLEANIMFRAMESET_13 - const BATTLEANIMFRAMESET_14 - const BATTLEANIMFRAMESET_15 - const BATTLEANIMFRAMESET_16 - const BATTLEANIMFRAMESET_17 - const BATTLEANIMFRAMESET_18 - const BATTLEANIMFRAMESET_19 - const BATTLEANIMFRAMESET_1A - const BATTLEANIMFRAMESET_1B - const BATTLEANIMFRAMESET_1C - const BATTLEANIMFRAMESET_1D - const BATTLEANIMFRAMESET_1E - const BATTLEANIMFRAMESET_1F - const BATTLEANIMFRAMESET_20 - const BATTLEANIMFRAMESET_21 - const BATTLEANIMFRAMESET_22 - const BATTLEANIMFRAMESET_23 - const BATTLEANIMFRAMESET_24 - const BATTLEANIMFRAMESET_25 - const BATTLEANIMFRAMESET_26 - const BATTLEANIMFRAMESET_27 - const BATTLEANIMFRAMESET_28 - const BATTLEANIMFRAMESET_29 - const BATTLEANIMFRAMESET_2A - const BATTLEANIMFRAMESET_2B - const BATTLEANIMFRAMESET_2C - const BATTLEANIMFRAMESET_2D - const BATTLEANIMFRAMESET_2E - const BATTLEANIMFRAMESET_2F - const BATTLEANIMFRAMESET_30 - const BATTLEANIMFRAMESET_31 - const BATTLEANIMFRAMESET_32 - const BATTLEANIMFRAMESET_33 - const BATTLEANIMFRAMESET_34 - const BATTLEANIMFRAMESET_35 - const BATTLEANIMFRAMESET_36 - const BATTLEANIMFRAMESET_37 - const BATTLEANIMFRAMESET_38 - const BATTLEANIMFRAMESET_39 - const BATTLEANIMFRAMESET_3A - const BATTLEANIMFRAMESET_3B - const BATTLEANIMFRAMESET_3C - const BATTLEANIMFRAMESET_3D - const BATTLEANIMFRAMESET_3E - const BATTLEANIMFRAMESET_3F - const BATTLEANIMFRAMESET_40 - const BATTLEANIMFRAMESET_41 - const BATTLEANIMFRAMESET_42 - const BATTLEANIMFRAMESET_43 - const BATTLEANIMFRAMESET_44 - const BATTLEANIMFRAMESET_45 - const BATTLEANIMFRAMESET_46 - const BATTLEANIMFRAMESET_47 - const BATTLEANIMFRAMESET_48 - const BATTLEANIMFRAMESET_49 - const BATTLEANIMFRAMESET_4A - const BATTLEANIMFRAMESET_4B - const BATTLEANIMFRAMESET_4C - const BATTLEANIMFRAMESET_4D - const BATTLEANIMFRAMESET_4E - const BATTLEANIMFRAMESET_4F - const BATTLEANIMFRAMESET_50 - const BATTLEANIMFRAMESET_51 - const BATTLEANIMFRAMESET_52 - const BATTLEANIMFRAMESET_53 - const BATTLEANIMFRAMESET_54 - const BATTLEANIMFRAMESET_55 - const BATTLEANIMFRAMESET_56 - const BATTLEANIMFRAMESET_57 - const BATTLEANIMFRAMESET_58 - const BATTLEANIMFRAMESET_59 - const BATTLEANIMFRAMESET_5A - const BATTLEANIMFRAMESET_5B - const BATTLEANIMFRAMESET_5C - const BATTLEANIMFRAMESET_5D - const BATTLEANIMFRAMESET_5E - const BATTLEANIMFRAMESET_5F - const BATTLEANIMFRAMESET_60 - const BATTLEANIMFRAMESET_61 - const BATTLEANIMFRAMESET_62 - const BATTLEANIMFRAMESET_63 - const BATTLEANIMFRAMESET_64 - const BATTLEANIMFRAMESET_65 - const BATTLEANIMFRAMESET_66 - const BATTLEANIMFRAMESET_67 - const BATTLEANIMFRAMESET_68 - const BATTLEANIMFRAMESET_69 - const BATTLEANIMFRAMESET_6A - const BATTLEANIMFRAMESET_6B - const BATTLEANIMFRAMESET_6C - const BATTLEANIMFRAMESET_6D - const BATTLEANIMFRAMESET_6E - const BATTLEANIMFRAMESET_6F - const BATTLEANIMFRAMESET_70 - const BATTLEANIMFRAMESET_71 - const BATTLEANIMFRAMESET_72 - const BATTLEANIMFRAMESET_73 - const BATTLEANIMFRAMESET_74 - const BATTLEANIMFRAMESET_75 - const BATTLEANIMFRAMESET_76 - const BATTLEANIMFRAMESET_77 - const BATTLEANIMFRAMESET_78 - const BATTLEANIMFRAMESET_79 - const BATTLEANIMFRAMESET_7A - const BATTLEANIMFRAMESET_7B - const BATTLEANIMFRAMESET_7C - const BATTLEANIMFRAMESET_7D - const BATTLEANIMFRAMESET_7E - const BATTLEANIMFRAMESET_7F - const BATTLEANIMFRAMESET_80 - const BATTLEANIMFRAMESET_81 - const BATTLEANIMFRAMESET_82 - const BATTLEANIMFRAMESET_83 - const BATTLEANIMFRAMESET_84 - const BATTLEANIMFRAMESET_85 - const BATTLEANIMFRAMESET_86 - const BATTLEANIMFRAMESET_87 - const BATTLEANIMFRAMESET_88 - const BATTLEANIMFRAMESET_89 - const BATTLEANIMFRAMESET_8A - const BATTLEANIMFRAMESET_8B - const BATTLEANIMFRAMESET_8C - const BATTLEANIMFRAMESET_8D - const BATTLEANIMFRAMESET_8E - const BATTLEANIMFRAMESET_8F - const BATTLEANIMFRAMESET_90 - const BATTLEANIMFRAMESET_91 - const BATTLEANIMFRAMESET_92 - const BATTLEANIMFRAMESET_93 - const BATTLEANIMFRAMESET_94 - const BATTLEANIMFRAMESET_95 - const BATTLEANIMFRAMESET_96 - const BATTLEANIMFRAMESET_97 - const BATTLEANIMFRAMESET_98 - const BATTLEANIMFRAMESET_99 - const BATTLEANIMFRAMESET_9A - const BATTLEANIMFRAMESET_9B - const BATTLEANIMFRAMESET_9C - const BATTLEANIMFRAMESET_9D - const BATTLEANIMFRAMESET_9E - const BATTLEANIMFRAMESET_9F - const BATTLEANIMFRAMESET_A0 - const BATTLEANIMFRAMESET_A1 - const BATTLEANIMFRAMESET_A2 - const BATTLEANIMFRAMESET_A3 - const BATTLEANIMFRAMESET_A4 - const BATTLEANIMFRAMESET_A5 - const BATTLEANIMFRAMESET_A6 - const BATTLEANIMFRAMESET_A7 - const BATTLEANIMFRAMESET_A8 - const BATTLEANIMFRAMESET_A9 - const BATTLEANIMFRAMESET_AA - const BATTLEANIMFRAMESET_AB - const BATTLEANIMFRAMESET_AC - const BATTLEANIMFRAMESET_AD - const BATTLEANIMFRAMESET_AE - const BATTLEANIMFRAMESET_AF - const BATTLEANIMFRAMESET_B0 - const BATTLEANIMFRAMESET_B1 - const BATTLEANIMFRAMESET_B2 - const BATTLEANIMFRAMESET_B3 - const BATTLEANIMFRAMESET_B4 - const BATTLEANIMFRAMESET_B5 - const BATTLEANIMFRAMESET_B6 - const BATTLEANIMFRAMESET_B7 - const BATTLEANIMFRAMESET_B8 + const BATTLE_ANIM_FRAMESET_HIT_BIG ; 00 + const BATTLE_ANIM_FRAMESET_HIT ; 01 + const BATTLE_ANIM_FRAMESET_HIT_SMALL ; 02 + const BATTLE_ANIM_FRAMESET_PUNCH ; 03 + const BATTLE_ANIM_FRAMESET_KICK ; 04 + const BATTLE_ANIM_FRAMESET_PALM ; 05 + const BATTLE_ANIM_FRAMESET_FANG ; 06 + const BATTLE_ANIM_FRAMESET_PUNCH_SHAKE ; 07 + const BATTLE_ANIM_FRAMESET_BALL_POOF ; 08 + const BATTLE_ANIM_FRAMESET_POKE_BALL_1 ; 09 + const BATTLE_ANIM_FRAMESET_POKE_BALL_2 ; 0a + const BATTLE_ANIM_FRAMESET_POKE_BALL_3 ; 0b + const BATTLE_ANIM_FRAMESET_POKE_BALL_4 ; 0c + const BATTLE_ANIM_FRAMESET_POKE_BALL_5 ; 0d + const BATTLE_ANIM_FRAMESET_DRAGON_RAGE ; 0e + const BATTLE_ANIM_FRAMESET_FLAMETHROWER ; 0f + const BATTLE_ANIM_FRAMESET_EMBER ; 10 + const BATTLE_ANIM_FRAMESET_BURNED ; 11 + const BATTLE_ANIM_FRAMESET_BLIZZARD ; 12 + const BATTLE_ANIM_FRAMESET_ICE ; 13 + const BATTLE_ANIM_FRAMESET_ICE_BEAM ; 14 + const BATTLE_ANIM_FRAMESET_POWDER_SNOW ; 15 + const BATTLE_ANIM_FRAMESET_RAZOR_LEAF_1 ; 16 + const BATTLE_ANIM_FRAMESET_RAZOR_LEAF_2 ; 17 + const BATTLE_ANIM_FRAMESET_EXPLOSION ; 18 + const BATTLE_ANIM_FRAMESET_BIG_ROCK ; 19 + const BATTLE_ANIM_FRAMESET_SMALL_ROCK ; 1a + const BATTLE_ANIM_FRAMESET_STRENGTH ; 1b + const BATTLE_ANIM_FRAMESET_SKULL_CROSSBONE ; 1c + const BATTLE_ANIM_FRAMESET_ACID ; 1d + const BATTLE_ANIM_FRAMESET_POISON_DROPLET_UNUSED ; 1e + const BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE ; 1f + const BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE_BURST ; 20 + const BATTLE_ANIM_FRAMESET_SMALL_BUBBLE ; 21 + const BATTLE_ANIM_FRAMESET_PULSING_BUBBLE ; 22 + const BATTLE_ANIM_FRAMESET_SURF ; 23 + const BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1 ; 24 + const BATTLE_ANIM_FRAMESET_MUSIC_NOTE_2 ; 25 + const BATTLE_ANIM_FRAMESET_MUSIC_NOTE_3 ; 26 + const BATTLE_ANIM_FRAMESET_WATER_GUN_1 ; 27 + const BATTLE_ANIM_FRAMESET_WATER_GUN_2 ; 28 + const BATTLE_ANIM_FRAMESET_WATER_GUN_3 ; 29 + const BATTLE_ANIM_FRAMESET_HYDRO_PUMP ; 2a + const BATTLE_ANIM_FRAMESET_POWDER ; 2b + const BATTLE_ANIM_FRAMESET_BEAM ; 2c + const BATTLE_ANIM_FRAMESET_BEAM_TIP ; 2d + const BATTLE_ANIM_FRAMESET_ICE_BUILDUP ; 2e + const BATTLE_ANIM_FRAMESET_FROZEN ; 2f + const BATTLE_ANIM_FRAMESET_CIRCLING_SPARKLE ; 30 + const BATTLE_ANIM_FRAMESET_THUNDER_CENTER ; 31 + const BATTLE_ANIM_FRAMESET_THUNDER_LEFT ; 32 + const BATTLE_ANIM_FRAMESET_THUNDER_RIGHT ; 33 + const BATTLE_ANIM_FRAMESET_THUNDER_WAVE_DISABLE ; 34 + const BATTLE_ANIM_FRAMESET_THUNDER_WAVE_EXTRA ; 35 + const BATTLE_ANIM_FRAMESET_THUNDERBOLT_SPARKS ; 36 + const BATTLE_ANIM_FRAMESET_THUNDERBOLT_CORE ; 37 + const BATTLE_ANIM_FRAMESET_THUNDERSHOCK_SPARKS ; 38 + const BATTLE_ANIM_FRAMESET_THUNDERSHOCK_CORE ; 39 + const BATTLE_ANIM_FRAMESET_CLAMP ; 3a + const BATTLE_ANIM_FRAMESET_CLAMP_FLIPPED ; 3b + const BATTLE_ANIM_FRAMESET_BITE_1 ; 3c + const BATTLE_ANIM_FRAMESET_BITE_2 ; 3d + const BATTLE_ANIM_FRAMESET_CUT_DOWN_LEFT ; 3e + const BATTLE_ANIM_FRAMESET_CUT_DOWN_RIGHT ; 3f + const BATTLE_ANIM_FRAMESET_CUT_UP_RIGHT ; 40 + const BATTLE_ANIM_FRAMESET_CUT_LONG_DOWN_LEFT ; 41 + const BATTLE_ANIM_FRAMESET_CUT_LONG_DOWN_RIGHT ; 42 + const BATTLE_ANIM_FRAMESET_CHARGE_ORB_1 ; 43 + const BATTLE_ANIM_FRAMESET_ABSORB_CENTER ; 44 + const BATTLE_ANIM_FRAMESET_GUST ; 45 + const BATTLE_ANIM_FRAMESET_VINE_WHIP_1 ; 46 + const BATTLE_ANIM_FRAMESET_VINE_WHIP_2 ; 47 + const BATTLE_ANIM_FRAMESET_RAZOR_WIND_1 ; 48 + const BATTLE_ANIM_FRAMESET_RAZOR_WIND_2 ; 49 + const BATTLE_ANIM_FRAMESET_SONICBOOM ; 4a + const BATTLE_ANIM_FRAMESET_WARP ; 4b + const BATTLE_ANIM_FRAMESET_CHARGE_ORB_2 ; 4c + const BATTLE_ANIM_FRAMESET_EGG ; 4d + const BATTLE_ANIM_FRAMESET_EGG_WOBBLE ; 4e + const BATTLE_ANIM_FRAMESET_EGG_CRACKED_TOP ; 4f + const BATTLE_ANIM_FRAMESET_EGG_CRACKED_BOTTOM ; 50 + const BATTLE_ANIM_FRAMESET_FOCUS ; 51 + const BATTLE_ANIM_FRAMESET_BIND_1 ; 52 + const BATTLE_ANIM_FRAMESET_BIND_2 ; 53 + const BATTLE_ANIM_FRAMESET_BIND_3 ; 54 + const BATTLE_ANIM_FRAMESET_BIND_4 ; 55 + const BATTLE_ANIM_FRAMESET_LEECH_SEED_1 ; 56 + const BATTLE_ANIM_FRAMESET_LEECH_SEED_2 ; 57 + const BATTLE_ANIM_FRAMESET_LEECH_SEED_3 ; 58 + const BATTLE_ANIM_FRAMESET_SOUND_1 ; 59 + const BATTLE_ANIM_FRAMESET_SOUND_2 ; 5a + const BATTLE_ANIM_FRAMESET_SOUND_3 ; 5b + const BATTLE_ANIM_FRAMESET_WAVE ; 5c + const BATTLE_ANIM_FRAMESET_CONFUSE_RAY_1 ; 5d + const BATTLE_ANIM_FRAMESET_CONFUSE_RAY_2 ; 5e + const BATTLE_ANIM_FRAMESET_LEER ; 5f + const BATTLE_ANIM_FRAMESET_REFLECT ; 60 + const BATTLE_ANIM_FRAMESET_CHICK_1 ; 61 + const BATTLE_ANIM_FRAMESET_CHICK_2 ; 62 + const BATTLE_ANIM_FRAMESET_AMNESIA_1 ; 63 + const BATTLE_ANIM_FRAMESET_AMNESIA_2 ; 64 + const BATTLE_ANIM_FRAMESET_AMNESIA_3 ; 65 + const BATTLE_ANIM_FRAMESET_ASLEEP ; 66 + const BATTLE_ANIM_FRAMESET_DIG_SAND ; 67 + const BATTLE_ANIM_FRAMESET_DIG_PILE ; 68 + const BATTLE_ANIM_FRAMESET_SAND ; 69 + const BATTLE_ANIM_FRAMESET_STRING_SHOT_1 ; 6a + const BATTLE_ANIM_FRAMESET_STRING_SHOT_2 ; 6b + const BATTLE_ANIM_FRAMESET_STRING_SHOT_3 ; 6c + const BATTLE_ANIM_FRAMESET_PARALYZED ; 6d + const BATTLE_ANIM_FRAMESET_PARALYZED_FLIPPED ; 6e + const BATTLE_ANIM_FRAMESET_HAZE ; 6f + const BATTLE_ANIM_FRAMESET_MIST ; 70 + const BATTLE_ANIM_FRAMESET_HORN ; 71 + const BATTLE_ANIM_FRAMESET_NEEDLE ; 72 + const BATTLE_ANIM_FRAMESET_FLOWER ; 73 + const BATTLE_ANIM_FRAMESET_BARRAGE_BALL ; 74 + const BATTLE_ANIM_FRAMESET_PAY_DAY ; 75 + const BATTLE_ANIM_FRAMESET_HEART ; 76 + const BATTLE_ANIM_FRAMESET_SPINNING_BONE ; 77 + const BATTLE_ANIM_FRAMESET_STAR ; 78 + const BATTLE_ANIM_FRAMESET_SPOON ; 79 + const BATTLE_ANIM_FRAMESET_SPARKLE ; 7a + const BATTLE_ANIM_FRAMESET_SKY_ATTACK ; 7b + const BATTLE_ANIM_FRAMESET_LICK ; 7c + const BATTLE_ANIM_FRAMESET_WITHDRAW_SHELL ; 7d + const BATTLE_ANIM_FRAMESET_SHRINKING_CHARGE_ORB ; 7e + const BATTLE_ANIM_FRAMESET_CONVERSION ; 7f + const BATTLE_ANIM_FRAMESET_SWORD ; 80 + const BATTLE_ANIM_FRAMESET_SPEED_LINE_1 ; 81 + const BATTLE_ANIM_FRAMESET_SPEED_LINE_2 ; 82 + const BATTLE_ANIM_FRAMESET_SPEED_LINE_3 ; 83 + const BATTLE_ANIM_FRAMESET_SEISMIC_TOSS ; 84 + const BATTLE_ANIM_FRAMESET_SHARPEN ; 85 + const BATTLE_ANIM_FRAMESET_DEFENSE_CURL ; 86 + const BATTLE_ANIM_FRAMESET_METRONOME_HAND ; 87 + const BATTLE_ANIM_FRAMESET_AGILITY ; 88 + const BATTLE_ANIM_FRAMESET_COTTON ; 89 + const BATTLE_ANIM_FRAMESET_MILK_BOTTLE ; 8a + const BATTLE_ANIM_FRAMESET_SPIKE ; 8b + const BATTLE_ANIM_FRAMESET_ANGER_VEIN ; 8c + const BATTLE_ANIM_FRAMESET_BELL_CHIME ; 8d + const BATTLE_ANIM_FRAMESET_BATON_PASS ; 8e + const BATTLE_ANIM_FRAMESET_LOCK_ON_1 ; 8f + const BATTLE_ANIM_FRAMESET_LOCK_ON_2 ; 90 + const BATTLE_ANIM_FRAMESET_LOCK_ON_3 ; 91 + const BATTLE_ANIM_FRAMESET_LOCK_ON_4 ; 92 + const BATTLE_ANIM_FRAMESET_MIND_READER_1 ; 93 + const BATTLE_ANIM_FRAMESET_MIND_READER_2 ; 94 + const BATTLE_ANIM_FRAMESET_MIND_READER_3 ; 95 + const BATTLE_ANIM_FRAMESET_MIND_READER_4 ; 96 + const BATTLE_ANIM_FRAMESET_SAFEGUARD ; 97 + const BATTLE_ANIM_FRAMESET_MEGAPHONE ; 98 + const BATTLE_ANIM_FRAMESET_ITEM_BAG ; 99 + const BATTLE_ANIM_FRAMESET_SPIDER_WEB ; 9a + const BATTLE_ANIM_FRAMESET_TEMPT_CAKE ; 9b + const BATTLE_ANIM_FRAMESET_IMP ; 9c + const BATTLE_ANIM_FRAMESET_IMP_FLIPPED ; 9d + const BATTLE_ANIM_FRAMESET_CHERUB ; 9e + const BATTLE_ANIM_FRAMESET_PENCIL ; 9f + const BATTLE_ANIM_FRAMESET_ENCORE_HAND ; a0 + const BATTLE_ANIM_FRAMESET_ENCORE_HAND_FLIPPED ; a1 + const BATTLE_ANIM_FRAMESET_DESTINY_BOND ; a2 + const BATTLE_ANIM_FRAMESET_MORNING_SUN ; a3 + const BATTLE_ANIM_FRAMESET_GLIMMER ; a4 + const BATTLE_ANIM_FRAMESET_MOONLIGHT ; a5 + const BATTLE_ANIM_FRAMESET_CROSS_CUTTER_1 ; a6 + const BATTLE_ANIM_FRAMESET_CROSS_CUTTER_2 ; a7 + const BATTLE_ANIM_FRAMESET_ZAP_CANNON ; a8 + const BATTLE_ANIM_FRAMESET_NAIL_DOWN ; a9 + const BATTLE_ANIM_FRAMESET_FORESIGHT_SHINE ; aa + const BATTLE_ANIM_FRAMESET_RAPID_SPIN ; ab + const BATTLE_ANIM_FRAMESET_SWAGGER ; ac + const BATTLE_ANIM_FRAMESET_STALKER ; ad + const BATTLE_ANIM_FRAMESET_UPSIDE_DOWN_PUNCH ; ae + const BATTLE_ANIM_FRAMESET_GROWING_SPARKLE ; af + const BATTLE_ANIM_FRAMESET_RAIN_1 ; b0 + const BATTLE_ANIM_FRAMESET_RAIN_2 ; b1 + const BATTLE_ANIM_FRAMESET_RAIN_3 ; b2 + const BATTLE_ANIM_FRAMESET_ENEMYFEET_1ROW ; b3 + const BATTLE_ANIM_FRAMESET_PLAYERHEAD_1ROW ; b4 + const BATTLE_ANIM_FRAMESET_ENEMYFEET_2ROW ; b5 + const BATTLE_ANIM_FRAMESET_PLAYERHEAD_2ROW ; b6 +DEF NUM_BATTLE_ANIM_FRAMESETS EQU const_value ; BattleAnimOAMData indexes (see data/battle_anims/oam.asm) const_def - const BATTLEANIMOAMSET_00 - const BATTLEANIMOAMSET_01 - const BATTLEANIMOAMSET_02 - const BATTLEANIMOAMSET_03 - const BATTLEANIMOAMSET_04 - const BATTLEANIMOAMSET_05 - const BATTLEANIMOAMSET_06 - const BATTLEANIMOAMSET_07 - const BATTLEANIMOAMSET_08 - const BATTLEANIMOAMSET_09 - const BATTLEANIMOAMSET_0A - const BATTLEANIMOAMSET_0B - const BATTLEANIMOAMSET_0C - const BATTLEANIMOAMSET_0D - const BATTLEANIMOAMSET_0E - const BATTLEANIMOAMSET_0F - const BATTLEANIMOAMSET_10 - const BATTLEANIMOAMSET_11 - const BATTLEANIMOAMSET_12 - const BATTLEANIMOAMSET_13 - const BATTLEANIMOAMSET_14 - const BATTLEANIMOAMSET_15 - const BATTLEANIMOAMSET_16 - const BATTLEANIMOAMSET_17 - const BATTLEANIMOAMSET_18 - const BATTLEANIMOAMSET_19 - const BATTLEANIMOAMSET_1A - const BATTLEANIMOAMSET_1B - const BATTLEANIMOAMSET_1C - const BATTLEANIMOAMSET_1D - const BATTLEANIMOAMSET_1E - const BATTLEANIMOAMSET_1F - const BATTLEANIMOAMSET_20 - const BATTLEANIMOAMSET_21 - const BATTLEANIMOAMSET_22 - const BATTLEANIMOAMSET_23 - const BATTLEANIMOAMSET_24 - const BATTLEANIMOAMSET_25 - const BATTLEANIMOAMSET_26 - const BATTLEANIMOAMSET_27 - const BATTLEANIMOAMSET_28 - const BATTLEANIMOAMSET_29 - const BATTLEANIMOAMSET_2A - const BATTLEANIMOAMSET_2B - const BATTLEANIMOAMSET_2C - const BATTLEANIMOAMSET_2D - const BATTLEANIMOAMSET_2E - const BATTLEANIMOAMSET_2F - const BATTLEANIMOAMSET_30 - const BATTLEANIMOAMSET_31 - const BATTLEANIMOAMSET_32 - const BATTLEANIMOAMSET_33 - const BATTLEANIMOAMSET_34 - const BATTLEANIMOAMSET_35 - const BATTLEANIMOAMSET_36 - const BATTLEANIMOAMSET_37 - const BATTLEANIMOAMSET_38 - const BATTLEANIMOAMSET_39 - const BATTLEANIMOAMSET_3A - const BATTLEANIMOAMSET_3B - const BATTLEANIMOAMSET_3C - const BATTLEANIMOAMSET_3D - const BATTLEANIMOAMSET_3E - const BATTLEANIMOAMSET_3F - const BATTLEANIMOAMSET_40 - const BATTLEANIMOAMSET_41 - const BATTLEANIMOAMSET_42 - const BATTLEANIMOAMSET_43 - const BATTLEANIMOAMSET_44 - const BATTLEANIMOAMSET_45 - const BATTLEANIMOAMSET_46 - const BATTLEANIMOAMSET_47 - const BATTLEANIMOAMSET_48 - const BATTLEANIMOAMSET_49 - const BATTLEANIMOAMSET_4A - const BATTLEANIMOAMSET_4B - const BATTLEANIMOAMSET_4C - const BATTLEANIMOAMSET_4D - const BATTLEANIMOAMSET_4E - const BATTLEANIMOAMSET_4F - const BATTLEANIMOAMSET_50 - const BATTLEANIMOAMSET_51 - const BATTLEANIMOAMSET_52 - const BATTLEANIMOAMSET_53 - const BATTLEANIMOAMSET_54 - const BATTLEANIMOAMSET_55 - const BATTLEANIMOAMSET_56 - const BATTLEANIMOAMSET_57 - const BATTLEANIMOAMSET_58 - const BATTLEANIMOAMSET_59 - const BATTLEANIMOAMSET_5A - const BATTLEANIMOAMSET_5B - const BATTLEANIMOAMSET_5C - const BATTLEANIMOAMSET_5D - const BATTLEANIMOAMSET_5E - const BATTLEANIMOAMSET_5F - const BATTLEANIMOAMSET_60 - const BATTLEANIMOAMSET_61 - const BATTLEANIMOAMSET_62 - const BATTLEANIMOAMSET_63 - const BATTLEANIMOAMSET_64 - const BATTLEANIMOAMSET_65 - const BATTLEANIMOAMSET_66 - const BATTLEANIMOAMSET_67 - const BATTLEANIMOAMSET_68 - const BATTLEANIMOAMSET_69 - const BATTLEANIMOAMSET_6A - const BATTLEANIMOAMSET_6B - const BATTLEANIMOAMSET_6C - const BATTLEANIMOAMSET_6D - const BATTLEANIMOAMSET_6E - const BATTLEANIMOAMSET_6F - const BATTLEANIMOAMSET_70 - const BATTLEANIMOAMSET_71 - const BATTLEANIMOAMSET_72 - const BATTLEANIMOAMSET_73 - const BATTLEANIMOAMSET_74 - const BATTLEANIMOAMSET_75 - const BATTLEANIMOAMSET_76 - const BATTLEANIMOAMSET_77 - const BATTLEANIMOAMSET_78 - const BATTLEANIMOAMSET_79 - const BATTLEANIMOAMSET_7A - const BATTLEANIMOAMSET_7B - const BATTLEANIMOAMSET_7C - const BATTLEANIMOAMSET_7D - const BATTLEANIMOAMSET_7E - const BATTLEANIMOAMSET_7F - const BATTLEANIMOAMSET_80 - const BATTLEANIMOAMSET_81 - const BATTLEANIMOAMSET_82 - const BATTLEANIMOAMSET_83 - const BATTLEANIMOAMSET_84 - const BATTLEANIMOAMSET_85 - const BATTLEANIMOAMSET_86 - const BATTLEANIMOAMSET_87 - const BATTLEANIMOAMSET_88 - const BATTLEANIMOAMSET_89 - const BATTLEANIMOAMSET_8A - const BATTLEANIMOAMSET_8B - const BATTLEANIMOAMSET_8C - const BATTLEANIMOAMSET_8D - const BATTLEANIMOAMSET_8E - const BATTLEANIMOAMSET_8F - const BATTLEANIMOAMSET_90 - const BATTLEANIMOAMSET_91 - const BATTLEANIMOAMSET_92 - const BATTLEANIMOAMSET_93 - const BATTLEANIMOAMSET_94 - const BATTLEANIMOAMSET_95 - const BATTLEANIMOAMSET_96 - const BATTLEANIMOAMSET_97 - const BATTLEANIMOAMSET_98 - const BATTLEANIMOAMSET_99 - const BATTLEANIMOAMSET_9A - const BATTLEANIMOAMSET_9B - const BATTLEANIMOAMSET_9C - const BATTLEANIMOAMSET_9D - const BATTLEANIMOAMSET_9E - const BATTLEANIMOAMSET_9F - const BATTLEANIMOAMSET_A0 - const BATTLEANIMOAMSET_A1 - const BATTLEANIMOAMSET_A2 - const BATTLEANIMOAMSET_A3 - const BATTLEANIMOAMSET_A4 - const BATTLEANIMOAMSET_A5 - const BATTLEANIMOAMSET_A6 - const BATTLEANIMOAMSET_A7 - const BATTLEANIMOAMSET_A8 - const BATTLEANIMOAMSET_A9 - const BATTLEANIMOAMSET_AA - const BATTLEANIMOAMSET_AB - const BATTLEANIMOAMSET_AC - const BATTLEANIMOAMSET_AD - const BATTLEANIMOAMSET_AE - const BATTLEANIMOAMSET_AF - const BATTLEANIMOAMSET_B0 - const BATTLEANIMOAMSET_B1 - const BATTLEANIMOAMSET_B2 - const BATTLEANIMOAMSET_B3 - const BATTLEANIMOAMSET_B4 - const BATTLEANIMOAMSET_B5 - const BATTLEANIMOAMSET_B6 - const BATTLEANIMOAMSET_B7 - const BATTLEANIMOAMSET_B8 - const BATTLEANIMOAMSET_B9 - const BATTLEANIMOAMSET_BA - const BATTLEANIMOAMSET_BB - const BATTLEANIMOAMSET_BC - const BATTLEANIMOAMSET_BD - const BATTLEANIMOAMSET_BE - const BATTLEANIMOAMSET_BF - const BATTLEANIMOAMSET_C0 - const BATTLEANIMOAMSET_C1 - const BATTLEANIMOAMSET_C2 - const BATTLEANIMOAMSET_C3 - const BATTLEANIMOAMSET_C4 - const BATTLEANIMOAMSET_C5 - const BATTLEANIMOAMSET_C6 - const BATTLEANIMOAMSET_C7 - const BATTLEANIMOAMSET_C8 - const BATTLEANIMOAMSET_C9 - const BATTLEANIMOAMSET_CA - const BATTLEANIMOAMSET_CB - const BATTLEANIMOAMSET_CC - const BATTLEANIMOAMSET_CD - const BATTLEANIMOAMSET_CE - const BATTLEANIMOAMSET_CF - const BATTLEANIMOAMSET_D0 - const BATTLEANIMOAMSET_D1 - const BATTLEANIMOAMSET_D2 - const BATTLEANIMOAMSET_D3 - const BATTLEANIMOAMSET_D4 - const BATTLEANIMOAMSET_D5 - const BATTLEANIMOAMSET_D6 - const BATTLEANIMOAMSET_D7 + const BATTLE_ANIM_OAMSET_00 + const BATTLE_ANIM_OAMSET_01 + const BATTLE_ANIM_OAMSET_02 + const BATTLE_ANIM_OAMSET_03 + const BATTLE_ANIM_OAMSET_04 + const BATTLE_ANIM_OAMSET_05 + const BATTLE_ANIM_OAMSET_06 + const BATTLE_ANIM_OAMSET_07 + const BATTLE_ANIM_OAMSET_08 + const BATTLE_ANIM_OAMSET_09 + const BATTLE_ANIM_OAMSET_0A + const BATTLE_ANIM_OAMSET_0B + const BATTLE_ANIM_OAMSET_0C + const BATTLE_ANIM_OAMSET_0D + const BATTLE_ANIM_OAMSET_0E + const BATTLE_ANIM_OAMSET_0F + const BATTLE_ANIM_OAMSET_10 + const BATTLE_ANIM_OAMSET_11 + const BATTLE_ANIM_OAMSET_12 + const BATTLE_ANIM_OAMSET_13 + const BATTLE_ANIM_OAMSET_14 + const BATTLE_ANIM_OAMSET_15 + const BATTLE_ANIM_OAMSET_16 + const BATTLE_ANIM_OAMSET_17 + const BATTLE_ANIM_OAMSET_18 + const BATTLE_ANIM_OAMSET_19 + const BATTLE_ANIM_OAMSET_1A + const BATTLE_ANIM_OAMSET_1B + const BATTLE_ANIM_OAMSET_1C + const BATTLE_ANIM_OAMSET_1D + const BATTLE_ANIM_OAMSET_1E + const BATTLE_ANIM_OAMSET_1F + const BATTLE_ANIM_OAMSET_20 + const BATTLE_ANIM_OAMSET_21 + const BATTLE_ANIM_OAMSET_22 + const BATTLE_ANIM_OAMSET_23 + const BATTLE_ANIM_OAMSET_24 + const BATTLE_ANIM_OAMSET_25 + const BATTLE_ANIM_OAMSET_26 + const BATTLE_ANIM_OAMSET_27 + const BATTLE_ANIM_OAMSET_28 + const BATTLE_ANIM_OAMSET_29 + const BATTLE_ANIM_OAMSET_2A + const BATTLE_ANIM_OAMSET_2B + const BATTLE_ANIM_OAMSET_2C + const BATTLE_ANIM_OAMSET_2D + const BATTLE_ANIM_OAMSET_2E + const BATTLE_ANIM_OAMSET_2F + const BATTLE_ANIM_OAMSET_30 + const BATTLE_ANIM_OAMSET_31 + const BATTLE_ANIM_OAMSET_32 + const BATTLE_ANIM_OAMSET_33 + const BATTLE_ANIM_OAMSET_34 + const BATTLE_ANIM_OAMSET_35 + const BATTLE_ANIM_OAMSET_36 + const BATTLE_ANIM_OAMSET_37 + const BATTLE_ANIM_OAMSET_38 + const BATTLE_ANIM_OAMSET_39 + const BATTLE_ANIM_OAMSET_3A + const BATTLE_ANIM_OAMSET_3B + const BATTLE_ANIM_OAMSET_3C + const BATTLE_ANIM_OAMSET_3D + const BATTLE_ANIM_OAMSET_3E + const BATTLE_ANIM_OAMSET_3F + const BATTLE_ANIM_OAMSET_40 + const BATTLE_ANIM_OAMSET_41 + const BATTLE_ANIM_OAMSET_42 + const BATTLE_ANIM_OAMSET_43 + const BATTLE_ANIM_OAMSET_44 + const BATTLE_ANIM_OAMSET_45 + const BATTLE_ANIM_OAMSET_46 + const BATTLE_ANIM_OAMSET_47 + const BATTLE_ANIM_OAMSET_48 + const BATTLE_ANIM_OAMSET_49 + const BATTLE_ANIM_OAMSET_4A + const BATTLE_ANIM_OAMSET_4B + const BATTLE_ANIM_OAMSET_4C + const BATTLE_ANIM_OAMSET_4D + const BATTLE_ANIM_OAMSET_4E + const BATTLE_ANIM_OAMSET_4F + const BATTLE_ANIM_OAMSET_50 + const BATTLE_ANIM_OAMSET_51 + const BATTLE_ANIM_OAMSET_52 + const BATTLE_ANIM_OAMSET_53 + const BATTLE_ANIM_OAMSET_54 + const BATTLE_ANIM_OAMSET_55 + const BATTLE_ANIM_OAMSET_56 + const BATTLE_ANIM_OAMSET_57 + const BATTLE_ANIM_OAMSET_58 + const BATTLE_ANIM_OAMSET_59 + const BATTLE_ANIM_OAMSET_5A + const BATTLE_ANIM_OAMSET_5B + const BATTLE_ANIM_OAMSET_5C + const BATTLE_ANIM_OAMSET_5D + const BATTLE_ANIM_OAMSET_5E + const BATTLE_ANIM_OAMSET_5F + const BATTLE_ANIM_OAMSET_60 + const BATTLE_ANIM_OAMSET_61 + const BATTLE_ANIM_OAMSET_62 + const BATTLE_ANIM_OAMSET_63 + const BATTLE_ANIM_OAMSET_64 + const BATTLE_ANIM_OAMSET_65 + const BATTLE_ANIM_OAMSET_66 + const BATTLE_ANIM_OAMSET_67 + const BATTLE_ANIM_OAMSET_68 + const BATTLE_ANIM_OAMSET_69 + const BATTLE_ANIM_OAMSET_6A + const BATTLE_ANIM_OAMSET_6B + const BATTLE_ANIM_OAMSET_6C + const BATTLE_ANIM_OAMSET_6D + const BATTLE_ANIM_OAMSET_6E + const BATTLE_ANIM_OAMSET_6F + const BATTLE_ANIM_OAMSET_70 + const BATTLE_ANIM_OAMSET_71 + const BATTLE_ANIM_OAMSET_72 + const BATTLE_ANIM_OAMSET_73 + const BATTLE_ANIM_OAMSET_74 + const BATTLE_ANIM_OAMSET_75 + const BATTLE_ANIM_OAMSET_76 + const BATTLE_ANIM_OAMSET_77 + const BATTLE_ANIM_OAMSET_78 + const BATTLE_ANIM_OAMSET_79 + const BATTLE_ANIM_OAMSET_7A + const BATTLE_ANIM_OAMSET_7B + const BATTLE_ANIM_OAMSET_7C + const BATTLE_ANIM_OAMSET_7D + const BATTLE_ANIM_OAMSET_7E + const BATTLE_ANIM_OAMSET_7F + const BATTLE_ANIM_OAMSET_80 + const BATTLE_ANIM_OAMSET_81 + const BATTLE_ANIM_OAMSET_82 + const BATTLE_ANIM_OAMSET_83 + const BATTLE_ANIM_OAMSET_84 + const BATTLE_ANIM_OAMSET_85 + const BATTLE_ANIM_OAMSET_86 + const BATTLE_ANIM_OAMSET_87 + const BATTLE_ANIM_OAMSET_88 + const BATTLE_ANIM_OAMSET_89 + const BATTLE_ANIM_OAMSET_8A + const BATTLE_ANIM_OAMSET_8B + const BATTLE_ANIM_OAMSET_8C + const BATTLE_ANIM_OAMSET_8D + const BATTLE_ANIM_OAMSET_8E + const BATTLE_ANIM_OAMSET_8F + const BATTLE_ANIM_OAMSET_90 + const BATTLE_ANIM_OAMSET_91 + const BATTLE_ANIM_OAMSET_92 + const BATTLE_ANIM_OAMSET_93 + const BATTLE_ANIM_OAMSET_94 + const BATTLE_ANIM_OAMSET_95 + const BATTLE_ANIM_OAMSET_96 + const BATTLE_ANIM_OAMSET_97 + const BATTLE_ANIM_OAMSET_98 + const BATTLE_ANIM_OAMSET_99 + const BATTLE_ANIM_OAMSET_9A + const BATTLE_ANIM_OAMSET_9B + const BATTLE_ANIM_OAMSET_9C + const BATTLE_ANIM_OAMSET_9D + const BATTLE_ANIM_OAMSET_9E + const BATTLE_ANIM_OAMSET_9F + const BATTLE_ANIM_OAMSET_A0 + const BATTLE_ANIM_OAMSET_A1 + const BATTLE_ANIM_OAMSET_A2 + const BATTLE_ANIM_OAMSET_A3 + const BATTLE_ANIM_OAMSET_A4 + const BATTLE_ANIM_OAMSET_A5 + const BATTLE_ANIM_OAMSET_A6 + const BATTLE_ANIM_OAMSET_A7 + const BATTLE_ANIM_OAMSET_A8 + const BATTLE_ANIM_OAMSET_A9 + const BATTLE_ANIM_OAMSET_AA + const BATTLE_ANIM_OAMSET_AB + const BATTLE_ANIM_OAMSET_AC + const BATTLE_ANIM_OAMSET_AD + const BATTLE_ANIM_OAMSET_AE + const BATTLE_ANIM_OAMSET_AF + const BATTLE_ANIM_OAMSET_B0 + const BATTLE_ANIM_OAMSET_B1 + const BATTLE_ANIM_OAMSET_B2 + const BATTLE_ANIM_OAMSET_B3 + const BATTLE_ANIM_OAMSET_B4 + const BATTLE_ANIM_OAMSET_B5 + const BATTLE_ANIM_OAMSET_B6 + const BATTLE_ANIM_OAMSET_B7 + const BATTLE_ANIM_OAMSET_B8 + const BATTLE_ANIM_OAMSET_B9 + const BATTLE_ANIM_OAMSET_BA + const BATTLE_ANIM_OAMSET_BB + const BATTLE_ANIM_OAMSET_BC + const BATTLE_ANIM_OAMSET_BD + const BATTLE_ANIM_OAMSET_BE + const BATTLE_ANIM_OAMSET_BF + const BATTLE_ANIM_OAMSET_C0 + const BATTLE_ANIM_OAMSET_C1 + const BATTLE_ANIM_OAMSET_C2 + const BATTLE_ANIM_OAMSET_C3 + const BATTLE_ANIM_OAMSET_C4 + const BATTLE_ANIM_OAMSET_C5 + const BATTLE_ANIM_OAMSET_C6 + const BATTLE_ANIM_OAMSET_C7 + const BATTLE_ANIM_OAMSET_C8 + const BATTLE_ANIM_OAMSET_C9 + const BATTLE_ANIM_OAMSET_CA + const BATTLE_ANIM_OAMSET_CB + const BATTLE_ANIM_OAMSET_CC + const BATTLE_ANIM_OAMSET_CD + const BATTLE_ANIM_OAMSET_CE + const BATTLE_ANIM_OAMSET_CF + const BATTLE_ANIM_OAMSET_D0 + const BATTLE_ANIM_OAMSET_D1 + const BATTLE_ANIM_OAMSET_D2 +DEF NUM_BATTLE_ANIM_OAMSETS EQU const_value ; BattleBGEffects indexes (see engine/battle_anims/bg_effects.asm) const_def 1 - const ANIM_BG_FLASH_INVERTED - const ANIM_BG_FLASH_WHITE - const ANIM_BG_WHITE_HUES - const ANIM_BG_BLACK_HUES - const ANIM_BG_ALTERNATE_HUES - const ANIM_BG_06 - const ANIM_BG_07 - const ANIM_BG_08 - const ANIM_BG_HIDE_MON - const ANIM_BG_SHOW_MON - const ANIM_BG_ENTER_MON - const ANIM_BG_RETURN_MON - const ANIM_BG_SURF - ;const ANIM_BG_WHIRLPOOL - const ANIM_BG_TELEPORT - const ANIM_BG_NIGHT_SHADE - const ANIM_BG_FEET_FOLLOW - const ANIM_BG_HEAD_FOLLOW - const ANIM_BG_DOUBLE_TEAM - const ANIM_BG_ACID_ARMOR - const ANIM_BG_RAPID_FLASH - const ANIM_BG_16 - const ANIM_BG_17 - const ANIM_BG_18 - const ANIM_BG_19 - const ANIM_BG_1A - const ANIM_BG_1B - const ANIM_BG_1C - const ANIM_BG_1D - const ANIM_BG_1E - const ANIM_BG_1F - const ANIM_BG_20 - const ANIM_BG_WITHDRAW - const ANIM_BG_BOUNCE_DOWN - const ANIM_BG_DIG - const ANIM_BG_TACKLE - ;const ANIM_BG_25 - const ANIM_BG_26 - const ANIM_BG_27 - const ANIM_BG_WAVE_DEFORM_USER - const ANIM_BG_PSYCHIC - const ANIM_BG_2A - const ANIM_BG_2B - const ANIM_BG_2C - const ANIM_BG_2D - const ANIM_BG_2E - const ANIM_BG_2F + const BATTLE_BG_EFFECT_FLASH_INVERTED ; 01 + const BATTLE_BG_EFFECT_FLASH_WHITE ; 02 + const BATTLE_BG_EFFECT_WHITE_HUES ; 03 + const BATTLE_BG_EFFECT_BLACK_HUES ; 04 + const BATTLE_BG_EFFECT_ALTERNATE_HUES ; 05 + const BATTLE_BG_EFFECT_CYCLE_OBPALS ; 06 + const BATTLE_BG_EFFECT_CYCLE_MID_OBPALS ; 07 + const BATTLE_BG_EFFECT_CYCLE_BGPALS_INVERTED ; 08 + const BATTLE_BG_EFFECT_HIDE_MON ; 09 + const BATTLE_BG_EFFECT_SHOW_MON ; 0a + const BATTLE_BG_EFFECT_ENTER_MON ; 0b + const BATTLE_BG_EFFECT_RETURN_MON ; 0c + const BATTLE_BG_EFFECT_SURF ; 0d + const BATTLE_BG_EFFECT_TELEPORT ; 0e + const BATTLE_BG_EFFECT_NIGHT_SHADE ; 0f + const BATTLE_BG_EFFECT_BATTLEROBJ_1ROW ; 10 + const BATTLE_BG_EFFECT_BATTLEROBJ_2ROW ; 11 + const BATTLE_BG_EFFECT_DOUBLE_TEAM ; 12 + const BATTLE_BG_EFFECT_ACID_ARMOR ; 13 + const BATTLE_BG_EFFECT_RAPID_FLASH ; 14 + const BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT ; 15 + const BATTLE_BG_EFFECT_FADE_MON_TO_BLACK ; 16 + const BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING ; 17 + const BATTLE_BG_EFFECT_FADE_MON_TO_BLACK_REPEATING ; 18 + const BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING ; 19 + const BATTLE_BG_EFFECT_FLASH_MON_REPEATING ; 1a + const BATTLE_BG_EFFECT_FADE_MONS_TO_BLACK_REPEATING ; 1b + const BATTLE_BG_EFFECT_FADE_MON_TO_WHITE_WAIT_FADE_BACK ; 1c + const BATTLE_BG_EFFECT_FADE_MON_FROM_WHITE ; 1d + const BATTLE_BG_EFFECT_SHAKE_SCREEN_X ; 1e + const BATTLE_BG_EFFECT_SHAKE_SCREEN_Y ; 1f + const BATTLE_BG_EFFECT_WITHDRAW ; 20 + const BATTLE_BG_EFFECT_BOUNCE_DOWN ; 21 + const BATTLE_BG_EFFECT_DIG ; 22 + const BATTLE_BG_EFFECT_TACKLE ; 23 + const BATTLE_BG_EFFECT_WOBBLE_MON ; 24 + const BATTLE_BG_EFFECT_REMOVE_MON ; 25 + const BATTLE_BG_EFFECT_WAVE_DEFORM_MON ; 26 + const BATTLE_BG_EFFECT_PSYCHIC ; 27 + const BATTLE_BG_EFFECT_BETA_SEND_OUT_MON1 ; 28 + const BATTLE_BG_EFFECT_BETA_SEND_OUT_MON2 ; 29 + const BATTLE_BG_EFFECT_FLAIL ; 2a + const BATTLE_BG_EFFECT_BETA_PURSUIT ; 2b + const BATTLE_BG_EFFECT_ROLLOUT ; 2c + const BATTLE_BG_EFFECT_VITAL_THROW ; 2d ;const ANIM_BG_30 ;const ANIM_BG_31 ;const ANIM_BG_32 @@ -759,55 +748,63 @@ DEF const_value = $b1 ;const ANIM_BG_WOBBLE_MON ;const ANIM_BG_35 +; wBattleAnimTileDict keys (see wram.asm) ; AnimObjGFX indexes (see data/battle_anims/object_gfx.asm) const_def 1 - const ANIM_GFX_HIT - const ANIM_GFX_CUT - const ANIM_GFX_FIRE - const ANIM_GFX_WATER - const ANIM_GFX_LIGHTNING - const ANIM_GFX_PLANT - const ANIM_GFX_SMOKE - const ANIM_GFX_EXPLOSION - const ANIM_GFX_ROCKS - const ANIM_GFX_ICE - const ANIM_GFX_POKE_BALL - const ANIM_GFX_POISON - const ANIM_GFX_BUBBLE - const ANIM_GFX_NOISE - const ANIM_GFX_POWDER - const ANIM_GFX_BEAM - const ANIM_GFX_SPEED - const ANIM_GFX_CHARGE - const ANIM_GFX_WIND - const ANIM_GFX_WHIP - const ANIM_GFX_EGG - const ANIM_GFX_ROPE - const ANIM_GFX_PSYCHIC - const ANIM_GFX_REFLECT - const ANIM_GFX_STATUS - const ANIM_GFX_SAND - const ANIM_GFX_WEB - const ANIM_GFX_HAZE - const ANIM_GFX_HORN - const ANIM_GFX_FLOWER - const ANIM_GFX_MISC - const ANIM_GFX_SKY_ATTACK - const ANIM_GFX_GLOBE - const ANIM_GFX_SHAPES - const ANIM_GFX_OBJECTS - const ANIM_GFX_SHINE - const ANIM_GFX_ANGELS - const ANIM_GFX_WAVE - const ANIM_GFX_AEROBLAST + const BATTLE_ANIM_GFX_HIT ; 01 + const BATTLE_ANIM_GFX_CUT ; 02 + const BATTLE_ANIM_GFX_FIRE ; 03 + const BATTLE_ANIM_GFX_WATER ; 04 + const BATTLE_ANIM_GFX_LIGHTNING ; 05 + const BATTLE_ANIM_GFX_PLANT ; 06 + const BATTLE_ANIM_GFX_SMOKE ; 07 + const BATTLE_ANIM_GFX_EXPLOSION ; 08 + const BATTLE_ANIM_GFX_ROCKS ; 09 + const BATTLE_ANIM_GFX_ICE ; 0a + const BATTLE_ANIM_GFX_POKE_BALL ; 0b + const BATTLE_ANIM_GFX_POISON ; 0c + const BATTLE_ANIM_GFX_BUBBLE ; 0d + const BATTLE_ANIM_GFX_NOISE ; 0e + const BATTLE_ANIM_GFX_POWDER ; 0f + const BATTLE_ANIM_GFX_BEAM ; 10 + const BATTLE_ANIM_GFX_SPEED ; 11 + const BATTLE_ANIM_GFX_CHARGE ; 12 + const BATTLE_ANIM_GFX_WIND ; 13 + const BATTLE_ANIM_GFX_WHIP ; 14 + const BATTLE_ANIM_GFX_EGG ; 15 + const BATTLE_ANIM_GFX_ROPE ; 16 + const BATTLE_ANIM_GFX_PSYCHIC ; 17 + const BATTLE_ANIM_GFX_REFLECT ; 18 + const BATTLE_ANIM_GFX_STATUS ; 19 + const BATTLE_ANIM_GFX_SAND ; 1a + const BATTLE_ANIM_GFX_WEB ; 1b + const BATTLE_ANIM_GFX_HAZE ; 1c + const BATTLE_ANIM_GFX_HORN ; 1d + const BATTLE_ANIM_GFX_FLOWER ; 1e + const BATTLE_ANIM_GFX_MISC ; 1f + const BATTLE_ANIM_GFX_SKY_ATTACK ; 20 + const BATTLE_ANIM_GFX_GLOBE ; 21 + const BATTLE_ANIM_GFX_SHAPES ; 22 + const BATTLE_ANIM_GFX_OBJECTS ; 23 + const BATTLE_ANIM_GFX_SHINE ; 24 + const BATTLE_ANIM_GFX_ANGELS ; 25 + const BATTLE_ANIM_GFX_PLAYERHEAD ; 26 + const BATTLE_ANIM_GFX_ENEMYFEET ; 27 +DEF NUM_BATTLE_ANIM_GFX EQU const_value - 1 ; battle_bg_effect struct members (see macros/wram.asm) const_def const BG_EFFECT_STRUCT_FUNCTION const BG_EFFECT_STRUCT_JT_INDEX const BG_EFFECT_STRUCT_BATTLE_TURN - const BG_EFFECT_STRUCT_03 + const BG_EFFECT_STRUCT_PARAM DEF BG_EFFECT_STRUCT_LENGTH EQU const_value +DEF NUM_BG_EFFECTS EQU 5 ; see wActiveBGEffects + +; anim_bgeffect battle turn values for some effects + const_def + const BG_EFFECT_TARGET ; 0 + const BG_EFFECT_USER ; 1 ; battle palettes const_def diff --git a/constants/move_constants.asm b/constants/move_constants.asm index 95e69b3..9ac0bd1 100644 --- a/constants/move_constants.asm +++ b/constants/move_constants.asm @@ -273,24 +273,22 @@ DEF NUM_ATTACKS EQU const_value - 1 const ANIM_IN_LOVE ; 10a const ANIM_IN_SANDSTORM ; 10b const ANIM_IN_NIGHTMARE ; 10c - const ANIM_IN_WHIRLPOOL ; 10d ; battle anims - const ANIM_MISS ; 10e - const ANIM_ENEMY_DAMAGE ; 10f - const ANIM_ENEMY_STAT_DOWN ; 110 - const ANIM_PLAYER_STAT_DOWN ; 111 - const ANIM_PLAYER_DAMAGE ; 112 - const ANIM_WOBBLE ; 113 - const ANIM_SHAKE ; 114 - const ANIM_HIT_CONFUSION ; 115 + const ANIM_MISS ; 10d + const ANIM_DAMAGE ; 10e + const ANIM_SHAKE_HORIZONTAL_UNUSED ; 10f + const ANIM_PLAYER_STAT_DOWN ; 110 + const ANIM_BLINK_ENEMY_MON_UNUSED ; 111 + const ANIM_SHAKE_HORIZONTAL_UNUSED_2 ; 112 + const ANIM_ENEMY_STAT_DOWN ; 113 +DEF NUM_BATTLE_ANIMS EQU const_value - 1 ; wNumHits uses offsets from ANIM_MISS const_def const BATTLEANIM_NONE - const BATTLEANIM_ENEMY_DAMAGE - const BATTLEANIM_ENEMY_STAT_DOWN + const BATTLEANIM_DAMAGE + const BATTLEANIM_SHAKE_HORIZONTAL_UNUSED const BATTLEANIM_PLAYER_STAT_DOWN - const BATTLEANIM_PLAYER_DAMAGE - const BATTLEANIM_WOBBLE - const BATTLEANIM_SHAKE - const BATTLEANIM_HIT_CONFUSION + const BATTLEANIM_BLINK_ENEMY_MON_UNUSED + const BATTLEANIM_SHAKE_HORIZONTAL_UNUSED_2 + const BATTLEANIM_ENEMY_STAT_DOWN diff --git a/constants/sfx_constants.asm b/constants/sfx_constants.asm index 1b136f8..0120799 100644 --- a/constants/sfx_constants.asm +++ b/constants/sfx_constants.asm @@ -1,34 +1,113 @@ -; TODO - -DEF SFX_POTION EQU $01 -DEF SFX_FULL_HEAL EQU $02 -DEF SFX_MENU EQU $03 -DEF SFX_READ_TEXT EQU $04 -DEF SFX_READ_TEXT_2 EQU $05 -DEF SFX_BOOT_PC EQU $0A -DEF SFX_ESCAPE_ROPE EQU $0B ; player shrink -DEF SFX_WRONG EQU $14 -DEF SFX_SWITCH_POKEMON EQU $1B -DEF SFX_1E EQU $1E -DEF SFX_POKEFLUTE EQU $21 -DEF SFX_22 EQU $22 -DEF SFX_24 EQU $24 -DEF SFX_25 EQU $25 -DEF SFX_POKEDEX_REGISTRATION EQU $27 -DEF SFX_TITLE_ENTRANCE EQU $2D -DEF SFX_PAY_DAY EQU $30 -DEF SFX_GAME_FREAK_LOGO_RG EQU $31 - -DEF SFX_SHINE EQU $62 +; SFX indexes (see audio/sfx_pointers.asm) +; Asterisk (*) means the sound effect is an unused leftover from Generation I. + const_def + const SFX_BALL_WOBBLE ; 00 + const SFX_POTION ; 01 + const SFX_FULL_HEAL ; 02 + const SFX_MENU ; 03 + const SFX_READ_TEXT ; 04 + const SFX_READ_TEXT_2 ; 05 + const SFX_POISON ; 06 + const SFX_TRADE_MACHINE ; 07* + const SFX_BOOT_PC ; 08* + const SFX_SHUT_DOWN_PC ; 09* + const SFX_CHOOSE_PC_OPTION ; 0a, used when booting PC + const SFX_ESCAPE_ROPE ; 0b, player shrink + const SFX_PRESS_SWITCH ; 0c* + const SFX_HEALING_MACHINE ; 0d* + const SFX_WARP_TO ; 0e, SFX_TELEPORT_EXIT_1 in pokered + const SFX_TELEPORT_ENTER_1 ; 0f* + const SFX_TELEPORT_EXIT_2 ; 10* + const SFX_JUMP_OVER_LEDGE ; 11* + const SFX_TELEPORT_ENTER_2 ; 12* + const SFX_FLY ; 13* + const SFX_WRONG ; 14 + const SFX_ARROW_TILES ; 15* + const SFX_STRENGTH ; 16 + const SFX_MEGAPHONE ; 17, SFX_SS_ANNE_HORN in pokered + const SFX_WITHDRAW_DEPOSIT ; 18* + const SFX_CUT_RG ; 19* + const SFX_GO_INSIDE ; 1a* + const SFX_SWITCH_POKEMON ; 1b + const SFX_BELLY_DRUM ; 1c, SFX_59 in pokered + const SFX_PURCHASE ; 1d* + const SFX_COLLISION ; 1e, only used in debug + const SFX_GO_OUTSIDE ; 1f* + const SFX_SAVE ; 20 + const SFX_POKEFLUTE ; 21 + const SFX_SAFARI_ZONE_PA ; 22* + const SFX_THROW_BALL ; 23* + const SFX_BALL_POOF ; 24* + const SFX_FAINT ; 25 + const SFX_RUN ; 26 + const SFX_POKEDEX_REGISTRATION ; 27 + const SFX_INTRO_LUNGE_RG ; 28* + const SFX_UNKNOWN_29 ; 29*, doesn't match pokered + const SFX_UNKNOWN_2A ; 2a*, doesn't match pokered + const SFX_INTRO_RAISE_RG ; 2b* + const SFX_INTRO_CRASH_RG ; 2c* + const SFX_TITLE_ENTRANCE ; 2d, SFX_INTRO_WHOOSH in pokered + const SFX_SLOTS_STOP_WHEEL ; 2e* + const SFX_SLOTS_REWARD ; 2f* + const SFX_PAY_DAY ; 30, SFX_SLOTS_NEW_SPIN in pokered + const SFX_GAME_FREAK_LOGO_RG ; 31 + const SFX_PECK ; 32 + const SFX_KINESIS ; 33 + const SFX_LICK ; 34 + const SFX_POUND ; 35 + const SFX_THRASH ; 36, SFX_MOVE_PUZZLE_PIECE in pokegold + const SFX_COMET_PUNCH ; 37 + const SFX_MEGA_PUNCH ; 38 + const SFX_SCRATCH ; 39 + const SFX_VICEGRIP ; 3a + const SFX_RAZOR_WIND ; 3b + const SFX_CUT ; 3c + const SFX_WING_ATTACK ; 3d + const SFX_WHIRLWIND ; 3e + const SFX_BIND ; 3f + const SFX_VINE_WHIP ; 40 + const SFX_DOUBLE_KICK ; 41 + const SFX_MEGA_KICK ; 42 + const SFX_HEADBUTT ; 43 + const SFX_HORN_ATTACK ; 44 + const SFX_TACKLE ; 45 + const SFX_POISON_STING ; 46 + const SFX_POWDER ; 47 + const SFX_DOUBLESLAP ; 48 + const SFX_BITE ; 49 + const SFX_JUMP_KICK ; 4a + const SFX_STOMP ; 4b + const SFX_TAIL_WHIP ; 4c + const SFX_KARATE_CHOP ; 4d + const SFX_SUBMISSION ; 4e + const SFX_WATER_GUN ; 4f + const SFX_SWORDS_DANCE ; 50 + const SFX_THUNDER ; 51 + const SFX_SUPERSONIC ; 52 + const SFX_LEER ; 53 + const SFX_EMBER ; 54 + const SFX_BUBBLEBEAM ; 55 + const SFX_HYDRO_PUMP ; 56 + const SFX_SURF ; 57 + const SFX_PSYBEAM ; 58 + const SFX_CHARGE ; 59 + const SFX_THUNDERSHOCK ; 5a + const SFX_PSYCHIC ; 5b + const SFX_SCREECH ; 5c + const SFX_BONE_CLUB ; 5d + const SFX_SHARPEN ; 5e + const SFX_EGG_BOMB ; 5f + const SFX_SING ; 60 + const SFX_HYPER_BEAM ; 61 + const SFX_SHINE ; 62 ; R/G/B/Y fanfares -DEF SFX_GET_ITEM_RG EQU $63 -DEF SFX_UNUSED_FANFARE_1 EQU $64 -DEF SFX_POKEDEX_EVALUATION_RG EQU $65 -DEF SFX_LEVEL_UP_RG EQU $66 -DEF SFX_EVOLUTION_COMPLETE_RG EQU $67 -DEF SFX_GET_KEY_ITEM_RG EQU $68 -DEF SFX_UNUSED_FANFARE_2 EQU $69 -DEF SFX_CAUGHT_POKEMON_RG EQU $6A -DEF SFX_UNUSED_FANFARE_3 EQU $6B - + const SFX_GET_ITEM_RG ; 63 + const SFX_UNUSED_FANFARE_1 ; 64 + const SFX_POKEDEX_EVALUATION_RG ; 65 + const SFX_LEVEL_UP_RG ; 66 + const SFX_EVOLUTION_COMPLETE_RG ; 67 + const SFX_GET_KEY_ITEM_RG ; 68 + const SFX_UNUSED_FANFARE_2 ; 69* + const SFX_CAUGHT_POKEMON_RG ; 6a* + const SFX_UNUSED_FANFARE_3 ; 6b* diff --git a/constants/wram_constants.asm b/constants/wram_constants.asm index 237b5b7..4a3f1e4 100644 --- a/constants/wram_constants.asm +++ b/constants/wram_constants.asm @@ -102,4 +102,11 @@ DEF TOOLGEAR_COORDS_F EQU 0 DEF OVERWORLD_MINUTE_TIME_F EQU 7 ; wTimeOfDayPalFlags:: -DEF CLEAR_PALSET_F EQU 7 \ No newline at end of file +DEF CLEAR_PALSET_F EQU 7 + +; wBattleAnimFlags:: +const_def +const BATTLEANIM_STOP_F ; 0 +const BATTLEANIM_IN_SUBROUTINE_F ; 1 +const BATTLEANIM_IN_LOOP_F ; 2 +const BATTLEANIM_KEEPSPRITES_F ; 3 diff --git a/data/battle_anims/framesets.inc b/data/battle_anims/framesets.inc new file mode 100644 index 0000000..6718ecb --- /dev/null +++ b/data/battle_anims/framesets.inc @@ -0,0 +1,1252 @@ +BattleAnimFrameData: +; entries correspond to BATTLE_ANIM_FRAMESET_* constants + table_width 2, BattleAnimFrameData + dw .Frameset_HitBig + dw .Frameset_Hit ; BATTLE_ANIM_FRAMESET_HIT + dw .Frameset_HitSmall ; BATTLE_ANIM_FRAMESET_HIT_SMALL + dw .Frameset_Punch ; BATTLE_ANIM_FRAMESET_PUNCH + dw .Frameset_Kick ; BATTLE_ANIM_FRAMESET_KICK + dw .Frameset_Palm ; BATTLE_ANIM_FRAMESET_PALM + dw .Frameset_Fang ; BATTLE_ANIM_FRAMESET_FANG + dw .Frameset_PunchShake ; BATTLE_ANIM_FRAMESET_PUNCH_SHAKE + dw .Frameset_BallPoof ; BATTLE_ANIM_FRAMESET_BALL_POOF + dw .Frameset_PokeBall1 ; BATTLE_ANIM_FRAMESET_POKE_BALL_1 + dw .Frameset_PokeBall2 ; BATTLE_ANIM_FRAMESET_POKE_BALL_2 + dw .Frameset_PokeBall3 ; BATTLE_ANIM_FRAMESET_POKE_BALL_3 + dw .Frameset_PokeBall4 ; BATTLE_ANIM_FRAMESET_POKE_BALL_4 + dw .Frameset_PokeBall5 ; BATTLE_ANIM_FRAMESET_POKE_BALL_5 + dw .Frameset_DragonRage ; BATTLE_ANIM_FRAMESET_DRAGON_RAGE + dw .Frameset_Flamethrower ; BATTLE_ANIM_FRAMESET_FLAMETHROWER + dw .Frameset_Ember ; BATTLE_ANIM_FRAMESET_EMBER + dw .Frameset_Burned ; BATTLE_ANIM_FRAMESET_BURNED + dw .Frameset_Blizzard ; BATTLE_ANIM_FRAMESET_BLIZZARD + dw .Frameset_Ice ; BATTLE_ANIM_FRAMESET_ICE + dw .Frameset_IceBeam ; BATTLE_ANIM_FRAMESET_ICE_BEAM + dw .Frameset_PowderSnow ; BATTLE_ANIM_FRAMESET_POWDER_SNOW + dw .Frameset_RazorLeaf1 ; BATTLE_ANIM_FRAMESET_RAZOR_LEAF_1 + dw .Frameset_RazorLeaf2 ; BATTLE_ANIM_FRAMESET_RAZOR_LEAF_2 + dw .Frameset_Explosion ; BATTLE_ANIM_FRAMESET_EXPLOSION + dw .Frameset_BigRock ; BATTLE_ANIM_FRAMESET_BIG_ROCK + dw .Frameset_SmallRock ; BATTLE_ANIM_FRAMESET_SMALL_ROCK + dw .Frameset_Strength ; BATTLE_ANIM_FRAMESET_STRENGTH + dw .Frameset_SkullCrossbone ; BATTLE_ANIM_FRAMESET_SKULL_CROSSBONE + dw .Frameset_Acid ; BATTLE_ANIM_FRAMESET_ACID + dw .Frameset_PoisonDropletUnused ; BATTLE_ANIM_FRAMESET_POISON_DROPLET_UNUSED + dw .Frameset_SludgeBubble ; BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE + dw .Frameset_SludgeBubbleBurst ; BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE_BURST + dw .Frameset_SmallBubble ; BATTLE_ANIM_FRAMESET_SMALL_BUBBLE + dw .Frameset_PulsingBubble ; BATTLE_ANIM_FRAMESET_PULSING_BUBBLE + dw .Frameset_Surf ; BATTLE_ANIM_FRAMESET_SURF + dw .Frameset_MusicNote1 ; BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1 + dw .Frameset_MusicNote2 ; BATTLE_ANIM_FRAMESET_MUSIC_NOTE_2 + dw .Frameset_MusicNote3 ; BATTLE_ANIM_FRAMESET_MUSIC_NOTE_3 + dw .Frameset_WaterGun1 ; BATTLE_ANIM_FRAMESET_WATER_GUN_1 + dw .Frameset_WaterGun2 ; BATTLE_ANIM_FRAMESET_WATER_GUN_2 + dw .Frameset_WaterGun3 ; BATTLE_ANIM_FRAMESET_WATER_GUN_3 + dw .Frameset_HydroPump ; BATTLE_ANIM_FRAMESET_HYDRO_PUMP + dw .Frameset_Powder ; BATTLE_ANIM_FRAMESET_POWDER + dw .Frameset_Beam ; BATTLE_ANIM_FRAMESET_BEAM + dw .Frameset_BeamTip ; BATTLE_ANIM_FRAMESET_BEAM_TIP + dw .Frameset_IceBuildup ; BATTLE_ANIM_FRAMESET_ICE_BUILDUP + dw .Frameset_Frozen ; BATTLE_ANIM_FRAMESET_FROZEN + dw .Frameset_CirclingSparkle ; BATTLE_ANIM_FRAMESET_CIRCLING_SPARKLE + dw .Frameset_ThunderCenter ; BATTLE_ANIM_FRAMESET_THUNDER_CENTER + dw .Frameset_ThunderLeft ; BATTLE_ANIM_FRAMESET_THUNDER_LEFT + dw .Frameset_ThunderRight ; BATTLE_ANIM_FRAMESET_THUNDER_RIGHT + dw .Frameset_ThunderWaveDisable ; BATTLE_ANIM_FRAMESET_THUNDER_WAVE_DISABLE + dw .Frameset_ThunderWaveExtra ; BATTLE_ANIM_FRAMESET_THUNDER_WAVE_EXTRA + dw .Frameset_ThunderBoltSparks ; BATTLE_ANIM_FRAMESET_THUNDERBOLT_SPARKS + dw .Frameset_ThunderBoltCore ; BATTLE_ANIM_FRAMESET_THUNDERBOLT_CORE + dw .Frameset_ThunderShockSparks ; BATTLE_ANIM_FRAMESET_THUNDERSHOCK_SPARKS + dw .Frameset_ThunderShockCore ; BATTLE_ANIM_FRAMESET_THUNDERSHOCK_CORE + dw .Frameset_Clamp ; BATTLE_ANIM_FRAMESET_CLAMP + dw .Frameset_ClampFlipped ; BATTLE_ANIM_FRAMESET_CLAMP_FLIPPED + dw .Frameset_Bite1 ; BATTLE_ANIM_FRAMESET_BITE_1 + dw .Frameset_Bite2 ; BATTLE_ANIM_FRAMESET_BITE_2 + dw .Frameset_CutDownLeft ; BATTLE_ANIM_FRAMESET_CUT_DOWN_LEFT + dw .Frameset_CutDownRight ; BATTLE_ANIM_FRAMESET_CUT_DOWN_RIGHT + dw .Frameset_CutUpRight ; BATTLE_ANIM_FRAMESET_CUT_UP_RIGHT + dw .Frameset_CutLongDownLeft ; BATTLE_ANIM_FRAMESET_CUT_LONG_DOWN_LEFT + dw .Frameset_CutLongDownRight ; BATTLE_ANIM_FRAMESET_CUT_LONG_DOWN_RIGHT + dw .Frameset_ChargeOrb1 ; BATTLE_ANIM_FRAMESET_CHARGE_ORB_1 + dw .Frameset_AbsorbCenter ; BATTLE_ANIM_FRAMESET_ABSORB_CENTER + dw .Frameset_Gust ; BATTLE_ANIM_FRAMESET_GUST + dw .Frameset_VineWhip1 ; BATTLE_ANIM_FRAMESET_VINE_WHIP_1 + dw .Frameset_VineWhip2 ; BATTLE_ANIM_FRAMESET_VINE_WHIP_2 + dw .Frameset_RazorWind1 ; BATTLE_ANIM_FRAMESET_RAZOR_WIND_1 + dw .Frameset_RazorWind2 ; BATTLE_ANIM_FRAMESET_RAZOR_WIND_2 + dw .Frameset_Sonicboom ; BATTLE_ANIM_FRAMESET_SONICBOOM + dw .Frameset_Warp ; BATTLE_ANIM_FRAMESET_WARP + dw .Frameset_ChargeOrb2 ; BATTLE_ANIM_FRAMESET_CHARGE_ORB_2 + dw .Frameset_Egg ; BATTLE_ANIM_FRAMESET_EGG + dw .Frameset_EggWobble ; BATTLE_ANIM_FRAMESET_EGG_WOBBLE + dw .Frameset_EggCrackedTop ; BATTLE_ANIM_FRAMESET_EGG_CRACKED_TOP + dw .Frameset_EggCrackedBottom ; BATTLE_ANIM_FRAMESET_EGG_CRACKED_BOTTOM + dw .Frameset_Focus ; BATTLE_ANIM_FRAMESET_FOCUS + dw .Frameset_Bind1 ; BATTLE_ANIM_FRAMESET_BIND_1 + dw .Frameset_Bind2 ; BATTLE_ANIM_FRAMESET_BIND_2 + dw .Frameset_Bind3 ; BATTLE_ANIM_FRAMESET_BIND_3 + dw .Frameset_Bind4 ; BATTLE_ANIM_FRAMESET_BIND_4 + dw .Frameset_LeechSeed1 ; BATTLE_ANIM_FRAMESET_LEECH_SEED_1 + dw .Frameset_LeechSeed2 ; BATTLE_ANIM_FRAMESET_LEECH_SEED_2 + dw .Frameset_LeechSeed3 ; BATTLE_ANIM_FRAMESET_LEECH_SEED_3 + dw .Frameset_Sound1 ; BATTLE_ANIM_FRAMESET_SOUND_1 + dw .Frameset_Sound2 ; BATTLE_ANIM_FRAMESET_SOUND_2 + dw .Frameset_Sound3 ; BATTLE_ANIM_FRAMESET_SOUND_3 + dw .Frameset_Wave ; BATTLE_ANIM_FRAMESET_WAVE + dw .Frameset_ConfuseRay1 ; BATTLE_ANIM_FRAMESET_CONFUSE_RAY_1 + dw .Frameset_ConfuseRay2 ; BATTLE_ANIM_FRAMESET_CONFUSE_RAY_2 + dw .Frameset_Leer ; BATTLE_ANIM_FRAMESET_LEER + dw .Frameset_Reflect ; BATTLE_ANIM_FRAMESET_REFLECT + dw .Frameset_Chick1 ; BATTLE_ANIM_FRAMESET_CHICK_1 + dw .Frameset_Chick2 ; BATTLE_ANIM_FRAMESET_CHICK_2 + dw .Frameset_Amnesia1 ; BATTLE_ANIM_FRAMESET_AMNESIA_1 + dw .Frameset_Amnesia2 ; BATTLE_ANIM_FRAMESET_AMNESIA_2 + dw .Frameset_Amnesia3 ; BATTLE_ANIM_FRAMESET_AMNESIA_3 + dw .Frameset_Asleep ; BATTLE_ANIM_FRAMESET_ASLEEP + dw .Frameset_DigSand ; BATTLE_ANIM_FRAMESET_DIG_SAND + dw .Frameset_DigPile ; BATTLE_ANIM_FRAMESET_DIG_PILE + dw .Frameset_Sand ; BATTLE_ANIM_FRAMESET_SAND + dw .Frameset_StringShot1 ; BATTLE_ANIM_FRAMESET_STRING_SHOT_1 + dw .Frameset_StringShot2 ; BATTLE_ANIM_FRAMESET_STRING_SHOT_2 + dw .Frameset_StringShot3 ; BATTLE_ANIM_FRAMESET_STRING_SHOT_3 + dw .Frameset_Paralyzed ; BATTLE_ANIM_FRAMESET_PARALYZED + dw .Frameset_ParalyzedFlipped ; BATTLE_ANIM_FRAMESET_PARALYZED_FLIPPED + dw .Frameset_Haze ; BATTLE_ANIM_FRAMESET_HAZE + dw .Frameset_Mist ; BATTLE_ANIM_FRAMESET_MIST + dw .Frameset_Horn ; BATTLE_ANIM_FRAMESET_HORN + dw .Frameset_Needle ; BATTLE_ANIM_FRAMESET_NEEDLE + dw .Frameset_Flower ; BATTLE_ANIM_FRAMESET_FLOWER + dw .Frameset_BarrageBall ; BATTLE_ANIM_FRAMESET_BARRAGE_BALL + dw .Frameset_PayDay ; BATTLE_ANIM_FRAMESET_PAY_DAY + dw .Frameset_Heart ; BATTLE_ANIM_FRAMESET_HEART + dw .Frameset_SpinningBone ; BATTLE_ANIM_FRAMESET_SPINNING_BONE + dw .Frameset_Star ; BATTLE_ANIM_FRAMESET_STAR + dw .Frameset_Spoon ; BATTLE_ANIM_FRAMESET_SPOON + dw .Frameset_Sparkle ; BATTLE_ANIM_FRAMESET_SPARKLE + dw .Frameset_SkyAttack ; BATTLE_ANIM_FRAMESET_SKY_ATTACK + dw .Frameset_Lick ; BATTLE_ANIM_FRAMESET_LICK + dw .Frameset_WithdrawShell ; BATTLE_ANIM_FRAMESET_WITHDRAW_SHELL + dw .Frameset_ShrinkingChargeOrb ; BATTLE_ANIM_FRAMESET_SHRINKING_CHARGE_ORB + dw .Frameset_Conversion ; BATTLE_ANIM_FRAMESET_CONVERSION + dw .Frameset_Sword ; BATTLE_ANIM_FRAMESET_SWORD + dw .Frameset_SpeedLine1 ; BATTLE_ANIM_FRAMESET_SPEED_LINE_1 + dw .Frameset_SpeedLine2 ; BATTLE_ANIM_FRAMESET_SPEED_LINE_2 + dw .Frameset_SpeedLine3 ; BATTLE_ANIM_FRAMESET_SPEED_LINE_3 + dw .Frameset_SeismicToss ; BATTLE_ANIM_FRAMESET_SEISMIC_TOSS + dw .Frameset_Sharpen ; BATTLE_ANIM_FRAMESET_SHARPEN + dw .Frameset_DefenseCurl ; BATTLE_ANIM_FRAMESET_DEFENSE_CURL + dw .Frameset_MetronomeHand ; BATTLE_ANIM_FRAMESET_METRONOME_HAND + dw .Frameset_Agility ; BATTLE_ANIM_FRAMESET_AGILITY + dw .Frameset_Cotton ; BATTLE_ANIM_FRAMESET_COTTON + dw .Frameset_MilkBottle ; BATTLE_ANIM_FRAMESET_MILK_BOTTLE + dw .Frameset_Spike ; BATTLE_ANIM_FRAMESET_SPIKE + dw .Frameset_AngerVein ; BATTLE_ANIM_FRAMESET_ANGER_VEIN + dw .Frameset_BellChime ; BATTLE_ANIM_FRAMESET_BELL_CHIME + dw .Frameset_BatonPass ; BATTLE_ANIM_FRAMESET_BATON_PASS + dw .Frameset_LockOn1 ; BATTLE_ANIM_FRAMESET_LOCK_ON_1 + dw .Frameset_LockOn2 ; BATTLE_ANIM_FRAMESET_LOCK_ON_2 + dw .Frameset_LockOn3 ; BATTLE_ANIM_FRAMESET_LOCK_ON_3 + dw .Frameset_LockOn4 ; BATTLE_ANIM_FRAMESET_LOCK_ON_4 + dw .Frameset_MindReader1 ; BATTLE_ANIM_FRAMESET_MIND_READER_1 + dw .Frameset_MindReader2 ; BATTLE_ANIM_FRAMESET_MIND_READER_2 + dw .Frameset_MindReader3 ; BATTLE_ANIM_FRAMESET_MIND_READER_3 + dw .Frameset_MindReader4 ; BATTLE_ANIM_FRAMESET_MIND_READER_4 + dw .Frameset_Safeguard ; BATTLE_ANIM_FRAMESET_SAFEGUARD + dw .Frameset_Megaphone ; BATTLE_ANIM_FRAMESET_MEGAPHONE + dw .Frameset_ItemBag ; BATTLE_ANIM_FRAMESET_ITEM_BAG + dw .Frameset_SpiderWeb ; BATTLE_ANIM_FRAMESET_SPIDER_WEB + dw .Frameset_TemptCake ; BATTLE_ANIM_FRAMESET_TEMPT_CAKE + dw .Frameset_Imp ; BATTLE_ANIM_FRAMESET_IMP + dw .Frameset_ImpFlipped ; BATTLE_ANIM_FRAMESET_IMP_FLIPPED + dw .Frameset_Cherub ; BATTLE_ANIM_FRAMESET_CHERUB + dw .Frameset_Pencil ; BATTLE_ANIM_FRAMESET_PENCIL + dw .Frameset_EncoreHand ; BATTLE_ANIM_FRAMESET_ENCORE_HAND + dw .Frameset_EncoreHandFlipped ; BATTLE_ANIM_FRAMESET_ENCORE_HAND_FLIPPED + dw .Frameset_DestinyBond ; BATTLE_ANIM_FRAMESET_DESTINY_BOND + dw .Frameset_MorningSun ; BATTLE_ANIM_FRAMESET_MORNING_SUN + dw .Frameset_Glimmer ; BATTLE_ANIM_FRAMESET_GLIMMER + dw .Frameset_Moonlight ; BATTLE_ANIM_FRAMESET_MOONLIGHT + dw .Frameset_CrossCutter1 ; BATTLE_ANIM_FRAMESET_CROSS_CUTTER_1 + dw .Frameset_CrossCutter2 ; BATTLE_ANIM_FRAMESET_CROSS_CUTTER_2 + dw .Frameset_ZapCannon ; BATTLE_ANIM_FRAMESET_ZAP_CANNON + dw .Frameset_CurseNail ; BATTLE_ANIM_FRAMESET_NAIL_DOWN + dw .Frameset_ForesightShine ; BATTLE_ANIM_FRAMESET_FORESIGHT_SHINE + dw .Frameset_RapidSpin ; BATTLE_ANIM_FRAMESET_RAPID_SPIN + dw .Frameset_Swagger ; BATTLE_ANIM_FRAMESET_SWAGGER + dw .Frameset_Stalker ; BATTLE_ANIM_FRAMESET_STALKER + dw .Frameset_UpsideDownPunch ; BATTLE_ANIM_FRAMESET_UPSIDE_DOWN_PUNCH + dw .Frameset_GrowingSparkle ; BATTLE_ANIM_FRAMESET_GROWING_SPARKLE + dw .Frameset_Rain1 ; BATTLE_ANIM_FRAMESET_RAIN_1 + dw .Frameset_Rain2 ; BATTLE_ANIM_FRAMESET_RAIN_2 + dw .Frameset_Rain3 ; BATTLE_ANIM_FRAMESET_RAIN_3 + dw .Frameset_EnemyFeet1Row ; BATTLE_ANIM_FRAMESET_ENEMYFEET_1ROW + dw .Frameset_PlayerHead1Row ; BATTLE_ANIM_FRAMESET_PLAYERHEAD_1ROW + dw .Frameset_EnemyFeet2Row ; BATTLE_ANIM_FRAMESET_ENEMYFEET_2ROW + dw .Frameset_PlayerHead2Row ; BATTLE_ANIM_FRAMESET_PLAYERHEAD_2ROW + assert_table_length NUM_BATTLE_ANIM_FRAMESETS + +.Frameset_HitBig: + oamframe BATTLE_ANIM_OAMSET_00, 6 + oamdelete + +.Frameset_Hit: + oamframe BATTLE_ANIM_OAMSET_01, 6 + oamdelete + +.Frameset_HitSmall: + oamframe BATTLE_ANIM_OAMSET_02, 6 + oamdelete + +.Frameset_Punch: + oamframe BATTLE_ANIM_OAMSET_03, 6 + oamdelete + +.Frameset_Kick: + oamframe BATTLE_ANIM_OAMSET_04, 6 + oamdelete + +.Frameset_Palm: + oamframe BATTLE_ANIM_OAMSET_05, 6 + oamdelete + +.Frameset_Fang: + oamframe BATTLE_ANIM_OAMSET_06, 6 + oamdelete + +.Frameset_PunchShake: + oamframe BATTLE_ANIM_OAMSET_03, 4 + oamframe BATTLE_ANIM_OAMSET_01, 1 + oamframe BATTLE_ANIM_OAMSET_03, 4 + oamframe BATTLE_ANIM_OAMSET_01, 1 + oamframe BATTLE_ANIM_OAMSET_03, 4 + oamframe BATTLE_ANIM_OAMSET_01, 1 + oamframe BATTLE_ANIM_OAMSET_03, 4 + oamframe BATTLE_ANIM_OAMSET_01, 1 + oamdelete + +.Frameset_CutDownLeft: + oamframe BATTLE_ANIM_OAMSET_4B, 2 + oamframe BATTLE_ANIM_OAMSET_4C, 2 + oamframe BATTLE_ANIM_OAMSET_4D, 4 + oamframe BATTLE_ANIM_OAMSET_4E, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_4E, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_4E, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_4E, 2 + oamdelete + +.Frameset_CutDownRight: + oamframe BATTLE_ANIM_OAMSET_4B, 2, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_4C, 2, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_4D, 4, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_4E, 2, OAM_X_FLIP + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_4E, 2, OAM_X_FLIP + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_4E, 2, OAM_X_FLIP + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_4E, 2, OAM_X_FLIP + oamdelete + +.Frameset_CutUpRight: + oamframe BATTLE_ANIM_OAMSET_4B, 2, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_4C, 2, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_4D, 4, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_4E, 2, OAM_X_FLIP, OAM_Y_FLIP + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_4E, 2, OAM_X_FLIP, OAM_Y_FLIP + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_4E, 2, OAM_X_FLIP, OAM_Y_FLIP + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_4E, 2, OAM_X_FLIP, OAM_Y_FLIP + oamdelete + +.Frameset_CutLongDownLeft: + oamframe BATTLE_ANIM_OAMSET_4B, 1 + oamframe BATTLE_ANIM_OAMSET_4C, 1 + oamframe BATTLE_ANIM_OAMSET_4D, 1 + oamframe BATTLE_ANIM_OAMSET_4F, 1 + oamframe BATTLE_ANIM_OAMSET_50, 1 + oamframe BATTLE_ANIM_OAMSET_51, 1 + oamframe BATTLE_ANIM_OAMSET_52, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_52, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_52, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_52, 2 + oamdelete + +.Frameset_CutLongDownRight: + oamframe BATTLE_ANIM_OAMSET_4B, 1, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_4C, 1, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_4D, 1, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_4F, 1, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_50, 1, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_51, 1, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_52, 2, OAM_X_FLIP + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_52, 2, OAM_X_FLIP + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_52, 2, OAM_X_FLIP + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_52, 2, OAM_X_FLIP + oamdelete + +.Frameset_BallPoof: + oamframe BATTLE_ANIM_OAMSET_00, 3 + oamframe BATTLE_ANIM_OAMSET_07, 3 + oamframe BATTLE_ANIM_OAMSET_08, 3 + oamframe BATTLE_ANIM_OAMSET_09, 3 + oamdelete + +.Frameset_PokeBall1: + oamframe BATTLE_ANIM_OAMSET_0A, 7 + oamframe BATTLE_ANIM_OAMSET_0B, 7 + oamframe BATTLE_ANIM_OAMSET_0A, 7 + oamframe BATTLE_ANIM_OAMSET_0B, 7, OAM_X_FLIP + oamrestart + +.Frameset_PokeBall2: + oamframe BATTLE_ANIM_OAMSET_0C, 8 + oamend + +.Frameset_PokeBall3: + oamframe BATTLE_ANIM_OAMSET_0D, 8 + oamend + +.Frameset_PokeBall4: + oamframe BATTLE_ANIM_OAMSET_0A, 8 + oamend + +.Frameset_PokeBall5: + oamframe BATTLE_ANIM_OAMSET_0A, 7 + oamframe BATTLE_ANIM_OAMSET_0B, 7 + oamframe BATTLE_ANIM_OAMSET_0A, 7 + oamframe BATTLE_ANIM_OAMSET_0B, 7, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_0A, 7 + oamend + +.Frameset_DragonRage: + oamframe BATTLE_ANIM_OAMSET_0A, 8 + oamend + +.Frameset_Flamethrower: + oamframe BATTLE_ANIM_OAMSET_0A, 4 + oamframe BATTLE_ANIM_OAMSET_0E, 4 + oamrestart + +.Frameset_Ember: + oamframe BATTLE_ANIM_OAMSET_0F, 4 + oamframe BATTLE_ANIM_OAMSET_10, 4 + oamrestart + +.Frameset_Burned: + oamframe BATTLE_ANIM_OAMSET_10, 4 + oamframe BATTLE_ANIM_OAMSET_0F, 4 + oamframe BATTLE_ANIM_OAMSET_0E, 4 + oamframe BATTLE_ANIM_OAMSET_0A, 4 + oamframe BATTLE_ANIM_OAMSET_0E, 4 + oamframe BATTLE_ANIM_OAMSET_0A, 4 + oamframe BATTLE_ANIM_OAMSET_0E, 4 + oamframe BATTLE_ANIM_OAMSET_0A, 4 + oamdelete + +.Frameset_Blizzard: + oamframe BATTLE_ANIM_OAMSET_10, 1 + oamframe BATTLE_ANIM_OAMSET_0F, 1 + oamframe BATTLE_ANIM_OAMSET_12, 1 + oamframe BATTLE_ANIM_OAMSET_11, 1 + oamframe BATTLE_ANIM_OAMSET_12, 1 + oamframe BATTLE_ANIM_OAMSET_0F, 1 + oamrestart + +.Frameset_Ice: + oamframe BATTLE_ANIM_OAMSET_10, 3 + oamframe BATTLE_ANIM_OAMSET_0F, 3 + oamframe BATTLE_ANIM_OAMSET_12, 1 + oamwait 1 + oamframe BATTLE_ANIM_OAMSET_12, 1 + oamwait 1 + oamframe BATTLE_ANIM_OAMSET_12, 1 + oamwait 1 + oamframe BATTLE_ANIM_OAMSET_12, 1 + oamwait 1 + oamframe BATTLE_ANIM_OAMSET_12, 3 + oamdelete + +.Frameset_IceBeam: + oamframe BATTLE_ANIM_OAMSET_13, 20 + oamdelete + +.Frameset_PowderSnow: + oamframe BATTLE_ANIM_OAMSET_10, 1 + oamframe BATTLE_ANIM_OAMSET_0F, 1 + oamrestart + +.Frameset_RazorLeaf1: + oamframe BATTLE_ANIM_OAMSET_14, 8 + oamend + +.Frameset_RazorLeaf2: + oamframe BATTLE_ANIM_OAMSET_17, 4 + oamframe BATTLE_ANIM_OAMSET_16, 8 + oamframe BATTLE_ANIM_OAMSET_15, 8 + oamframe BATTLE_ANIM_OAMSET_16, 8 + oamframe BATTLE_ANIM_OAMSET_17, 4 + oamframe BATTLE_ANIM_OAMSET_17, 4 + oamframe BATTLE_ANIM_OAMSET_16, 8, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_15, 8, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_16, 8, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_17, 4 + oamrestart + +.Frameset_LeechSeed1: + oamframe BATTLE_ANIM_OAMSET_69, 8 + oamend + +.Frameset_LeechSeed2: + oamframe BATTLE_ANIM_OAMSET_69, 32 + oamframe BATTLE_ANIM_OAMSET_6A, 4 + oamframe BATTLE_ANIM_OAMSET_6B, 4 + oamframe BATTLE_ANIM_OAMSET_6D, 4 + oamframe BATTLE_ANIM_OAMSET_6C, 4 + oamend + +.Frameset_LeechSeed3: + oamframe BATTLE_ANIM_OAMSET_6C, 8 + oamframe BATTLE_ANIM_OAMSET_6D, 8 + oamrestart + +.Frameset_Explosion: + oamframe BATTLE_ANIM_OAMSET_18, 4 + oamframe BATTLE_ANIM_OAMSET_19, 4 + oamframe BATTLE_ANIM_OAMSET_1A, 4 + oamdelete + +.Frameset_BigRock: + oamframe BATTLE_ANIM_OAMSET_1B, 8 + oamend + +.Frameset_SmallRock: + oamframe BATTLE_ANIM_OAMSET_0F, 8 + oamend + +.Frameset_Strength: + oamframe BATTLE_ANIM_OAMSET_1C, 8 + oamend + +.Frameset_SkullCrossbone: + oamframe BATTLE_ANIM_OAMSET_0A, 8 + oamdelete + +.Frameset_Acid: + oamframe BATTLE_ANIM_OAMSET_1D, 8 + oamend + +.Frameset_PoisonDropletUnused: + oamframe BATTLE_ANIM_OAMSET_17, 8 + oamend + +.Frameset_SludgeBubble: + oamframe BATTLE_ANIM_OAMSET_0F, 3 + oamframe BATTLE_ANIM_OAMSET_10, 3 + oamframe BATTLE_ANIM_OAMSET_1E, 3 + oamend + +.Frameset_SludgeBubbleBurst: + oamframe BATTLE_ANIM_OAMSET_1F, 16 + oamframe BATTLE_ANIM_OAMSET_20, 3 + oamdelete + +.Frameset_SmallBubble: + oamframe BATTLE_ANIM_OAMSET_20, 8 + oamend + +.Frameset_PulsingBubble: + oamframe BATTLE_ANIM_OAMSET_20, 8 + oamframe BATTLE_ANIM_OAMSET_21, 8 + oamframe BATTLE_ANIM_OAMSET_1B, 8 + oamframe BATTLE_ANIM_OAMSET_21, 8 + oamrestart + +.Frameset_Surf: + oamframe BATTLE_ANIM_OAMSET_22, 8 + oamend + +.Frameset_MusicNote1: + oamframe BATTLE_ANIM_OAMSET_1B, 8 + oamend + +.Frameset_MusicNote2: + oamframe BATTLE_ANIM_OAMSET_23, 8 + oamend + +.Frameset_MusicNote3: + oamframe BATTLE_ANIM_OAMSET_24, 8 + oamend + +.Frameset_WaterGun1: + oamframe BATTLE_ANIM_OAMSET_25, 8 + oamend + +.Frameset_WaterGun2: + oamframe BATTLE_ANIM_OAMSET_26, 8 + oamframe BATTLE_ANIM_OAMSET_27, 8 + oamend + +.Frameset_WaterGun3: + oamframe BATTLE_ANIM_OAMSET_28, 8 + oamframe BATTLE_ANIM_OAMSET_29, 8 + oamdelete + +; Animation is 4x slower than final game +.Frameset_HydroPump: + oamframe BATTLE_ANIM_OAMSET_2A, 4 + oamframe BATTLE_ANIM_OAMSET_2B, 4 + oamframe BATTLE_ANIM_OAMSET_2C, 4 + oamframe BATTLE_ANIM_OAMSET_2D, 4 + oamframe BATTLE_ANIM_OAMSET_2E, 4 + oamframe BATTLE_ANIM_OAMSET_2D, 4 + oamframe BATTLE_ANIM_OAMSET_2C, 4 + oamframe BATTLE_ANIM_OAMSET_2B, 4 + oamframe BATTLE_ANIM_OAMSET_2A, 4 + oamdelete + +.Frameset_Powder: + oamframe BATTLE_ANIM_OAMSET_14, 1 + oamframe BATTLE_ANIM_OAMSET_15, 1 + oamrestart + +.Frameset_Beam: + oamframe BATTLE_ANIM_OAMSET_2F, 4 + oamframe BATTLE_ANIM_OAMSET_30, 40 + oamdelete + +.Frameset_BeamTip: + oamframe BATTLE_ANIM_OAMSET_31, 8 + oamend + +.Frameset_IceBuildup: + oamframe BATTLE_ANIM_OAMSET_32, 32 + oamframe BATTLE_ANIM_OAMSET_33, 32 + oamframe BATTLE_ANIM_OAMSET_34, 32 + oamframe BATTLE_ANIM_OAMSET_35, 32 ; fallthrough +.Frameset_Frozen: + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_35, 4 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_35, 4 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_35, 4 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_35, 4 + oamdelete + +.Frameset_CirclingSparkle: + oamframe BATTLE_ANIM_OAMSET_14, 4 + oamframe BATTLE_ANIM_OAMSET_15, 4 + oamrestart + +.Frameset_ThunderCenter: + oamframe BATTLE_ANIM_OAMSET_36, 2 + oamframe BATTLE_ANIM_OAMSET_37, 2 + oamframe BATTLE_ANIM_OAMSET_38, 2 + oamframe BATTLE_ANIM_OAMSET_39, 32 + oamdelete + +.Frameset_ThunderLeft: + oamframe BATTLE_ANIM_OAMSET_3A, 2 + oamframe BATTLE_ANIM_OAMSET_3B, 2 + oamframe BATTLE_ANIM_OAMSET_3C, 2 + oamframe BATTLE_ANIM_OAMSET_3D, 32 + oamdelete + +.Frameset_ThunderRight: + oamframe BATTLE_ANIM_OAMSET_3A, 2, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_3B, 2, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_3C, 2, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_3D, 32, OAM_X_FLIP + oamdelete + +.Frameset_ThunderWaveDisable: + oamframe BATTLE_ANIM_OAMSET_3E, 8 + oamframe BATTLE_ANIM_OAMSET_3F, 8 + oamframe BATTLE_ANIM_OAMSET_40, 8 + oamend + +.Frameset_ThunderWaveExtra: + oamframe BATTLE_ANIM_OAMSET_40, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_40, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_41, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_41, 2 + oamwait 2 + oamrestart + +.Frameset_ThunderBoltSparks: + oamframe BATTLE_ANIM_OAMSET_42, 2 + oamframe BATTLE_ANIM_OAMSET_43, 2 + oamframe BATTLE_ANIM_OAMSET_44, 2 + oamframe BATTLE_ANIM_OAMSET_45, 2 + oamrestart + +.Frameset_ThunderBoltCore: + oamframe BATTLE_ANIM_OAMSET_19, 2 + oamwait 2 + oamrestart + +.Frameset_ThunderShockSparks: + oamframe BATTLE_ANIM_OAMSET_46, 4 + oamframe BATTLE_ANIM_OAMSET_47, 4 + oamrestart + +.Frameset_ThunderShockCore: + oamframe BATTLE_ANIM_OAMSET_18, 2 + oamwait 2 + oamrestart + +.Frameset_Clamp: + oamframe BATTLE_ANIM_OAMSET_48, 8 + oamend + +.Frameset_ClampFlipped: + oamframe BATTLE_ANIM_OAMSET_48, 8, OAM_X_FLIP + oamend + +.Frameset_Bite1: + oamframe BATTLE_ANIM_OAMSET_49, 8 + oamend + +.Frameset_Bite2: + oamframe BATTLE_ANIM_OAMSET_4A, 8 + oamend + +.Frameset_ChargeOrb1: + oamframe BATTLE_ANIM_OAMSET_20, 16 + oamframe BATTLE_ANIM_OAMSET_1F, 16 + oamframe BATTLE_ANIM_OAMSET_1E, 16 + oamend + +.Frameset_ChargeOrb2: + oamframe BATTLE_ANIM_OAMSET_20, 8 + oamframe BATTLE_ANIM_OAMSET_1F, 8 + oamframe BATTLE_ANIM_OAMSET_1E, 8 + oamend + +.Frameset_AbsorbCenter: + oamwait 20 + oamframe BATTLE_ANIM_OAMSET_55, 40 + oamframe BATTLE_ANIM_OAMSET_54, 40 + oamframe BATTLE_ANIM_OAMSET_53, 20 + oamwait 4 + oamframe BATTLE_ANIM_OAMSET_53, 4 + oamwait 4 + oamframe BATTLE_ANIM_OAMSET_53, 4 + oamwait 4 + oamframe BATTLE_ANIM_OAMSET_53, 4 + oamdelete + +.Frameset_ShrinkingChargeOrb: + oamframe BATTLE_ANIM_OAMSET_1E, 8 + oamframe BATTLE_ANIM_OAMSET_1F, 8 + oamframe BATTLE_ANIM_OAMSET_20, 8 + oamdelete + +.Frameset_Gust: + oamwait 0 + oamframe BATTLE_ANIM_OAMSET_14, 0 + oamframe BATTLE_ANIM_OAMSET_15, 0 + oamframe BATTLE_ANIM_OAMSET_14, 0, OAM_X_FLIP + oamwait 0 + oamframe BATTLE_ANIM_OAMSET_16, 0, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_15, 0 + oamframe BATTLE_ANIM_OAMSET_16, 0 + oamrestart + +.Frameset_VineWhip1: + oamframe BATTLE_ANIM_OAMSET_56, 2 + oamframe BATTLE_ANIM_OAMSET_57, 4 + oamdelete + +.Frameset_VineWhip2: + oamframe BATTLE_ANIM_OAMSET_56, 2, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_57, 4, OAM_X_FLIP, OAM_Y_FLIP + oamdelete + +.Frameset_RazorWind1: + oamframe BATTLE_ANIM_OAMSET_56, 1 + oamframe BATTLE_ANIM_OAMSET_57, 1 + oamframe BATTLE_ANIM_OAMSET_58, 1 + oamframe BATTLE_ANIM_OAMSET_57, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_58, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_57, 2 + oamdelete + +.Frameset_RazorWind2: + oamframe BATTLE_ANIM_OAMSET_56, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_57, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_58, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_57, 1 + oamframe BATTLE_ANIM_OAMSET_58, 1 + oamframe BATTLE_ANIM_OAMSET_57, 2, OAM_X_FLIP, OAM_Y_FLIP + oamdelete + +.Frameset_Sonicboom: + oamframe BATTLE_ANIM_OAMSET_57, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_58, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_57, 1 + oamframe BATTLE_ANIM_OAMSET_58, 1 + oamrestart + +.Frameset_Warp: + oamframe BATTLE_ANIM_OAMSET_59, 1 + oamframe BATTLE_ANIM_OAMSET_5A, 1 + oamframe BATTLE_ANIM_OAMSET_5B, 1 + oamframe BATTLE_ANIM_OAMSET_5C, 2 + oamdelete + +.Frameset_Egg: + oamframe BATTLE_ANIM_OAMSET_0A, 10 + oamframe BATTLE_ANIM_OAMSET_0B, 3, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_5D, 3, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_0B, 3, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_0A, 2, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_0B, 1, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_5D, 1 + oamframe BATTLE_ANIM_OAMSET_0B, 1 + oamrestart + +.Frameset_EggWobble: + oamframe BATTLE_ANIM_OAMSET_0A, 3 + oamframe BATTLE_ANIM_OAMSET_0B, 7, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_0A, 7 + oamframe BATTLE_ANIM_OAMSET_0B, 7 + oamframe BATTLE_ANIM_OAMSET_0A, 3 + oamrestart + +.Frameset_EggCrackedTop: + oamframe BATTLE_ANIM_OAMSET_5E, 32 + oamframe BATTLE_ANIM_OAMSET_5E, 32 + oamdelete + +.Frameset_EggCrackedBottom: + oamframe BATTLE_ANIM_OAMSET_5F, 32 + oamframe BATTLE_ANIM_OAMSET_5F, 32 + oamdelete + +.Frameset_Focus: + oamframe BATTLE_ANIM_OAMSET_60, 8 + oamend + +.Frameset_Bind1: + oamframe BATTLE_ANIM_OAMSET_61, 1 + oamframe BATTLE_ANIM_OAMSET_62, 1 + oamframe BATTLE_ANIM_OAMSET_63, 1 + oamend + +.Frameset_Bind2: + oamframe BATTLE_ANIM_OAMSET_63, 7 + oamframe BATTLE_ANIM_OAMSET_64, 7 + oamrestart + +.Frameset_Bind3: + oamframe BATTLE_ANIM_OAMSET_65, 1 + oamframe BATTLE_ANIM_OAMSET_66, 1 + oamframe BATTLE_ANIM_OAMSET_67, 1 + oamend + +.Frameset_Bind4: + oamframe BATTLE_ANIM_OAMSET_67, 7 + oamframe BATTLE_ANIM_OAMSET_68, 7 + oamrestart + +.Frameset_Sound1: + oamframe BATTLE_ANIM_OAMSET_6E, 8 + oamend + +.Frameset_Sound2: + oamframe BATTLE_ANIM_OAMSET_6F, 8 + oamend + +.Frameset_Sound3: + oamframe BATTLE_ANIM_OAMSET_6E, 8, OAM_Y_FLIP + oamend + +.Frameset_Wave: + oamframe BATTLE_ANIM_OAMSET_18, 4 + oamframe BATTLE_ANIM_OAMSET_70, 4 + oamframe BATTLE_ANIM_OAMSET_71, 4 + oamframe BATTLE_ANIM_OAMSET_72, 4 + oamframe BATTLE_ANIM_OAMSET_73, 4 + oamdelete + +.Frameset_ConfuseRay1: + oamframe BATTLE_ANIM_OAMSET_74, 4 + oamframe BATTLE_ANIM_OAMSET_75, 4 + oamrestart + +.Frameset_ConfuseRay2: + oamframe BATTLE_ANIM_OAMSET_14, 8 + oamend + +.Frameset_Sparkle: + oamframe BATTLE_ANIM_OAMSET_74, 3 + oamframe BATTLE_ANIM_OAMSET_14, 3 + oamframe BATTLE_ANIM_OAMSET_15, 3 + oamframe BATTLE_ANIM_OAMSET_14, 3 + oamframe BATTLE_ANIM_OAMSET_15, 3 + oamdelete + +.Frameset_GrowingSparkle: + oamframe BATTLE_ANIM_OAMSET_14, 0 + oamframe BATTLE_ANIM_OAMSET_15, 0 + oamframe BATTLE_ANIM_OAMSET_14, 0 + oamframe BATTLE_ANIM_OAMSET_15, 0 + oamframe BATTLE_ANIM_OAMSET_74, 12 + oamdelete + +.Frameset_Leer: + oamframe BATTLE_ANIM_OAMSET_76, 8 + oamend + +.Frameset_Reflect: + oamframe BATTLE_ANIM_OAMSET_77, 1 + oamframe BATTLE_ANIM_OAMSET_78, 1 + oamframe BATTLE_ANIM_OAMSET_79, 1 + oamframe BATTLE_ANIM_OAMSET_7A, 1 + oamframe BATTLE_ANIM_OAMSET_7B, 1 + oamframe BATTLE_ANIM_OAMSET_7C, 1 + oamframe BATTLE_ANIM_OAMSET_7D, 1 + oamframe BATTLE_ANIM_OAMSET_7C, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_7B, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_7A, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_79, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_78, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_77, 1, OAM_X_FLIP, OAM_Y_FLIP + oamdelete + +.Frameset_Chick1: + oamframe BATTLE_ANIM_OAMSET_1B, 4 + oamframe BATTLE_ANIM_OAMSET_7E, 4 + oamrestart + +.Frameset_Chick2: + oamframe BATTLE_ANIM_OAMSET_1B, 4, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_7E, 4, OAM_X_FLIP + oamrestart + +.Frameset_Amnesia1: + oamframe BATTLE_ANIM_OAMSET_7F, 8 + oamend + +.Frameset_Amnesia2: + oamframe BATTLE_ANIM_OAMSET_25, 8 + oamend + +.Frameset_Amnesia3: + oamframe BATTLE_ANIM_OAMSET_80, 8 + oamend + +.Frameset_Asleep: + oamframe BATTLE_ANIM_OAMSET_83, 7 + oamframe BATTLE_ANIM_OAMSET_82, 7 + oamframe BATTLE_ANIM_OAMSET_81, 7 + oamframe BATTLE_ANIM_OAMSET_82, 7 + oamframe BATTLE_ANIM_OAMSET_83, 7 + oamframe BATTLE_ANIM_OAMSET_82, 7 + oamframe BATTLE_ANIM_OAMSET_81, 7 + oamdelete + +.Frameset_DigSand: + oamframe BATTLE_ANIM_OAMSET_1B, 16 + oamdelete + +.Frameset_DigPile: + oamwait 15 + oamframe BATTLE_ANIM_OAMSET_84, 15 + oamframe BATTLE_ANIM_OAMSET_85, 15 + oamframe BATTLE_ANIM_OAMSET_29, 15 + oamframe BATTLE_ANIM_OAMSET_28, 15 + oamframe BATTLE_ANIM_OAMSET_86, 32 + oamdelete + +.Frameset_Sand: + oamframe BATTLE_ANIM_OAMSET_1B, 3 + oamframe BATTLE_ANIM_OAMSET_87, 3 + oamframe BATTLE_ANIM_OAMSET_88, 3 + oamframe BATTLE_ANIM_OAMSET_89, 3 + oamdelete + +.Frameset_StringShot1: + oamframe BATTLE_ANIM_OAMSET_8A, 2 + oamframe BATTLE_ANIM_OAMSET_8B, 2 + oamframe BATTLE_ANIM_OAMSET_8C, 2 + oamframe BATTLE_ANIM_OAMSET_8D, 2 + oamdelete + +.Frameset_StringShot2: + oamframe BATTLE_ANIM_OAMSET_61, 2 + oamframe BATTLE_ANIM_OAMSET_62, 2 + oamframe BATTLE_ANIM_OAMSET_63, 2 + oamend + +.Frameset_StringShot3: + oamframe BATTLE_ANIM_OAMSET_65, 2 + oamframe BATTLE_ANIM_OAMSET_66, 2 + oamframe BATTLE_ANIM_OAMSET_67, 2 + oamend + +.Frameset_Paralyzed: + oamframe BATTLE_ANIM_OAMSET_8E, 8 + oamend + +.Frameset_ParalyzedFlipped: + oamframe BATTLE_ANIM_OAMSET_8E, 8, OAM_X_FLIP + oamend + +.Frameset_Haze: + oamframe BATTLE_ANIM_OAMSET_8F, 16 + oamframe BATTLE_ANIM_OAMSET_90, 16 + oamrestart + +.Frameset_Mist: + oamframe BATTLE_ANIM_OAMSET_91, 16 + oamframe BATTLE_ANIM_OAMSET_92, 16 + oamrestart + +.Frameset_Horn: + oamframe BATTLE_ANIM_OAMSET_93, 8 + oamend + +.Frameset_Needle: + oamframe BATTLE_ANIM_OAMSET_1E, 8 + oamend + +.Frameset_Flower: + oamframe BATTLE_ANIM_OAMSET_1B, 7 + oamframe BATTLE_ANIM_OAMSET_94, 7 + oamrestart + +.Frameset_BarrageBall: + oamframe BATTLE_ANIM_OAMSET_95, 8 + oamend + +.Frameset_PayDay: + oamframe BATTLE_ANIM_OAMSET_96, 8 + oamend + +.Frameset_Heart: + oamframe BATTLE_ANIM_OAMSET_95, 8 + oamend + +.Frameset_SpinningBone: + oamframe BATTLE_ANIM_OAMSET_97, 1 + oamframe BATTLE_ANIM_OAMSET_97, 1, OAM_X_FLIP + oamrestart + +.Frameset_Star: + oamframe BATTLE_ANIM_OAMSET_98, 8 + oamend + +.Frameset_Spoon: + oamframe BATTLE_ANIM_OAMSET_99, 32 + oamframe BATTLE_ANIM_OAMSET_99, 32 + oamframe BATTLE_ANIM_OAMSET_99, 32 + oamframe BATTLE_ANIM_OAMSET_99, 32 + oamframe BATTLE_ANIM_OAMSET_99, 32 + oamframe BATTLE_ANIM_OAMSET_9A, 8 + oamend + +.Frameset_SkyAttack: + oamframe BATTLE_ANIM_OAMSET_9B, 8 + oamend + +.Frameset_Lick: + oamframe BATTLE_ANIM_OAMSET_9C, 2 + oamframe BATTLE_ANIM_OAMSET_9D, 2 + oamframe BATTLE_ANIM_OAMSET_9E, 8 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_9E, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_9E, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_9E, 2 + oamdelete + +.Frameset_WithdrawShell: + oamframe BATTLE_ANIM_OAMSET_9F, 8 + oamend + +.Frameset_Conversion: + oamframe BATTLE_ANIM_OAMSET_0F, 8 + oamend + +.Frameset_Sword: + oamframe BATTLE_ANIM_OAMSET_6B, 24 + oamdelete + +.Frameset_SpeedLine1: + oamframe BATTLE_ANIM_OAMSET_A0, 1 ; fallthrough +.Frameset_SpeedLine2: + oamframe BATTLE_ANIM_OAMSET_A1, 1 ; fallthrough +.Frameset_SpeedLine3: + oamframe BATTLE_ANIM_OAMSET_A2, 1 + oamdelete + +.Frameset_SeismicToss: + oamframe BATTLE_ANIM_OAMSET_A3, 8 + oamend + +.Frameset_Sharpen: + oamframe BATTLE_ANIM_OAMSET_A4, 4 + oamframe BATTLE_ANIM_OAMSET_A5, 4 + oamframe BATTLE_ANIM_OAMSET_A6, 4 + oamframe BATTLE_ANIM_OAMSET_A7, 4 + oamframe BATTLE_ANIM_OAMSET_A6, 4, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_A5, 4, OAM_X_FLIP + oamrestart + +.Frameset_DefenseCurl: + oamframe BATTLE_ANIM_OAMSET_A8, 4 + oamframe BATTLE_ANIM_OAMSET_A9, 4 + oamframe BATTLE_ANIM_OAMSET_AA, 4 + oamframe BATTLE_ANIM_OAMSET_AB, 4 + oamframe BATTLE_ANIM_OAMSET_AA, 4, OAM_X_FLIP + oamframe BATTLE_ANIM_OAMSET_A9, 4, OAM_X_FLIP + oamrestart + +.Frameset_MetronomeHand: + oamframe BATTLE_ANIM_OAMSET_1B, 8 + oamend + +.Frameset_Agility: + oamframe BATTLE_ANIM_OAMSET_AC, 8 + oamend + +.Frameset_Cotton: + oamframe BATTLE_ANIM_OAMSET_AD, 8 + oamend + +.Frameset_MilkBottle: + oamframe BATTLE_ANIM_OAMSET_AE, 8 + oamend + +.Frameset_Spike: + oamframe BATTLE_ANIM_OAMSET_AF, 8 + oamend + +.Frameset_AngerVein: + oamframe BATTLE_ANIM_OAMSET_B0, 32 + oamdelete + +.Frameset_BellChime: + oamframe BATTLE_ANIM_OAMSET_B1, 7 + oamframe BATTLE_ANIM_OAMSET_B1, 7, OAM_X_FLIP + oamrestart + +.Frameset_BatonPass: + oamframe BATTLE_ANIM_OAMSET_B2, 8 + oamend + +.Frameset_LockOn1: + oamframe BATTLE_ANIM_OAMSET_B3, 8 + oamend + +.Frameset_LockOn2: + oamframe BATTLE_ANIM_OAMSET_B3, 8, OAM_X_FLIP + oamend + +.Frameset_LockOn3: + oamframe BATTLE_ANIM_OAMSET_B3, 8, OAM_Y_FLIP + oamend + +.Frameset_LockOn4: + oamframe BATTLE_ANIM_OAMSET_B3, 8, OAM_X_FLIP, OAM_Y_FLIP + oamend + +.Frameset_MindReader1: + oamframe BATTLE_ANIM_OAMSET_B5, 8 + oamend + +.Frameset_MindReader2: + oamframe BATTLE_ANIM_OAMSET_B5, 8, OAM_X_FLIP + oamend + +.Frameset_MindReader3: + oamframe BATTLE_ANIM_OAMSET_B5, 8, OAM_Y_FLIP + oamend + +.Frameset_MindReader4: + oamframe BATTLE_ANIM_OAMSET_B5, 8, OAM_X_FLIP, OAM_Y_FLIP + oamend + +.Frameset_Safeguard: + oamframe BATTLE_ANIM_OAMSET_B4, 8 + oamend + +.Frameset_Megaphone: + oamframe BATTLE_ANIM_OAMSET_6B, 8 + oamend + +.Frameset_ItemBag: + oamframe BATTLE_ANIM_OAMSET_B6, 8 + oamend + +.Frameset_SpiderWeb: + oamframe BATTLE_ANIM_OAMSET_B7, 32 + oamend + +.Frameset_TemptCake: + oamframe BATTLE_ANIM_OAMSET_1B, 32 + oamend + +.Frameset_Imp: + oamframe BATTLE_ANIM_OAMSET_B8, 32 + oamend + +.Frameset_ImpFlipped: + oamframe BATTLE_ANIM_OAMSET_B8, 32, OAM_X_FLIP + oamend + +.Frameset_Cherub: + oamframe BATTLE_ANIM_OAMSET_B9, 32 + oamend + +.Frameset_Pencil: + oamframe BATTLE_ANIM_OAMSET_BA, 32 + oamend + +.Frameset_EncoreHand: + oamframe BATTLE_ANIM_OAMSET_BB, 32, OAM_X_FLIP + oamend + +.Frameset_EncoreHandFlipped: + oamframe BATTLE_ANIM_OAMSET_BB, 32 + oamend + +.Frameset_DestinyBond: + oamframe BATTLE_ANIM_OAMSET_BC, 32 + oamend + +.Frameset_MorningSun: + oamframe BATTLE_ANIM_OAMSET_BD, 11 + oamframe BATTLE_ANIM_OAMSET_BE, 11 + oamframe BATTLE_ANIM_OAMSET_1B, 11 + oamdelete + +.Frameset_Glimmer: + oamframe BATTLE_ANIM_OAMSET_BF, 4 + oamframe BATTLE_ANIM_OAMSET_C0, 4 + oamframe BATTLE_ANIM_OAMSET_C1, 4 + oamdelete + +.Frameset_Moonlight: + oamframe BATTLE_ANIM_OAMSET_C2, 32 + oamframe BATTLE_ANIM_OAMSET_C2, 32 + oamdelete + +.Frameset_CrossCutter1: + oamframe BATTLE_ANIM_OAMSET_4B, 2 + oamframe BATTLE_ANIM_OAMSET_4C, 2 + oamframe BATTLE_ANIM_OAMSET_4D, 32 + oamframe BATTLE_ANIM_OAMSET_4D, 32 + oamframe BATTLE_ANIM_OAMSET_4D, 32 + oamframe BATTLE_ANIM_OAMSET_4F, 1 + oamframe BATTLE_ANIM_OAMSET_50, 1 + oamframe BATTLE_ANIM_OAMSET_51, 1 + oamframe BATTLE_ANIM_OAMSET_52, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_52, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_52, 2 + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_52, 2 + oamdelete + +.Frameset_CrossCutter2: + oamframe BATTLE_ANIM_OAMSET_4B, 2, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_4C, 2, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_4D, 32, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_4D, 32, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_4D, 32, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_4F, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_50, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_51, 1, OAM_X_FLIP, OAM_Y_FLIP + oamframe BATTLE_ANIM_OAMSET_52, 2, OAM_X_FLIP, OAM_Y_FLIP + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_52, 2, OAM_X_FLIP, OAM_Y_FLIP + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_52, 2, OAM_X_FLIP, OAM_Y_FLIP + oamwait 2 + oamframe BATTLE_ANIM_OAMSET_52, 2, OAM_X_FLIP, OAM_Y_FLIP + oamdelete + +.Frameset_ZapCannon: + oamframe BATTLE_ANIM_OAMSET_C3, 1 + oamframe BATTLE_ANIM_OAMSET_C3, 1, OAM_X_FLIP, OAM_Y_FLIP + oamrestart + +.Frameset_CurseNail: + oamframe BATTLE_ANIM_OAMSET_C4, 32 + oamend + +.Frameset_ForesightShine: + oamframe BATTLE_ANIM_OAMSET_C5, 4 + oamframe BATTLE_ANIM_OAMSET_C6, 4 + oamframe BATTLE_ANIM_OAMSET_C7, 4 + oamdelete + +.Frameset_RapidSpin: + oamframe BATTLE_ANIM_OAMSET_C8, 1 + oamframe BATTLE_ANIM_OAMSET_C8, 1, OAM_X_FLIP + oamrestart + +.Frameset_Swagger: + oamframe BATTLE_ANIM_OAMSET_C9, 3 + oamframe BATTLE_ANIM_OAMSET_05, 3 + oamdelete + +.Frameset_Stalker: + oamframe BATTLE_ANIM_OAMSET_CA, 32 + oamframe BATTLE_ANIM_OAMSET_CB, 3 + oamframe BATTLE_ANIM_OAMSET_CA, 3 + oamframe BATTLE_ANIM_OAMSET_CB, 3 + oamrestart + +.Frameset_UpsideDownPunch: + oamframe BATTLE_ANIM_OAMSET_03, 32, OAM_Y_FLIP + oamend + +.Frameset_Rain1: + oamframe BATTLE_ANIM_OAMSET_CC, 32 + oamend + +.Frameset_Rain2: + oamframe BATTLE_ANIM_OAMSET_CD, 32 + oamend + +.Frameset_Rain3: + oamframe BATTLE_ANIM_OAMSET_CE, 32 + oamend + +.Frameset_EnemyFeet1Row: + oamframe BATTLE_ANIM_OAMSET_CF, 8 + oamend + +.Frameset_PlayerHead1Row: + oamframe BATTLE_ANIM_OAMSET_D0, 8 + oamend + +.Frameset_EnemyFeet2Row: + oamframe BATTLE_ANIM_OAMSET_D1, 8 + oamend + +.Frameset_PlayerHead2Row: + oamframe BATTLE_ANIM_OAMSET_D2, 8 + oamend diff --git a/data/battle_anims/oam.inc b/data/battle_anims/oam.inc new file mode 100644 index 0000000..1d4e8e1 --- /dev/null +++ b/data/battle_anims/oam.inc @@ -0,0 +1,1079 @@ +MACRO battleanimoam +; vtile offset, data length, data pointer + db \1, \2 + dw \3 +ENDM + +BattleAnimOAMData: +; entries correspond to BATTLE_ANIM_OAMSET_* constants + table_width 4, BattleAnimOAMData + battleanimoam $00, 16, .OAMData_00 ; BATTLE_ANIM_OAMSET_00 + battleanimoam $04, 9, .OAMData_01 ; BATTLE_ANIM_OAMSET_01 + battleanimoam $08, 4, .OAMData_02 ; BATTLE_ANIM_OAMSET_02 + battleanimoam $09, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_03 + battleanimoam $0d, 4, .OAMData_04 ; BATTLE_ANIM_OAMSET_04 + battleanimoam $0f, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_05 + battleanimoam $13, 4, .OAMData_04 ; BATTLE_ANIM_OAMSET_06 + battleanimoam $04, 16, .OAMData_00 ; BATTLE_ANIM_OAMSET_07 + battleanimoam $08, 16, .OAMData_00 ; BATTLE_ANIM_OAMSET_08 + battleanimoam $08, 16, .OAMData_09 ; BATTLE_ANIM_OAMSET_09 + battleanimoam $00, 4, .OAMData_04 ; BATTLE_ANIM_OAMSET_0A + battleanimoam $02, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_0B + battleanimoam $06, 2, .OAMData_0c ; BATTLE_ANIM_OAMSET_0C + battleanimoam $07, 2, .OAMData_0c ; BATTLE_ANIM_OAMSET_0D + battleanimoam $02, 4, .OAMData_04 ; BATTLE_ANIM_OAMSET_0E + battleanimoam $04, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_0F + battleanimoam $05, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_10 + battleanimoam $00, 2, .OAMData_11 ; BATTLE_ANIM_OAMSET_11 + battleanimoam $02, 2, .OAMData_11 ; BATTLE_ANIM_OAMSET_12 + battleanimoam $00, 4, .OAMData_13 ; BATTLE_ANIM_OAMSET_13 + battleanimoam $00, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_14 + battleanimoam $01, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_15 + battleanimoam $02, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_16 + battleanimoam $03, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_17 + battleanimoam $00, 4, .OAMData_02 ; BATTLE_ANIM_OAMSET_18 + battleanimoam $01, 16, .OAMData_00 ; BATTLE_ANIM_OAMSET_19 + battleanimoam $05, 16, .OAMData_00 ; BATTLE_ANIM_OAMSET_1A + battleanimoam $00, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_1B + battleanimoam $05, 12, .OAMData_1c ; BATTLE_ANIM_OAMSET_1C + battleanimoam $02, 4, .OAMData_02 ; BATTLE_ANIM_OAMSET_1D + battleanimoam $06, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_1E + battleanimoam $07, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_1F + battleanimoam $08, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_20 + battleanimoam $04, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_21 + battleanimoam $09, 22, .OAMData_22 ; BATTLE_ANIM_OAMSET_22 + battleanimoam $04, 2, .OAMData_11 ; BATTLE_ANIM_OAMSET_23 + battleanimoam $06, 2, .OAMData_11 ; BATTLE_ANIM_OAMSET_24 + battleanimoam $0c, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_25 + battleanimoam $0a, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_26 + battleanimoam $0b, 4, .OAMData_02 ; BATTLE_ANIM_OAMSET_27 + battleanimoam $08, 4, .OAMData_04 ; BATTLE_ANIM_OAMSET_28 + battleanimoam $06, 4, .OAMData_04 ; BATTLE_ANIM_OAMSET_29 + battleanimoam $00, 5, .OAMData_2a ; BATTLE_ANIM_OAMSET_2A + battleanimoam $03, 6, .OAMData_2b ; BATTLE_ANIM_OAMSET_2B + battleanimoam $00, 7, .OAMData_2c ; BATTLE_ANIM_OAMSET_2C + battleanimoam $03, 8, .OAMData_2d ; BATTLE_ANIM_OAMSET_2D + battleanimoam $00, 9, .OAMData_2e ; BATTLE_ANIM_OAMSET_2E + battleanimoam $00, 4, .OAMData_2f ; BATTLE_ANIM_OAMSET_2F + battleanimoam $02, 4, .OAMData_30 ; BATTLE_ANIM_OAMSET_30 + battleanimoam $04, 6, .OAMData_31 ; BATTLE_ANIM_OAMSET_31 + battleanimoam $00, 2, .OAMData_32 ; BATTLE_ANIM_OAMSET_32 + battleanimoam $00, 7, .OAMData_33 ; BATTLE_ANIM_OAMSET_33 + battleanimoam $00, 14, .OAMData_32 ; BATTLE_ANIM_OAMSET_34 + battleanimoam $00, 21, .OAMData_33 ; BATTLE_ANIM_OAMSET_35 + battleanimoam $00, 2, .OAMData_36 ; BATTLE_ANIM_OAMSET_36 + battleanimoam $00, 6, .OAMData_36 ; BATTLE_ANIM_OAMSET_37 + battleanimoam $00, 10, .OAMData_36 ; BATTLE_ANIM_OAMSET_38 + battleanimoam $00, 14, .OAMData_36 ; BATTLE_ANIM_OAMSET_39 + battleanimoam $00, 2, .OAMData_3a ; BATTLE_ANIM_OAMSET_3A + battleanimoam $00, 6, .OAMData_3a ; BATTLE_ANIM_OAMSET_3B + battleanimoam $00, 10, .OAMData_3a ; BATTLE_ANIM_OAMSET_3C + battleanimoam $00, 14, .OAMData_3a ; BATTLE_ANIM_OAMSET_3D + battleanimoam $00, 4, .OAMData_3e ; BATTLE_ANIM_OAMSET_3E + battleanimoam $00, 16, .OAMData_3e ; BATTLE_ANIM_OAMSET_3F + battleanimoam $00, 26, .OAMData_3e ; BATTLE_ANIM_OAMSET_40 + battleanimoam $00, 26, .OAMData_41 ; BATTLE_ANIM_OAMSET_41 + battleanimoam $0e, 4, .OAMData_42 ; BATTLE_ANIM_OAMSET_42 + battleanimoam $0e, 8, .OAMData_42 ; BATTLE_ANIM_OAMSET_43 + battleanimoam $0e, 4, .OAMData_44 ; BATTLE_ANIM_OAMSET_44 + battleanimoam $0e, 8, .OAMData_44 ; BATTLE_ANIM_OAMSET_45 + battleanimoam $0e, 4, .OAMData_46 ; BATTLE_ANIM_OAMSET_46 + battleanimoam $0e, 4, .OAMData_47 ; BATTLE_ANIM_OAMSET_47 + battleanimoam $00, 6, .OAMData_48 ; BATTLE_ANIM_OAMSET_48 + battleanimoam $03, 4, .OAMData_49 ; BATTLE_ANIM_OAMSET_49 + battleanimoam $03, 2, .OAMData_4a ; BATTLE_ANIM_OAMSET_4A + battleanimoam $01, 5, .OAMData_0f ; BATTLE_ANIM_OAMSET_4B + battleanimoam $01, 6, .OAMData_4c ; BATTLE_ANIM_OAMSET_4C + battleanimoam $01, 7, .OAMData_4d ; BATTLE_ANIM_OAMSET_4D + battleanimoam $01, 3, .OAMData_4d ; BATTLE_ANIM_OAMSET_4E + battleanimoam $01, 8, .OAMData_4f ; BATTLE_ANIM_OAMSET_4F + battleanimoam $01, 9, .OAMData_50 ; BATTLE_ANIM_OAMSET_50 + battleanimoam $01, 10, .OAMData_51 ; BATTLE_ANIM_OAMSET_51 + battleanimoam $01, 6, .OAMData_51 ; BATTLE_ANIM_OAMSET_52 + battleanimoam $00, 9, .OAMData_01 ; BATTLE_ANIM_OAMSET_53 + battleanimoam $04, 4, .OAMData_02 ; BATTLE_ANIM_OAMSET_54 + battleanimoam $05, 4, .OAMData_02 ; BATTLE_ANIM_OAMSET_55 + battleanimoam $00, 2, .OAMData_56 ; BATTLE_ANIM_OAMSET_56 + battleanimoam $02, 2, .OAMData_56 ; BATTLE_ANIM_OAMSET_57 + battleanimoam $04, 2, .OAMData_56 ; BATTLE_ANIM_OAMSET_58 + battleanimoam $02, 4, .OAMData_59 ; BATTLE_ANIM_OAMSET_59 + battleanimoam $02, 4, .OAMData_5a ; BATTLE_ANIM_OAMSET_5A + battleanimoam $02, 2, .OAMData_0c ; BATTLE_ANIM_OAMSET_5B + battleanimoam $04, 2, .OAMData_0c ; BATTLE_ANIM_OAMSET_5C + battleanimoam $06, 4, .OAMData_5d ; BATTLE_ANIM_OAMSET_5D + battleanimoam $08, 2, .OAMData_0c ; BATTLE_ANIM_OAMSET_5E + battleanimoam $09, 2, .OAMData_0c ; BATTLE_ANIM_OAMSET_5F + battleanimoam $05, 2, .OAMData_60 ; BATTLE_ANIM_OAMSET_60 + battleanimoam $00, 2, .OAMData_61 ; BATTLE_ANIM_OAMSET_61 + battleanimoam $00, 5, .OAMData_61 ; BATTLE_ANIM_OAMSET_62 + battleanimoam $00, 9, .OAMData_61 ; BATTLE_ANIM_OAMSET_63 + battleanimoam $09, 9, .OAMData_61 ; BATTLE_ANIM_OAMSET_64 + battleanimoam $00, 4, .OAMData_65 ; BATTLE_ANIM_OAMSET_65 + battleanimoam $00, 7, .OAMData_65 ; BATTLE_ANIM_OAMSET_66 + battleanimoam $00, 9, .OAMData_65 ; BATTLE_ANIM_OAMSET_67 + battleanimoam $09, 9, .OAMData_65 ; BATTLE_ANIM_OAMSET_68 + battleanimoam $04, 1, .OAMData_69 ; BATTLE_ANIM_OAMSET_69 + battleanimoam $05, 2, .OAMData_6a ; BATTLE_ANIM_OAMSET_6A + battleanimoam $06, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_6B + battleanimoam $0a, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_6C + battleanimoam $0e, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_6D + battleanimoam $08, 5, .OAMData_6e ; BATTLE_ANIM_OAMSET_6E + battleanimoam $0d, 3, .OAMData_6f ; BATTLE_ANIM_OAMSET_6F + battleanimoam $01, 8, .OAMData_70 ; BATTLE_ANIM_OAMSET_70 + battleanimoam $03, 8, .OAMData_70 ; BATTLE_ANIM_OAMSET_71 + battleanimoam $05, 8, .OAMData_70 ; BATTLE_ANIM_OAMSET_72 + battleanimoam $07, 8, .OAMData_70 ; BATTLE_ANIM_OAMSET_73 + battleanimoam $06, 4, .OAMData_02 ; BATTLE_ANIM_OAMSET_74 + battleanimoam $07, 4, .OAMData_02 ; BATTLE_ANIM_OAMSET_75 + battleanimoam $0a, 2, .OAMData_76 ; BATTLE_ANIM_OAMSET_76 + battleanimoam $00, 1, .OAMData_77 ; BATTLE_ANIM_OAMSET_77 + battleanimoam $00, 3, .OAMData_78 ; BATTLE_ANIM_OAMSET_78 + battleanimoam $00, 6, .OAMData_79 ; BATTLE_ANIM_OAMSET_79 + battleanimoam $00, 9, .OAMData_7a ; BATTLE_ANIM_OAMSET_7A + battleanimoam $00, 12, .OAMData_7b ; BATTLE_ANIM_OAMSET_7B + battleanimoam $00, 14, .OAMData_7c ; BATTLE_ANIM_OAMSET_7C + battleanimoam $00, 15, .OAMData_7d ; BATTLE_ANIM_OAMSET_7D + battleanimoam $04, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_7E + battleanimoam $08, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_7F + battleanimoam $0d, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_80 + battleanimoam $0e, 4, .OAMData_81 ; BATTLE_ANIM_OAMSET_81 + battleanimoam $10, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_82 + battleanimoam $11, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_83 + battleanimoam $04, 2, .OAMData_6a ; BATTLE_ANIM_OAMSET_84 + battleanimoam $05, 2, .OAMData_6a ; BATTLE_ANIM_OAMSET_85 + battleanimoam $0a, 4, .OAMData_04 ; BATTLE_ANIM_OAMSET_86 + battleanimoam $00, 8, .OAMData_87 ; BATTLE_ANIM_OAMSET_87 + battleanimoam $00, 12, .OAMData_88 ; BATTLE_ANIM_OAMSET_88 + battleanimoam $00, 16, .OAMData_87 ; BATTLE_ANIM_OAMSET_89 + battleanimoam $09, 2, .OAMData_8a ; BATTLE_ANIM_OAMSET_8A + battleanimoam $09, 4, .OAMData_8a ; BATTLE_ANIM_OAMSET_8B + battleanimoam $09, 6, .OAMData_8a ; BATTLE_ANIM_OAMSET_8C + battleanimoam $09, 8, .OAMData_8a ; BATTLE_ANIM_OAMSET_8D + battleanimoam $12, 5, .OAMData_8e ; BATTLE_ANIM_OAMSET_8E + battleanimoam $00, 4, .OAMData_8f ; BATTLE_ANIM_OAMSET_8F + battleanimoam $04, 4, .OAMData_8f ; BATTLE_ANIM_OAMSET_90 + battleanimoam $08, 4, .OAMData_8f ; BATTLE_ANIM_OAMSET_91 + battleanimoam $0c, 4, .OAMData_8f ; BATTLE_ANIM_OAMSET_92 + battleanimoam $00, 6, .OAMData_93 ; BATTLE_ANIM_OAMSET_93 + battleanimoam $04, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_94 + battleanimoam $0a, 4, .OAMData_04 ; BATTLE_ANIM_OAMSET_95 + battleanimoam $15, 4, .OAMData_30 ; BATTLE_ANIM_OAMSET_96 + battleanimoam $04, 4, .OAMData_30 ; BATTLE_ANIM_OAMSET_97 + battleanimoam $0c, 4, .OAMData_04 ; BATTLE_ANIM_OAMSET_98 + battleanimoam $0a, 4, .OAMData_99 ; BATTLE_ANIM_OAMSET_99 + battleanimoam $0c, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_9A + battleanimoam $00, 36, .OAMData_9b ; BATTLE_ANIM_OAMSET_9B + battleanimoam $0d, 2, .OAMData_9c ; BATTLE_ANIM_OAMSET_9C + battleanimoam $0d, 4, .OAMData_9c ; BATTLE_ANIM_OAMSET_9D + battleanimoam $0d, 6, .OAMData_9c ; BATTLE_ANIM_OAMSET_9E + battleanimoam $02, 8, .OAMData_9f ; BATTLE_ANIM_OAMSET_9F + battleanimoam $08, 7, .OAMData_a0 ; BATTLE_ANIM_OAMSET_A0 + battleanimoam $08, 5, .OAMData_a0 ; BATTLE_ANIM_OAMSET_A1 + battleanimoam $08, 3, .OAMData_a0 ; BATTLE_ANIM_OAMSET_A2 + battleanimoam $00, 16, .OAMData_1c ; BATTLE_ANIM_OAMSET_A3 + battleanimoam $00, 9, .OAMData_a4 ; BATTLE_ANIM_OAMSET_A4 + battleanimoam $06, 9, .OAMData_a4 ; BATTLE_ANIM_OAMSET_A5 + battleanimoam $0c, 9, .OAMData_a4 ; BATTLE_ANIM_OAMSET_A6 + battleanimoam $12, 9, .OAMData_a4 ; BATTLE_ANIM_OAMSET_A7 + battleanimoam $18, 9, .OAMData_a4 ; BATTLE_ANIM_OAMSET_A8 + battleanimoam $1e, 9, .OAMData_a4 ; BATTLE_ANIM_OAMSET_A9 + battleanimoam $24, 9, .OAMData_a4 ; BATTLE_ANIM_OAMSET_AA + battleanimoam $2a, 9, .OAMData_a4 ; BATTLE_ANIM_OAMSET_AB + battleanimoam $03, 4, .OAMData_ac ; BATTLE_ANIM_OAMSET_AC + battleanimoam $12, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_AD + battleanimoam $10, 4, .OAMData_04 ; BATTLE_ANIM_OAMSET_AE + battleanimoam $16, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_AF + battleanimoam $17, 4, .OAMData_02 ; BATTLE_ANIM_OAMSET_B0 + battleanimoam $18, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_B1 + battleanimoam $1c, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_B2 + battleanimoam $20, 3, .OAMData_03 ; BATTLE_ANIM_OAMSET_B3 + battleanimoam $23, 4, .OAMData_04 ; BATTLE_ANIM_OAMSET_B4 + battleanimoam $25, 3, .OAMData_03 ; BATTLE_ANIM_OAMSET_B5 + battleanimoam $17, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_B6 + battleanimoam $0a, 16, .OAMData_00 ; BATTLE_ANIM_OAMSET_B7 + battleanimoam $10, 16, .OAMData_1c ; BATTLE_ANIM_OAMSET_B8 + battleanimoam $00, 16, .OAMData_1c ; BATTLE_ANIM_OAMSET_B9 + battleanimoam $04, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_BA + battleanimoam $08, 2, .OAMData_11 ; BATTLE_ANIM_OAMSET_BB + battleanimoam $20, 6, .OAMData_bc ; BATTLE_ANIM_OAMSET_BC + battleanimoam $08, 1, .OAMData_0f ; BATTLE_ANIM_OAMSET_BD + battleanimoam $04, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_BE + battleanimoam $1a, 4, .OAMData_30 ; BATTLE_ANIM_OAMSET_BF + battleanimoam $16, 9, .OAMData_01 ; BATTLE_ANIM_OAMSET_C0 + battleanimoam $10, 16, .OAMData_c1 ; BATTLE_ANIM_OAMSET_C1 + battleanimoam $09, 6, .OAMData_c2 ; BATTLE_ANIM_OAMSET_C2 + battleanimoam $11, 9, .OAMData_c3 ; BATTLE_ANIM_OAMSET_C3 + battleanimoam $0e, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_C4 + battleanimoam $0b, 4, .OAMData_30 ; BATTLE_ANIM_OAMSET_C5 + battleanimoam $1c, 6, .OAMData_02 ; BATTLE_ANIM_OAMSET_C6 + battleanimoam $20, 16, .OAMData_c1 ; BATTLE_ANIM_OAMSET_C7 + battleanimoam $05, 6, .OAMData_c8 ; BATTLE_ANIM_OAMSET_C8 + battleanimoam $0b, 4, .OAMData_03 ; BATTLE_ANIM_OAMSET_C9 + battleanimoam $09, 4, .OAMData_ca ; BATTLE_ANIM_OAMSET_CA + battleanimoam $0b, 4, .OAMData_04 ; BATTLE_ANIM_OAMSET_CB + battleanimoam $11, 13, .OAMData_cc ; BATTLE_ANIM_OAMSET_CC + battleanimoam $12, 13, .OAMData_cc ; BATTLE_ANIM_OAMSET_CD + battleanimoam $13, 13, .OAMData_cc ; BATTLE_ANIM_OAMSET_CE + battleanimoam $00, 7, .OAMData_cf ; BATTLE_ANIM_OAMSET_CF + battleanimoam $00, 6, .OAMData_d0 ; BATTLE_ANIM_OAMSET_D0 + battleanimoam $00, 14, .OAMData_d1 ; BATTLE_ANIM_OAMSET_D1 + battleanimoam $00, 12, .OAMData_d2 ; BATTLE_ANIM_OAMSET_D2 + +.OAMData_11: + dbsprite -1, -1, 4, 0, $00, $0 + dbsprite -1, 0, 4, 0, $01, $0 + +.OAMData_56: + dbsprite -1, -1, 0, 4, $00, $0 + dbsprite 0, -1, 0, 4, $01, $0 + +.OAMData_03: + dbsprite -1, -1, 0, 0, $00, $0 + dbsprite 0, -1, 0, 0, $01, $0 + dbsprite -1, 0, 0, 0, $02, $0 + dbsprite 0, 0, 0, 0, $03, $0 + +.OAMData_02: + dbsprite -1, -1, 0, 0, $00, $0 + dbsprite 0, -1, 0, 0, $00, X_FLIP + dbsprite -1, 0, 0, 0, $00, Y_FLIP + dbsprite 0, 0, 0, 0, $00, X_FLIP | Y_FLIP + +.OAMData_c3: + dbsprite -2, -2, 4, 4, $00, $0 + dbsprite -1, -2, 4, 4, $01, $0 + dbsprite 0, -2, 4, 4, $02, $0 + dbsprite -2, -1, 4, 4, $03, $0 + dbsprite -1, -1, 4, 4, $04, $0 + dbsprite 0, -1, 4, 4, $05, $0 + dbsprite -2, 0, 4, 4, $06, $0 + dbsprite -1, 0, 4, 4, $07, $0 + dbsprite 0, 0, 4, 4, $08, $0 + +.OAMData_01: + dbsprite -2, -2, 4, 4, $00, $0 + dbsprite -1, -2, 4, 4, $01, $0 + dbsprite 0, -2, 4, 4, $00, X_FLIP + dbsprite -2, -1, 4, 4, $02, $0 + dbsprite -1, -1, 4, 4, $03, $0 + dbsprite 0, -1, 4, 4, $02, X_FLIP | Y_FLIP + dbsprite -2, 0, 4, 4, $00, Y_FLIP + dbsprite -1, 0, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 0, 0, 4, 4, $00, X_FLIP | Y_FLIP + +.OAMData_1c: + dbsprite -2, -2, 0, 0, $00, $0 + dbsprite -1, -2, 0, 0, $01, $0 + dbsprite 0, -2, 0, 0, $02, $0 + dbsprite 1, -2, 0, 0, $03, $0 + dbsprite -2, -1, 0, 0, $04, $0 + dbsprite -1, -1, 0, 0, $05, $0 + dbsprite 0, -1, 0, 0, $06, $0 + dbsprite 1, -1, 0, 0, $07, $0 + dbsprite -2, 0, 0, 0, $08, $0 + dbsprite -1, 0, 0, 0, $09, $0 + dbsprite 0, 0, 0, 0, $0a, $0 + dbsprite 1, 0, 0, 0, $0b, $0 + dbsprite -2, 1, 0, 0, $0c, $0 + dbsprite -1, 1, 0, 0, $0d, $0 + dbsprite 0, 1, 0, 0, $0e, $0 + dbsprite 1, 1, 0, 0, $0f, $0 + +.OAMData_00: + dbsprite -2, -2, 0, 0, $00, $0 + dbsprite -1, -2, 0, 0, $01, $0 + dbsprite -2, -1, 0, 0, $02, $0 + dbsprite -1, -1, 0, 0, $03, $0 + dbsprite 0, -2, 0, 0, $01, X_FLIP + dbsprite 1, -2, 0, 0, $00, X_FLIP + dbsprite 0, -1, 0, 0, $03, X_FLIP + dbsprite 1, -1, 0, 0, $02, X_FLIP + dbsprite -2, 0, 0, 0, $02, Y_FLIP + dbsprite -1, 0, 0, 0, $03, Y_FLIP + dbsprite -2, 1, 0, 0, $00, Y_FLIP + dbsprite -1, 1, 0, 0, $01, Y_FLIP + dbsprite 0, 0, 0, 0, $03, X_FLIP | Y_FLIP + dbsprite 1, 0, 0, 0, $02, X_FLIP | Y_FLIP + dbsprite 0, 1, 0, 0, $01, X_FLIP | Y_FLIP + dbsprite 1, 1, 0, 0, $00, X_FLIP | Y_FLIP + +.OAMData_09: + dbsprite -3, -3, 4, 4, $00, $0 + dbsprite -2, -3, 4, 4, $01, $0 + dbsprite -3, -2, 4, 4, $02, $0 + dbsprite -2, -2, 4, 4, $03, $0 + dbsprite 0, -3, 4, 4, $01, X_FLIP + dbsprite 1, -3, 4, 4, $00, X_FLIP + dbsprite 0, -2, 4, 4, $03, X_FLIP + dbsprite 1, -2, 4, 4, $02, X_FLIP + dbsprite -3, 0, 4, 4, $02, Y_FLIP + dbsprite -2, 0, 4, 4, $03, Y_FLIP + dbsprite -3, 1, 4, 4, $00, Y_FLIP + dbsprite -2, 1, 4, 4, $01, Y_FLIP + dbsprite 0, 0, 4, 4, $03, X_FLIP | Y_FLIP + dbsprite 1, 0, 4, 4, $02, X_FLIP | Y_FLIP + dbsprite 0, 1, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 1, 1, 4, 4, $00, X_FLIP | Y_FLIP + +.OAMData_0c: + dbsprite -1, -1, 0, 4, $00, $0 + dbsprite 0, -1, 0, 4, $00, X_FLIP + +.OAMData_6a: + dbsprite -1, 0, 0, 0, $00, $0 + dbsprite 0, 0, 0, 0, $00, X_FLIP + +.OAMData_04: + dbsprite -1, -1, 0, 0, $00, $0 + dbsprite 0, -1, 0, 0, $00, X_FLIP + dbsprite -1, 0, 0, 0, $01, $0 + dbsprite 0, 0, 0, 0, $01, X_FLIP + +.OAMData_5d: + dbsprite -1, -1, 0, 0, $00, $0 + dbsprite 0, -1, 0, 0, $01, $0 + dbsprite -1, 0, 0, 0, $00, Y_FLIP + dbsprite 0, 0, 0, 0, $01, Y_FLIP + +.OAMData_13: + dbsprite -1, -1, 0, 2, $02, $0 + dbsprite -1, 0, 0, 2, $03, $0 + dbsprite 0, -2, 0, 6, $02, $0 + dbsprite 0, -1, 0, 6, $03, $0 + +.OAMData_22: + dbsprite -11, 1, 0, 0, $01, $0 + dbsprite -10, 0, 0, 0, $02, $0 + dbsprite -9, 0, 0, 0, $03, $0 + dbsprite -8, 0, 0, 0, $00, $0 + dbsprite -7, 0, 0, 0, $03, $0 + dbsprite -6, 0, 0, 0, $00, $0 + dbsprite -5, 0, 0, 0, $03, $0 + dbsprite -4, 0, 0, 0, $00, $0 + dbsprite -3, 0, 0, 0, $03, $0 + dbsprite -2, 0, 0, 0, $00, $0 + dbsprite -1, 0, 0, 0, $01, $0 + dbsprite 0, -1, 0, 0, $02, $0 + dbsprite 1, -1, 0, 0, $03, $0 + dbsprite 2, -1, 0, 0, $00, $0 + dbsprite 3, -1, 0, 0, $03, $0 + dbsprite 4, -1, 0, 0, $00, $0 + dbsprite 5, -1, 0, 0, $03, $0 + dbsprite 6, -1, 0, 0, $00, $0 + dbsprite 7, -1, 0, 0, $03, $0 + dbsprite 8, -1, 0, 0, $00, $0 + dbsprite 9, -1, 0, 0, $01, $0 + dbsprite 10, -2, 0, 0, $02, $0 + +.OAMData_2a: + dbsprite -1, -3, 0, 4, $00, $0 + dbsprite 0, -3, 0, 4, $00, X_FLIP + dbsprite -1, -2, 0, 4, $01, $0 + dbsprite 0, -2, 0, 4, $01, X_FLIP + dbsprite -1, -1, 4, 4, $02, $0 + +.OAMData_2b: + dbsprite -1, -4, 0, 4, $00, $0 + dbsprite 0, -4, 0, 4, $00, X_FLIP + dbsprite -1, -3, 0, 4, $01, $0 + dbsprite 0, -3, 0, 4, $01, X_FLIP + dbsprite -1, -2, 4, 4, $02, $0 + dbsprite -1, -1, 4, 4, $02, $0 + +.OAMData_2c: + dbsprite -1, -5, 0, 4, $00, $0 + dbsprite 0, -5, 0, 4, $00, X_FLIP + dbsprite -1, -4, 0, 4, $01, $0 + dbsprite 0, -4, 0, 4, $01, X_FLIP + dbsprite -1, -3, 4, 4, $02, $0 + dbsprite -1, -2, 4, 4, $02, $0 + dbsprite -1, -1, 4, 4, $02, $0 + +.OAMData_2d: + dbsprite -1, -6, 0, 4, $00, $0 + dbsprite 0, -6, 0, 4, $00, X_FLIP + dbsprite -1, -5, 0, 4, $01, $0 + dbsprite 0, -5, 0, 4, $01, X_FLIP + dbsprite -1, -4, 4, 4, $02, $0 + dbsprite -1, -3, 4, 4, $02, $0 + dbsprite -1, -2, 4, 4, $02, $0 + dbsprite -1, -1, 4, 4, $02, $0 + +.OAMData_2e: + dbsprite -1, -7, 0, 4, $00, $0 + dbsprite 0, -7, 0, 4, $00, X_FLIP + dbsprite -1, -6, 0, 4, $01, $0 + dbsprite 0, -6, 0, 4, $01, X_FLIP + dbsprite -1, -5, 4, 4, $02, $0 + dbsprite -1, -4, 4, 4, $02, $0 + dbsprite -1, -3, 4, 4, $02, $0 + dbsprite -1, -2, 4, 4, $02, $0 + dbsprite -1, -1, 4, 4, $02, $0 + +.OAMData_2f: + dbsprite -1, -1, 0, 0, $00, $0 + dbsprite 0, -1, 0, 0, $00, X_FLIP + dbsprite -1, 0, 0, 0, $01, $0 + dbsprite 0, 0, 0, 0, $00, X_FLIP | Y_FLIP + +.OAMData_30: + dbsprite -1, -1, 0, 0, $00, $0 + dbsprite 0, -1, 0, 0, $01, $0 + dbsprite -1, 0, 0, 0, $01, X_FLIP | Y_FLIP + dbsprite 0, 0, 0, 0, $00, X_FLIP | Y_FLIP + +.OAMData_31: + dbsprite -1, -2, 0, 4, $00, $0 + dbsprite 0, -2, 0, 4, $01, $0 + dbsprite -1, -1, 0, 4, $02, $0 + dbsprite 0, -1, 0, 4, $03, $0 + dbsprite -1, 0, 0, 4, $04, $0 + dbsprite 0, 0, 0, 4, $05, $0 + +.OAMData_76: + dbsprite -1, -1, 0, 5, $00, $0 + dbsprite 0, -1, 0, 1, $00, $0 + +.OAMData_32: + dbsprite -2, -1, 4, 0, $00, $0 + dbsprite 0, -1, 4, 0, $00, $0 + dbsprite -2, -3, 4, 0, $00, $0 + dbsprite 0, -3, 4, 0, $00, $0 + dbsprite -3, -2, 4, 0, $00, $0 + dbsprite -2, -2, 4, 0, $01, $0 + dbsprite -1, -2, 4, 0, $00, $0 + dbsprite 0, -2, 4, 0, $01, $0 + dbsprite 1, -2, 4, 0, $00, $0 + dbsprite -4, -1, 4, 0, $00, $0 + dbsprite -3, -1, 4, 0, $01, $0 + dbsprite -1, -1, 4, 0, $01, $0 + dbsprite 1, -1, 4, 0, $01, $0 + dbsprite 2, -1, 4, 0, $00, $0 + +.OAMData_33: + dbsprite -2, -2, 4, 0, $00, $0 + dbsprite 0, -2, 4, 0, $00, $0 + dbsprite -3, -1, 4, 0, $00, $0 + dbsprite -2, -1, 4, 0, $01, $0 + dbsprite -1, -1, 4, 0, $00, $0 + dbsprite 0, -1, 4, 0, $01, $0 + dbsprite 1, -1, 4, 0, $00, $0 + dbsprite -2, -4, 4, 0, $00, $0 + dbsprite 0, -4, 4, 0, $00, $0 + dbsprite -3, -3, 4, 0, $00, $0 + dbsprite -2, -3, 4, 0, $01, $0 + dbsprite -1, -3, 4, 0, $00, $0 + dbsprite 0, -3, 4, 0, $01, $0 + dbsprite 1, -3, 4, 0, $00, $0 + dbsprite -4, -2, 4, 0, $00, $0 + dbsprite -3, -2, 4, 0, $01, $0 + dbsprite -1, -2, 4, 0, $01, $0 + dbsprite 1, -2, 4, 0, $01, $0 + dbsprite 2, -2, 4, 0, $00, $0 + dbsprite -4, -1, 4, 0, $01, $0 + dbsprite 2, -1, 4, 0, $01, $0 + +.OAMData_36: + dbsprite -1, -7, 0, 4, $00, $0 + dbsprite 0, -7, 0, 4, $01, $0 + dbsprite -1, -6, 0, 4, $02, $0 + dbsprite 0, -6, 0, 4, $03, $0 + dbsprite -1, -5, 0, 4, $04, $0 + dbsprite 0, -5, 0, 4, $05, $0 + dbsprite -1, -4, 0, 4, $06, $0 + dbsprite 0, -4, 0, 4, $07, $0 + dbsprite -1, -3, 0, 4, $08, $0 + dbsprite 0, -3, 0, 4, $09, $0 + dbsprite -1, -2, 0, 4, $0a, $0 + dbsprite 0, -2, 0, 4, $0b, $0 + dbsprite -1, -1, 0, 4, $0c, $0 + dbsprite 0, -1, 0, 4, $0d, $0 + +.OAMData_3a: + dbsprite -1, -7, 0, 4, $0c, $0 + dbsprite 0, -7, 0, 4, $0d, $0 + dbsprite -1, -6, 0, 4, $08, $0 + dbsprite 0, -6, 0, 4, $09, $0 + dbsprite -1, -5, 0, 4, $04, $0 + dbsprite 0, -5, 0, 4, $05, $0 + dbsprite -1, -4, 0, 4, $00, $0 + dbsprite 0, -4, 0, 4, $01, $0 + dbsprite -1, -3, 0, 4, $02, $0 + dbsprite 0, -3, 0, 4, $03, $0 + dbsprite 0, -2, 0, 4, $02, $0 + dbsprite 1, -2, 0, 4, $03, $0 + dbsprite 0, -1, 0, 4, $0a, $0 + dbsprite 1, -1, 0, 4, $0b, $0 + +.OAMData_3e: + dbsprite -2, 1, 0, 4, $00, Y_FLIP + dbsprite -1, 1, 0, 4, $02, Y_FLIP + dbsprite 0, 1, 0, 4, $02, X_FLIP | Y_FLIP + dbsprite 1, 1, 0, 4, $00, X_FLIP | Y_FLIP + dbsprite -3, -1, 0, 4, $09, X_FLIP + dbsprite -2, -1, 0, 4, $08, X_FLIP + dbsprite -1, -1, 0, 4, $06, $0 + dbsprite 0, -1, 0, 4, $07, $0 + dbsprite 1, -1, 0, 4, $08, $0 + dbsprite 2, -1, 0, 4, $09, $0 + dbsprite -3, 0, 0, 4, $01, X_FLIP + dbsprite -2, 0, 0, 4, $00, X_FLIP + dbsprite -1, 0, 0, 4, $0c, $0 + dbsprite 0, 0, 0, 4, $0d, $0 + dbsprite 1, 0, 0, 4, $00, $0 + dbsprite 2, 0, 0, 4, $01, $0 + dbsprite -2, -3, 0, 4, $00, $0 + dbsprite -1, -3, 0, 4, $02, $0 + dbsprite 0, -3, 0, 4, $02, X_FLIP + dbsprite 1, -3, 0, 4, $00, X_FLIP + dbsprite -3, -2, 0, 4, $03, X_FLIP + dbsprite -2, -2, 0, 4, $02, X_FLIP + dbsprite -1, -2, 0, 4, $04, $0 + dbsprite 0, -2, 0, 4, $05, $0 + dbsprite 1, -2, 0, 4, $02, $0 + dbsprite 2, -2, 0, 4, $03, $0 + +.OAMData_41: + dbsprite -2, -3, 0, 4, $00, $0 + dbsprite -1, -3, 0, 4, $02, $0 + dbsprite 0, -3, 0, 4, $02, X_FLIP + dbsprite 1, -3, 0, 4, $00, X_FLIP + dbsprite -3, -2, 4, 4, $00, $0 + dbsprite -2, -2, 4, 4, $01, $0 + dbsprite -1, -2, 0, 4, $05, X_FLIP + dbsprite 0, -2, 0, 4, $04, X_FLIP + dbsprite 0, -2, 4, 4, $01, X_FLIP + dbsprite 1, -2, 4, 4, $00, X_FLIP + dbsprite -3, -1, 4, 4, $02, $0 + dbsprite -2, -1, 4, 4, $03, $0 + dbsprite -1, -1, 0, 4, $07, X_FLIP + dbsprite 0, -1, 0, 4, $06, X_FLIP + dbsprite 0, -1, 4, 4, $03, X_FLIP + dbsprite 1, -1, 4, 4, $02, X_FLIP + dbsprite -3, 0, 4, 4, $04, $0 + dbsprite -2, 0, 4, 4, $05, $0 + dbsprite -1, 0, 0, 4, $0d, X_FLIP + dbsprite 0, 0, 0, 4, $0c, X_FLIP + dbsprite 0, 0, 4, 4, $05, X_FLIP + dbsprite 1, 0, 4, 4, $04, X_FLIP + dbsprite -2, 1, 0, 4, $00, Y_FLIP + dbsprite -1, 1, 0, 4, $02, Y_FLIP + dbsprite 0, 1, 0, 4, $02, X_FLIP | Y_FLIP + dbsprite 1, 1, 0, 4, $00, X_FLIP | Y_FLIP + +.OAMData_42: + dbsprite -1, -3, 4, 0, $02, $0 + dbsprite -1, 2, 4, 0, $02, X_FLIP | Y_FLIP + dbsprite -3, -1, 0, 4, $01, $0 + dbsprite 2, -1, 0, 4, $01, X_FLIP | Y_FLIP + dbsprite -1, -4, 4, 0, $02, $0 + dbsprite -1, 3, 4, 0, $02, X_FLIP | Y_FLIP + dbsprite -4, -1, 0, 4, $01, $0 + dbsprite 3, -1, 0, 4, $01, X_FLIP | Y_FLIP + +.OAMData_44: + dbsprite -3, -3, 5, 5, $00, X_FLIP + dbsprite 1, -3, 3, 5, $00, $0 + dbsprite -3, 1, 5, 3, $00, X_FLIP | Y_FLIP + dbsprite 1, 1, 3, 3, $00, Y_FLIP + dbsprite -4, -4, 5, 5, $00, X_FLIP + dbsprite 2, -4, 3, 5, $00, $0 + dbsprite -4, 2, 5, 3, $00, X_FLIP | Y_FLIP + dbsprite 2, 2, 3, 3, $00, Y_FLIP + +.OAMData_46: + dbsprite -1, -3, 4, 4, $02, $0 + dbsprite -1, 1, 4, 4, $02, X_FLIP | Y_FLIP + dbsprite -3, -1, 4, 4, $01, $0 + dbsprite 1, -1, 4, 4, $01, X_FLIP | Y_FLIP + + +.OAMData_47: + dbsprite -2, -2, 0, 0, $00, X_FLIP + dbsprite 1, -2, 0, 0, $00, $0 + dbsprite -2, 1, 0, 0, $00, X_FLIP | Y_FLIP + dbsprite 1, 1, 0, 0, $00, Y_FLIP + + +.OAMData_48: + dbsprite -1, -3, 4, 0, $00, $0 + dbsprite -1, -2, 2, 0, $00, $0 + dbsprite -1, -1, 0, 0, $00, $0 + dbsprite -1, 0, 0, 0, $00, $0 + dbsprite -1, 1, 2, 0, $00, $0 + dbsprite -1, 2, 4, 0, $00, $0 + +.OAMData_49: + dbsprite -2, -1, 0, 4, $00, X_FLIP + dbsprite -1, -1, 0, 2, $00, X_FLIP + dbsprite 0, -1, 0, 2, $00, $0 + dbsprite 1, -1, 0, 4, $00, $0 + +.OAMData_4a: + dbsprite -1, -1, 0, 4, $00, X_FLIP | Y_FLIP + dbsprite 0, -1, 0, 4, $00, Y_FLIP + +.OAMData_0f: + dbsprite -1, -1, 4, 4, $00, $0 + dbsprite -2, -1, 4, 4, $01, $0 + dbsprite -1, -1, 4, 4, $01, X_FLIP + dbsprite -2, 0, 4, 4, $01, Y_FLIP + dbsprite -1, 0, 4, 4, $01, X_FLIP | Y_FLIP + +.OAMData_4c: + dbsprite -1, -1, 4, 4, $00, $0 + dbsprite -2, 0, 6, 2, $00, $0 + dbsprite -3, 0, 6, 2, $01, $0 + dbsprite -2, 0, 6, 2, $01, X_FLIP + dbsprite -3, 1, 6, 2, $01, Y_FLIP + dbsprite -2, 1, 6, 2, $01, X_FLIP | Y_FLIP + +.OAMData_4d: + dbsprite -1, -1, 4, 4, $00, $0 + dbsprite -2, 0, 6, 2, $00, $0 + dbsprite -2, 1, 0, 0, $00, $0 + dbsprite -3, 1, 0, 0, $01, $0 + dbsprite -2, 1, 0, 0, $01, X_FLIP + dbsprite -3, 2, 0, 0, $01, Y_FLIP + dbsprite -2, 2, 0, 0, $01, X_FLIP | Y_FLIP + +.OAMData_4f: + dbsprite -1, -1, 4, 4, $00, $0 + dbsprite -2, 0, 6, 2, $00, $0 + dbsprite -2, 1, 0, 0, $00, $0 + dbsprite -3, 1, 2, 6, $00, $0 + dbsprite -4, 1, 2, 6, $01, $0 + dbsprite -3, 1, 2, 6, $01, X_FLIP + dbsprite -4, 2, 2, 6, $01, Y_FLIP + dbsprite -3, 2, 2, 6, $01, X_FLIP | Y_FLIP + +.OAMData_50: + dbsprite -1, -1, 4, 4, $00, $0 + dbsprite -2, 0, 6, 2, $00, $0 + dbsprite -2, 1, 0, 0, $00, $0 + dbsprite -3, 1, 2, 6, $00, $0 + dbsprite -4, 2, 4, 4, $00, $0 + dbsprite -5, 2, 4, 4, $01, $0 + dbsprite -4, 2, 4, 4, $01, X_FLIP + dbsprite -5, 3, 4, 4, $01, Y_FLIP + dbsprite -4, 3, 4, 4, $01, X_FLIP | Y_FLIP + +.OAMData_51: + dbsprite -1, -1, 4, 4, $00, $0 + dbsprite -2, 0, 6, 2, $00, $0 + dbsprite -2, 1, 0, 0, $00, $0 + dbsprite -3, 1, 2, 6, $00, $0 + dbsprite -4, 2, 4, 4, $00, $0 + dbsprite -5, 3, 6, 2, $00, $0 + dbsprite -6, 3, 6, 2, $01, $0 + dbsprite -5, 3, 6, 2, $01, X_FLIP + dbsprite -6, 4, 6, 2, $01, Y_FLIP + dbsprite -5, 4, 6, 2, $01, X_FLIP | Y_FLIP + +.OAMData_59: + dbsprite -2, -1, 0, 4, $00, $0 + dbsprite -1, -1, 0, 4, $01, $0 + dbsprite 0, -1, 0, 4, $01, X_FLIP + dbsprite 1, -1, 0, 4, $00, X_FLIP + +.OAMData_5a: + dbsprite -2, -1, 0, 4, $02, $0 + dbsprite -1, -1, 0, 4, $01, $0 + dbsprite 0, -1, 0, 4, $01, X_FLIP + dbsprite 1, -1, 0, 4, $02, X_FLIP + +.OAMData_60: + dbsprite -1, -1, 4, 0, $00, $0 + +.OAMData_69: + dbsprite -1, 0, 4, 0, $00, $0 + +.OAMData_61: + dbsprite -4, -1, 4, 4, $00, $0 + dbsprite -3, -1, 4, 4, $01, $0 + dbsprite -2, -1, 4, 4, $02, $0 + dbsprite -1, -1, 4, 4, $03, $0 + dbsprite 0, -1, 4, 4, $04, $0 + dbsprite 1, -1, 4, 4, $05, $0 + dbsprite 2, -1, 4, 4, $06, $0 + dbsprite 1, -2, 4, 4, $07, $0 + dbsprite 2, -2, 4, 4, $08, $0 + +.OAMData_65: + dbsprite -4, -2, 4, 4, $08, X_FLIP + dbsprite -3, -2, 4, 4, $07, X_FLIP + dbsprite -4, -1, 4, 4, $06, X_FLIP + dbsprite -3, -1, 4, 4, $05, X_FLIP + dbsprite -2, -1, 4, 4, $04, X_FLIP + dbsprite -1, -1, 4, 4, $03, X_FLIP + dbsprite 0, -1, 4, 4, $02, X_FLIP + dbsprite 1, -1, 4, 4, $01, X_FLIP + dbsprite 2, -1, 4, 4, $00, X_FLIP + +; Not to be confused with the final game's .OAMData_cf. +; .OAMData_d4 in final pokegold. +.OAMData_cf: + dbsprite -4, 0, 4, 0, $00, OBP_NUM + dbsprite -3, 0, 4, 0, $01, OBP_NUM + dbsprite -2, 0, 4, 0, $02, OBP_NUM + dbsprite -1, 0, 4, 0, $03, OBP_NUM + dbsprite 0, 0, 4, 0, $04, OBP_NUM + dbsprite 1, 0, 4, 0, $05, OBP_NUM + dbsprite 2, 0, 4, 0, $06, OBP_NUM + +; .OAMData_d6 in final pokegold. +.OAMData_d1: + dbsprite -4, -1, 4, 0, $00, OBP_NUM + dbsprite -4, 0, 4, 0, $01, OBP_NUM + dbsprite -3, -1, 4, 0, $02, OBP_NUM + dbsprite -3, 0, 4, 0, $03, OBP_NUM + dbsprite -2, -1, 4, 0, $04, OBP_NUM + dbsprite -2, 0, 4, 0, $05, OBP_NUM + dbsprite -1, -1, 4, 0, $06, OBP_NUM + dbsprite -1, 0, 4, 0, $07, OBP_NUM + dbsprite 0, -1, 4, 0, $08, OBP_NUM + dbsprite 0, 0, 4, 0, $09, OBP_NUM + dbsprite 1, -1, 4, 0, $0a, OBP_NUM + dbsprite 1, 0, 4, 0, $0b, OBP_NUM + dbsprite 2, -1, 4, 0, $0c, OBP_NUM + dbsprite 2, 0, 4, 0, $0d, OBP_NUM + +; .OAMData_d5 in final pokegold. +.OAMData_d0: + dbsprite -3, 0, 0, 0, $00, OBP_NUM + dbsprite -2, 0, 0, 0, $01, OBP_NUM + dbsprite -1, 0, 0, 0, $02, OBP_NUM + dbsprite 0, 0, 0, 0, $03, OBP_NUM + dbsprite 1, 0, 0, 0, $04, OBP_NUM + dbsprite 2, 0, 0, 0, $05, OBP_NUM + +; .OAMData_d7 in final pokegold. +.OAMData_d2: + dbsprite -3, 0, 0, 0, $00, OBP_NUM + dbsprite -3, 1, 0, 0, $01, OBP_NUM + dbsprite -2, 0, 0, 0, $02, OBP_NUM + dbsprite -2, 1, 0, 0, $03, OBP_NUM + dbsprite -1, 0, 0, 0, $04, OBP_NUM + dbsprite -1, 1, 0, 0, $05, OBP_NUM + dbsprite 0, 0, 0, 0, $06, OBP_NUM + dbsprite 0, 1, 0, 0, $07, OBP_NUM + dbsprite 1, 0, 0, 0, $08, OBP_NUM + dbsprite 1, 1, 0, 0, $09, OBP_NUM + dbsprite 2, 0, 0, 0, $0a, OBP_NUM + dbsprite 2, 1, 0, 0, $0b, OBP_NUM + +.OAMData_6e: + dbsprite 0, -2, 4, 4, $00, $0 + dbsprite -2, -1, 4, 4, $01, $0 + dbsprite -1, -1, 4, 4, $02, $0 + dbsprite 0, -1, 4, 4, $03, $0 + dbsprite -2, 0, 4, 4, $04, $0 + +.OAMData_6f: + dbsprite -2, -1, 4, 4, $00, $0 + dbsprite -1, -1, 4, 4, $01, $0 + dbsprite 0, -1, 4, 4, $02, $0 + +.OAMData_77: + dbsprite 1, -4, 4, 4, $01, X_FLIP | Y_FLIP + +.OAMData_78: + dbsprite 1, -4, 4, 4, $00, $0 + dbsprite 0, -4, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 1, -3, 4, 4, $01, X_FLIP | Y_FLIP + +.OAMData_79: + dbsprite 1, -4, 4, 4, $01, $0 + dbsprite 0, -4, 4, 4, $00, $0 + dbsprite -1, -4, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 1, -3, 4, 4, $00, $0 + dbsprite 0, -3, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 1, -2, 4, 4, $01, X_FLIP | Y_FLIP + +.OAMData_7a: + dbsprite -2, -4, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite -1, -4, 4, 4, $00, $0 + dbsprite 0, -4, 4, 4, $01, $0 + dbsprite -1, -3, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 0, -3, 4, 4, $00, $0 + dbsprite 1, -3, 4, 4, $01, $0 + dbsprite 0, -2, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 1, -2, 4, 4, $00, $0 + dbsprite 1, -1, 4, 4, $01, X_FLIP | Y_FLIP + +.OAMData_7b: + dbsprite -3, -4, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite -2, -4, 4, 4, $00, $0 + dbsprite -1, -4, 4, 4, $01, $0 + dbsprite -2, -3, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite -1, -3, 4, 4, $00, $0 + dbsprite 0, -3, 4, 4, $01, $0 + dbsprite -1, -2, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 0, -2, 4, 4, $00, $0 + dbsprite 1, -2, 4, 4, $01, $0 + dbsprite 0, -1, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 1, -1, 4, 4, $00, $0 + dbsprite 1, 0, 4, 4, $01, X_FLIP | Y_FLIP + +.OAMData_7c: + dbsprite -3, -4, 4, 4, $00, $0 + dbsprite -2, -4, 4, 4, $01, $0 + dbsprite -3, -3, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite -2, -3, 4, 4, $00, $0 + dbsprite -1, -3, 4, 4, $01, $0 + dbsprite -2, -2, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite -1, -2, 4, 4, $00, $0 + dbsprite 0, -2, 4, 4, $01, $0 + dbsprite -1, -1, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 0, -1, 4, 4, $00, $0 + dbsprite 1, -1, 4, 4, $01, $0 + dbsprite 0, 0, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 1, 0, 4, 4, $00, $0 + dbsprite 1, 1, 4, 4, $01, X_FLIP | Y_FLIP + +.OAMData_7d: + dbsprite -3, -4, 4, 4, $01, $0 + dbsprite -3, -3, 4, 4, $00, $0 + dbsprite -2, -3, 4, 4, $01, $0 + dbsprite -3, -2, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite -2, -2, 4, 4, $00, $0 + dbsprite -1, -2, 4, 4, $01, $0 + dbsprite -2, -1, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite -1, -1, 4, 4, $00, $0 + dbsprite 0, -1, 4, 4, $01, $0 + dbsprite -1, 0, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 0, 0, 4, 4, $00, $0 + dbsprite 1, 0, 4, 4, $01, $0 + dbsprite 0, 1, 4, 4, $01, X_FLIP | Y_FLIP + dbsprite 1, 1, 4, 4, $00, $0 + dbsprite 1, 2, 4, 4, $01, X_FLIP | Y_FLIP + +.OAMData_70: + dbsprite -1, -2, 0, 0, $00, $0 + dbsprite -1, -1, 0, 0, $01, $0 + dbsprite 0, -2, 0, 0, $00, X_FLIP + dbsprite 0, -1, 0, 0, $01, X_FLIP + dbsprite -1, 0, 0, 0, $01, Y_FLIP + dbsprite -1, 1, 0, 0, $00, Y_FLIP + dbsprite 0, 0, 0, 0, $01, X_FLIP | Y_FLIP + dbsprite 0, 1, 0, 0, $00, X_FLIP | Y_FLIP + +.OAMData_81: + dbsprite -1, -1, 0, 0, $00, $0 + dbsprite 0, -1, 0, 0, $01, $0 + dbsprite -1, 0, 0, 0, $01, X_FLIP | Y_FLIP + dbsprite 0, 0, 0, 0, $00, X_FLIP | Y_FLIP + +.OAMData_87: + dbsprite -1, -2, 0, 4, $00, $0 + dbsprite 0, -2, 0, 4, $01, $0 + dbsprite -1, -1, 0, 4, $02, $0 + dbsprite 0, -1, 0, 4, $03, $0 + dbsprite -1, -1, 0, 4, $00, $0 + dbsprite 0, -1, 0, 4, $01, $0 + dbsprite -1, 0, 0, 4, $02, $0 + dbsprite 0, 0, 0, 4, $03, $0 + dbsprite -1, -3, 0, 4, $00, $0 + dbsprite 0, -3, 0, 4, $01, $0 + dbsprite -1, -2, 0, 4, $02, $0 + dbsprite 0, -2, 0, 4, $03, $0 + dbsprite -1, 0, 0, 4, $00, $0 + dbsprite 0, 0, 0, 4, $01, $0 + dbsprite -1, 1, 0, 4, $02, $0 + dbsprite 0, 1, 0, 4, $03, $0 + +.OAMData_88: + dbsprite -1, -2, 0, 0, $00, $0 + dbsprite 0, -2, 0, 0, $01, $0 + dbsprite -1, -1, 0, 0, $02, $0 + dbsprite 0, -1, 0, 0, $03, $0 + dbsprite -1, -1, 0, 0, $00, $0 + dbsprite 0, -1, 0, 0, $01, $0 + dbsprite -1, 0, 0, 0, $02, $0 + dbsprite 0, 0, 0, 0, $03, $0 + dbsprite -1, 0, 0, 0, $00, $0 + dbsprite 0, 0, 0, 0, $01, $0 + dbsprite -1, 1, 0, 0, $02, $0 + dbsprite 0, 1, 0, 0, $03, $0 + +.OAMData_8a: + dbsprite -1, -1, 4, 4, $00, $0 + dbsprite 0, -1, 4, 0, $00, $0 + dbsprite 1, -2, 4, 4, $00, $0 + dbsprite 2, -2, 4, 0, $00, $0 + dbsprite 3, -3, 4, 4, $00, $0 + dbsprite 4, -3, 4, 0, $00, $0 + dbsprite 5, -4, 4, 0, $00, $0 + dbsprite 6, -5, 4, 4, $00, $0 + +.OAMData_8e: + dbsprite -1, -3, 4, 4, $00, $0 + dbsprite -1, -2, 4, 4, $01, $0 + dbsprite -1, -1, 4, 4, $02, $0 + dbsprite -1, 0, 4, 4, $01, Y_FLIP + dbsprite -1, 1, 4, 4, $00, Y_FLIP + +.OAMData_8f: + dbsprite -2, -1, 0, 4, $00, $0 + dbsprite -1, -1, 0, 4, $01, $0 + dbsprite 0, -1, 0, 4, $02, $0 + dbsprite 1, -1, 0, 4, $03, $0 + +.OAMData_93: + dbsprite -2, -1, 4, 0, $00, $0 + dbsprite -1, -1, 4, 0, $01, $0 + dbsprite 0, -1, 4, 0, $02, $0 + dbsprite -2, 0, 4, 0, $03, $0 + dbsprite -1, 0, 4, 0, $04, $0 + dbsprite 0, 0, 4, 0, $05, $0 + +.OAMData_99: + dbsprite -1, -1, 0, 0, $00, $0 + dbsprite 0, -1, 0, 0, $05, $0 + dbsprite -1, 0, 0, 0, $01, $0 + dbsprite 0, 0, 0, 0, $05, $0 + +.OAMData_9b: + dbsprite 1, -4, 0, 4, $00, $0 + dbsprite 2, -4, 0, 4, $01, $0 + dbsprite -1, -3, 0, 4, $02, $0 + dbsprite 0, -3, 0, 4, $03, $0 + dbsprite 1, -3, 0, 4, $04, $0 + dbsprite 2, -3, 0, 4, $05, $0 + dbsprite 3, -3, 0, 4, $06, $0 + dbsprite -2, -2, 0, 4, $07, $0 + dbsprite -1, -2, 0, 4, $08, $0 + dbsprite 0, -2, 0, 4, $09, $0 + dbsprite 1, -2, 0, 4, $0a, $0 + dbsprite 2, -2, 0, 4, $0b, $0 + dbsprite 3, -2, 0, 4, $0c, $0 + dbsprite 4, -2, 0, 4, $0d, $0 + dbsprite -3, -1, 0, 4, $0e, $0 + dbsprite -2, -1, 0, 4, $0f, $0 + dbsprite -1, -1, 0, 4, $10, $0 + dbsprite 0, -1, 0, 4, $11, $0 + dbsprite 1, -1, 0, 4, $12, $0 + dbsprite 2, -1, 0, 4, $13, $0 + dbsprite -5, 0, 0, 4, $14, $0 + dbsprite -4, 0, 0, 4, $15, $0 + dbsprite -3, 0, 0, 4, $16, $0 + dbsprite -2, 0, 0, 4, $17, $0 + dbsprite -1, 0, 0, 4, $18, $0 + dbsprite 0, 0, 0, 4, $19, $0 + dbsprite 1, 0, 0, 4, $1a, $0 + dbsprite 2, 0, 0, 4, $1b, $0 + dbsprite 3, 0, 0, 4, $1c, $0 + dbsprite -5, 1, 0, 4, $1d, $0 + dbsprite -4, 1, 0, 4, $1e, $0 + dbsprite -2, 1, 0, 4, $1f, $0 + dbsprite -1, 1, 0, 4, $20, $0 + dbsprite 0, 1, 0, 4, $21, $0 + dbsprite 1, 1, 0, 4, $22, $0 + dbsprite 0, 2, 0, 4, $23, $0 + +.OAMData_9c: + dbsprite -1, 0, 0, 4, $02, $0 + dbsprite 0, 0, 0, 4, $03, $0 + dbsprite -1, -1, 0, 4, $01, $0 + dbsprite 0, -1, 0, 4, $01, X_FLIP + dbsprite -1, -2, 0, 4, $00, $0 + dbsprite 0, -2, 0, 4, $00, X_FLIP + +.OAMData_9f: + dbsprite -2, -1, 0, 0, $00, $0 + dbsprite -1, -1, 0, 0, $01, $0 + dbsprite 0, -1, 0, 0, $02, $0 + dbsprite 1, -1, 0, 0, $03, $0 + dbsprite -2, 0, 0, 0, $04, $0 + dbsprite -1, 0, 0, 0, $05, $0 + dbsprite 0, 0, 0, 0, $06, $0 + dbsprite 1, 0, 0, 0, $07, $0 + +.OAMData_a0: + dbsprite -1, -2, 4, 4, $00, $0 + dbsprite -1, -1, 4, 4, $00, $0 + dbsprite -1, 0, 4, 4, $00, $0 + dbsprite -1, -3, 4, 4, $00, $0 + dbsprite -1, 1, 4, 4, $00, $0 + dbsprite -1, -4, 4, 4, $00, $0 + dbsprite -1, 2, 4, 4, $00, $0 + +.OAMData_a4: + dbsprite -2, -2, 4, 4, $00, $0 + dbsprite -1, -2, 4, 4, $01, $0 + dbsprite 0, -2, 4, 4, $02, $0 + dbsprite -2, -1, 4, 4, $03, $0 + dbsprite -1, -1, 4, 4, $04, $0 + dbsprite 0, -1, 4, 4, $05, $0 + dbsprite -2, 0, 4, 4, $00, Y_FLIP + dbsprite -1, 0, 4, 4, $01, Y_FLIP + dbsprite 0, 0, 4, 4, $02, Y_FLIP + +.OAMData_ac: + dbsprite -2, -1, 0, 4, $00, $0 + dbsprite -1, -1, 0, 4, $01, $0 + dbsprite 0, -1, 0, 4, $01, X_FLIP + dbsprite 1, -1, 0, 4, $00, X_FLIP + +.OAMData_bc: + dbsprite -3, -1, 0, 4, $00, $0 + dbsprite -2, -1, 0, 4, $01, $0 + dbsprite -1, -1, 0, 4, $02, $0 + dbsprite 0, -1, 0, 4, $02, X_FLIP + dbsprite 1, -1, 0, 4, $01, X_FLIP + dbsprite 2, -1, 0, 4, $00, X_FLIP + +.OAMData_c1: + dbsprite -2, -2, 0, 0, $00, $0 + dbsprite -1, -2, 0, 0, $01, $0 + dbsprite 0, -2, 0, 0, $02, $0 + dbsprite 1, -2, 0, 0, $00, X_FLIP + dbsprite -2, -1, 0, 0, $03, $0 + dbsprite -1, -1, 0, 0, $04, $0 + dbsprite 0, -1, 0, 0, $04, X_FLIP + dbsprite 1, -1, 0, 0, $05, $0 + dbsprite -2, 0, 0, 0, $05, X_FLIP | Y_FLIP + dbsprite -1, 0, 0, 0, $04, Y_FLIP + dbsprite 0, 0, 0, 0, $04, X_FLIP | Y_FLIP + dbsprite 1, 0, 0, 0, $03, X_FLIP | Y_FLIP + dbsprite -2, 1, 0, 0, $00, Y_FLIP + dbsprite -1, 1, 0, 0, $02, X_FLIP | Y_FLIP + dbsprite 0, 1, 0, 0, $01, X_FLIP | Y_FLIP + dbsprite 1, 1, 0, 0, $00, X_FLIP | Y_FLIP + +.OAMData_c2: + dbsprite -2, -1, 0, 0, $00, $0 + dbsprite -1, -1, 0, 0, $01, $0 + dbsprite 0, -1, 0, 0, $00, X_FLIP | Y_FLIP + dbsprite -1, 0, 0, 0, $00, $0 + dbsprite 0, 0, 0, 0, $01, $0 + dbsprite 1, 0, 0, 0, $00, X_FLIP | Y_FLIP + +.OAMData_c8: + dbsprite 1, -1, 4, 0, $00, $0 + dbsprite 2, -1, 4, 0, $01, $0 + dbsprite -1, 0, 4, 0, $02, $0 + dbsprite 0, 0, 4, 0, $03, $0 + dbsprite 1, 0, 4, 0, $04, $0 + dbsprite 2, 0, 4, 0, $05, $0 + +.OAMData_ca: + dbsprite -1, -1, 0, 0, $00, $0 + dbsprite 0, -1, 0, 0, $01, X_FLIP | Y_FLIP + dbsprite -1, 0, 0, 0, $01, $0 + dbsprite 0, 0, 0, 0, $01, X_FLIP + +.OAMData_cc: + dbsprite -13, -2, 4, 0, $00, $0 + dbsprite -11, -4, 4, 0, $00, $0 + dbsprite -9, -1, 4, 0, $00, $0 + dbsprite -7, -5, 4, 0, $00, $0 + dbsprite -5, -3, 4, 0, $00, $0 + dbsprite -3, -5, 4, 0, $00, $0 + dbsprite -1, -3, 4, 0, $00, $0 + dbsprite 0, -3, 4, 0, $00, $0 + dbsprite 2, -5, 4, 0, $00, $0 + dbsprite 4, 0, 4, 0, $00, $0 + dbsprite 6, -2, 4, 0, $00, $0 + dbsprite 8, -4, 4, 0, $00, $0 + dbsprite 10, -2, 4, 0, $00, $0 diff --git a/data/battle_anims/object_gfx.inc b/data/battle_anims/object_gfx.inc new file mode 100644 index 0000000..aaf00a3 --- /dev/null +++ b/data/battle_anims/object_gfx.inc @@ -0,0 +1,50 @@ +MACRO anim_obj_gfx +; # tiles, gfx pointer + db \1 + dba \2 +ENDM + +AnimObjGFX: +; entries correspond to BATTLE_ANIM_GFX_* constants + table_width 4, AnimObjGFX + anim_obj_gfx 0, AnimObj00GFX + anim_obj_gfx 21, AnimObjHitGFX + anim_obj_gfx 6, AnimObjCutGFX + anim_obj_gfx 6, AnimObjFireGFX + anim_obj_gfx 20, AnimObjWaterGFX + anim_obj_gfx 26, AnimObjLightningGFX + anim_obj_gfx 18, AnimObjPlantGFX + anim_obj_gfx 12, AnimObjSmokeGFX + anim_obj_gfx 9, AnimObjExplosionGFX + anim_obj_gfx 17, AnimObjRocksGFX + anim_obj_gfx 6, AnimObjIceGFX + anim_obj_gfx 10, AnimObjPokeBallGFX + anim_obj_gfx 9, AnimObjPoisonGFX + anim_obj_gfx 13, AnimObjBubbleGFX + anim_obj_gfx 16, AnimObjNoiseGFX + anim_obj_gfx 2, AnimObjPowderGFX + anim_obj_gfx 11, AnimObjBeamGFX + anim_obj_gfx 9, AnimObjSpeedGFX + anim_obj_gfx 9, AnimObjChargeGFX + anim_obj_gfx 19, AnimObjWindGFX + anim_obj_gfx 10, AnimObjWhipGFX + anim_obj_gfx 12, AnimObjEggGFX + anim_obj_gfx 18, AnimObjRopeGFX + anim_obj_gfx 13, AnimObjPsychicGFX + anim_obj_gfx 10, AnimObjReflectGFX + anim_obj_gfx 27, AnimObjStatusGFX + anim_obj_gfx 12, AnimObjSandGFX + anim_obj_gfx 14, AnimObjWebGFX + anim_obj_gfx 16, AnimObjHazeGFX + anim_obj_gfx 7, AnimObjHornGFX + anim_obj_gfx 8, AnimObjFlowerGFX + anim_obj_gfx 40, AnimObjMiscGFX + anim_obj_gfx 36, AnimObjSkyAttackGFX + anim_obj_gfx 16, AnimObjGlobeGFX + anim_obj_gfx 48, AnimObjShapesGFX + anim_obj_gfx 18, AnimObjObjectsGFX + anim_obj_gfx 38, AnimObjShineGFX + anim_obj_gfx 35, AnimObjAngelsGFX + anim_obj_gfx 0, NULL + anim_obj_gfx 0, NULL + assert_table_length NUM_BATTLE_ANIM_GFX + 1 diff --git a/data/battle_anims/objects.inc b/data/battle_anims/objects.inc new file mode 100644 index 0000000..50ac890 --- /dev/null +++ b/data/battle_anims/objects.inc @@ -0,0 +1,383 @@ +DEF ABSOLUTE_X EQU $00 +DEF RELATIVE_X EQU $01 + +MACRO battleanimobj + db \1 ; flags + ; bit 7: priority + ; bit 6: y flip (for enemy) + ; bit 5: x flip (for enemy) + ; bit 0: enable enemy animation coord fixing (x = $b4 - x; see below for y) + db \2 ; enemy animation y fix param + ; if $FF: y = y + 5 tiles + ; else: y = -y - (1 tile) * (is_softboiled_animation) + db \3 ; video sequence + db \4 ; callback + db \5 ; tile offset +ENDM + +BattleAnimObjects: +; entries correspond to BATTLE_ANIM_OBJ_* constants + table_width BATTLEANIMOBJ_LENGTH, BattleAnimObjects +; BATTLE_ANIM_OBJ_HIT_BIG_YFIX + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_HIT_BIG, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_HIT_YFIX + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_HIT, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_HIT_SMALL_YFIX + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_HIT_SMALL, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_HIT_BIG + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_HIT_BIG, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_HIT + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_HIT, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_HIT_SMALL + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_HIT_SMALL, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_PUNCH + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_PUNCH, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_KICK + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_KICK, BATTLE_ANIM_FUNC_KICK, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_PALM + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_PALM, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_FANG + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_FANG, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_PUNCH_SHAKE + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_PUNCH_SHAKE, BATTLE_ANIM_FUNC_SHAKE, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_EMBER + battleanimobj RELATIVE_X, $aa, BATTLE_ANIM_FRAMESET_EMBER, BATTLE_ANIM_FUNC_EMBER, BATTLE_ANIM_GFX_FIRE +; BATTLE_ANIM_OBJ_DRAGON_RAGE + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_DRAGON_RAGE, BATTLE_ANIM_FUNC_WAVE_TO_TARGET, BATTLE_ANIM_GFX_FIRE +; BATTLE_ANIM_OBJ_FLAMETHROWER + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_FLAMETHROWER, BATTLE_ANIM_FUNC_MOVE_IN_CIRCLE, BATTLE_ANIM_GFX_FIRE +; BATTLE_ANIM_OBJ_FIRE_SPIN + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_EMBER, BATTLE_ANIM_FUNC_USER_TO_TARGET_SPIN, BATTLE_ANIM_GFX_FIRE +; BATTLE_ANIM_OBJ_FIRE_BLAST + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_FLAMETHROWER, BATTLE_ANIM_FUNC_FIRE_BLAST, BATTLE_ANIM_GFX_FIRE +; BATTLE_ANIM_OBJ_BURNED + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_BURNED, BATTLE_ANIM_FUNC_MOVE_IN_CIRCLE, BATTLE_ANIM_GFX_FIRE +; BATTLE_ANIM_OBJ_BLIZZARD + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_BLIZZARD, BATTLE_ANIM_FUNC_USER_TO_TARGET_SPIN, BATTLE_ANIM_GFX_ICE +; BATTLE_ANIM_OBJ_ICE + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_ICE, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_ICE +; BATTLE_ANIM_OBJ_ICE_BEAM + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_ICE_BEAM, BATTLE_ANIM_FUNC_USER_TO_TARGET, BATTLE_ANIM_GFX_ICE +; BATTLE_ANIM_OBJ_RAZOR_LEAF + battleanimobj RELATIVE_X | X_FLIP, $78, BATTLE_ANIM_FRAMESET_RAZOR_LEAF_1, BATTLE_ANIM_FUNC_RAZOR_LEAF, BATTLE_ANIM_GFX_PLANT +; BATTLE_ANIM_OBJ_POKE_BALL + battleanimobj ABSOLUTE_X, $00, BATTLE_ANIM_FRAMESET_POKE_BALL_1, BATTLE_ANIM_FUNC_POKEBALL, BATTLE_ANIM_GFX_POKE_BALL +; BATTLE_ANIM_OBJ_POKE_BALL_BLOCKED + battleanimobj ABSOLUTE_X, $00, BATTLE_ANIM_FRAMESET_POKE_BALL_1, BATTLE_ANIM_FUNC_POKEBALL_BLOCKED, BATTLE_ANIM_GFX_POKE_BALL +; BATTLE_ANIM_OBJ_EXPLOSION1 + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_EXPLOSION, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_EXPLOSION +; BATTLE_ANIM_OBJ_EXPLOSION2 + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_EXPLOSION, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_EXPLOSION +; BATTLE_ANIM_OBJ_ACID + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_ACID, BATTLE_ANIM_FUNC_THROW_TO_TARGET_DISAPPEAR, BATTLE_ANIM_GFX_POISON +; BATTLE_ANIM_OBJ_SLUDGE + battleanimobj RELATIVE_X, $b4, BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE, BATTLE_ANIM_FUNC_SLUDGE, BATTLE_ANIM_GFX_POISON +; BATTLE_ANIM_OBJ_BETA_BALL_POOF + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_BALL_POOF, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_SMOKE +; BATTLE_ANIM_OBJ_BALL_POOF + battleanimobj RELATIVE_X, $a0, BATTLE_ANIM_FRAMESET_BALL_POOF, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_SMOKE +; BATTLE_ANIM_OBJ_BIG_ROCK + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_BIG_ROCK, BATTLE_ANIM_FUNC_DROP, BATTLE_ANIM_GFX_ROCKS +; BATTLE_ANIM_OBJ_SMALL_ROCK + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_SMALL_ROCK, BATTLE_ANIM_FUNC_DROP, BATTLE_ANIM_GFX_ROCKS +; BATTLE_ANIM_OBJ_STRENGTH + battleanimobj RELATIVE_X, $b0, BATTLE_ANIM_FRAMESET_STRENGTH, BATTLE_ANIM_FUNC_STRENGTH_SEISMIC_TOSS, BATTLE_ANIM_GFX_ROCKS +; BATTLE_ANIM_OBJ_SEISMIC_TOSS + battleanimobj RELATIVE_X, $b0, BATTLE_ANIM_FRAMESET_SEISMIC_TOSS, BATTLE_ANIM_FUNC_STRENGTH_SEISMIC_TOSS, BATTLE_ANIM_GFX_GLOBE +; BATTLE_ANIM_OBJ_BUBBLE + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_SMALL_BUBBLE, BATTLE_ANIM_FUNC_BUBBLE, BATTLE_ANIM_GFX_BUBBLE +; BATTLE_ANIM_OBJ_SURF + battleanimobj ABSOLUTE_X, $00, BATTLE_ANIM_FRAMESET_SURF, BATTLE_ANIM_FUNC_SURF, BATTLE_ANIM_GFX_BUBBLE +; BATTLE_ANIM_OBJ_SING + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1, BATTLE_ANIM_FUNC_SING, BATTLE_ANIM_GFX_NOISE +; BATTLE_ANIM_OBJ_WATER_GUN + battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $80, BATTLE_ANIM_FRAMESET_WATER_GUN_1, BATTLE_ANIM_FUNC_WATER_GUN, BATTLE_ANIM_GFX_WATER +; BATTLE_ANIM_OBJ_HYDRO_PUMP + battleanimobj RELATIVE_X, $b4, BATTLE_ANIM_FRAMESET_HYDRO_PUMP, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_WATER +; BATTLE_ANIM_OBJ_POWDER + battleanimobj RELATIVE_X, $40, BATTLE_ANIM_FRAMESET_POWDER, BATTLE_ANIM_FUNC_POWDER, BATTLE_ANIM_GFX_POWDER +; BATTLE_ANIM_OBJ_BEAM + battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLE_ANIM_FRAMESET_BEAM, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_BEAM +; BATTLE_ANIM_OBJ_BEAM_TIP + battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLE_ANIM_FRAMESET_BEAM_TIP, BATTLE_ANIM_FUNC_SHAKE, BATTLE_ANIM_GFX_BEAM +; BATTLE_ANIM_OBJ_ICE_BUILDUP + battleanimobj RELATIVE_X, $b8, BATTLE_ANIM_FRAMESET_ICE_BUILDUP, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_ICE +; BATTLE_ANIM_OBJ_FROZEN + battleanimobj RELATIVE_X, $b8, BATTLE_ANIM_FRAMESET_FROZEN, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_ICE +; BATTLE_ANIM_OBJ_MASTER_BALL_SPARKLE + battleanimobj RELATIVE_X, $b8, BATTLE_ANIM_FRAMESET_CIRCLING_SPARKLE, BATTLE_ANIM_FUNC_RECOVER, BATTLE_ANIM_GFX_SPEED +; BATTLE_ANIM_OBJ_RECOVER + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_SMALL_BUBBLE, BATTLE_ANIM_FUNC_RECOVER, BATTLE_ANIM_GFX_BUBBLE +; BATTLE_ANIM_OBJ_THUNDER_CENTER + battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLE_ANIM_FRAMESET_THUNDER_CENTER, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_LIGHTNING +; BATTLE_ANIM_OBJ_THUNDER_LEFT + battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLE_ANIM_FRAMESET_THUNDER_LEFT, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_LIGHTNING +; BATTLE_ANIM_OBJ_THUNDER_RIGHT + battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLE_ANIM_FRAMESET_THUNDER_RIGHT, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_LIGHTNING +; BATTLE_ANIM_OBJ_THUNDER_WAVE + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_THUNDER_WAVE_DISABLE, BATTLE_ANIM_FUNC_THUNDER_WAVE, BATTLE_ANIM_GFX_LIGHTNING +; BATTLE_ANIM_OBJ_THUNDERBOLT_SPARKS + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_THUNDERBOLT_SPARKS, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_LIGHTNING +; BATTLE_ANIM_OBJ_THUNDERBOLT_CORE + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_THUNDERBOLT_CORE, BATTLE_ANIM_FUNC_MOVE_IN_CIRCLE, BATTLE_ANIM_GFX_EXPLOSION +; BATTLE_ANIM_OBJ_THUNDERSHOCK_SPARKS + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_THUNDERSHOCK_SPARKS, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_LIGHTNING +; BATTLE_ANIM_OBJ_THUNDERSHOCK_CORE + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_THUNDERSHOCK_CORE, BATTLE_ANIM_FUNC_MOVE_IN_CIRCLE, BATTLE_ANIM_GFX_EXPLOSION +; BATTLE_ANIM_OBJ_CLAMP + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_CLAMP, BATTLE_ANIM_FUNC_CLAMP_ENCORE, BATTLE_ANIM_GFX_CUT +; BATTLE_ANIM_OBJ_BITE + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_BITE_1, BATTLE_ANIM_FUNC_BITE, BATTLE_ANIM_GFX_CUT +; BATTLE_ANIM_OBJ_CUT_DOWN_LEFT + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_CUT_DOWN_LEFT, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_CUT +; BATTLE_ANIM_OBJ_CUT_DOWN_RIGHT + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_CUT_DOWN_RIGHT, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_CUT +; BATTLE_ANIM_OBJ_CUT_UP_RIGHT + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_CUT_UP_RIGHT, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_CUT +; BATTLE_ANIM_OBJ_CUT_LONG_DOWN_LEFT + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_CUT_LONG_DOWN_LEFT, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_CUT +; BATTLE_ANIM_OBJ_CUT_LONG_DOWN_RIGHT + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_CUT_LONG_DOWN_RIGHT, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_CUT +; BATTLE_ANIM_OBJ_SOLAR_BEAM_CHARGE + battleanimobj RELATIVE_X, $88, BATTLE_ANIM_FRAMESET_CHARGE_ORB_1, BATTLE_ANIM_FUNC_SOLAR_BEAM, BATTLE_ANIM_GFX_CHARGE +; BATTLE_ANIM_OBJ_ABSORB_CENTER + battleanimobj RELATIVE_X, $88, BATTLE_ANIM_FRAMESET_ABSORB_CENTER, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_CHARGE +; BATTLE_ANIM_OBJ_GUST + battleanimobj RELATIVE_X | X_FLIP, $b8, BATTLE_ANIM_FRAMESET_GUST, BATTLE_ANIM_FUNC_GUST, BATTLE_ANIM_GFX_WIND +; BATTLE_ANIM_OBJ_VINE_WHIP1 + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_VINE_WHIP_1, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_WHIP +; BATTLE_ANIM_OBJ_VINE_WHIP2 + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_VINE_WHIP_2, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_WHIP +; BATTLE_ANIM_OBJ_RAZOR_WIND1 + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_RAZOR_WIND_1, BATTLE_ANIM_FUNC_RAZOR_WIND, BATTLE_ANIM_GFX_WHIP +; BATTLE_ANIM_OBJ_RAZOR_WIND2 + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_RAZOR_WIND_2, BATTLE_ANIM_FUNC_RAZOR_WIND, BATTLE_ANIM_GFX_WHIP +; BATTLE_ANIM_OBJ_SONICBOOM + battleanimobj RELATIVE_X | X_FLIP, $98, BATTLE_ANIM_FRAMESET_SONICBOOM, BATTLE_ANIM_FUNC_USER_TO_TARGET, BATTLE_ANIM_GFX_WHIP +; BATTLE_ANIM_OBJ_WARP + battleanimobj RELATIVE_X | X_FLIP, $80, BATTLE_ANIM_FRAMESET_WARP, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_SPEED +; BATTLE_ANIM_OBJ_ABSORB + battleanimobj RELATIVE_X, $88, BATTLE_ANIM_FRAMESET_CHARGE_ORB_2, BATTLE_ANIM_FUNC_ABSORB, BATTLE_ANIM_GFX_CHARGE +; BATTLE_ANIM_OBJ_EGG + battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLE_ANIM_FRAMESET_EGG, BATTLE_ANIM_FUNC_EGG, BATTLE_ANIM_GFX_EGG +; BATTLE_ANIM_OBJ_FOCUS + battleanimobj RELATIVE_X, $b0, BATTLE_ANIM_FRAMESET_FOCUS, BATTLE_ANIM_FUNC_MOVE_UP, BATTLE_ANIM_GFX_SPEED +; BATTLE_ANIM_OBJ_BIND1 + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_BIND_1, BATTLE_ANIM_FUNC_WRAP, BATTLE_ANIM_GFX_ROPE +; BATTLE_ANIM_OBJ_BIND2 + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_BIND_3, BATTLE_ANIM_FUNC_WRAP, BATTLE_ANIM_GFX_ROPE +; BATTLE_ANIM_OBJ_LEECH_SEED + battleanimobj RELATIVE_X | X_FLIP, $68, BATTLE_ANIM_FRAMESET_LEECH_SEED_1, BATTLE_ANIM_FUNC_LEECH_SEED, BATTLE_ANIM_GFX_PLANT +; BATTLE_ANIM_OBJ_SOUND + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_SOUND_1, BATTLE_ANIM_FUNC_SOUND, BATTLE_ANIM_GFX_NOISE +; BATTLE_ANIM_OBJ_WAVE + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_WAVE, BATTLE_ANIM_FUNC_USER_TO_TARGET_DISAPPEAR, BATTLE_ANIM_GFX_PSYCHIC +; BATTLE_ANIM_OBJ_CONFUSE_RAY + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_CONFUSE_RAY_1, BATTLE_ANIM_FUNC_CONFUSE_RAY, BATTLE_ANIM_GFX_SPEED +; BATTLE_ANIM_OBJ_LEER + battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $88, BATTLE_ANIM_FRAMESET_LEER, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_BEAM +; BATTLE_ANIM_OBJ_LEER_TIP + battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $88, BATTLE_ANIM_FRAMESET_BEAM_TIP, BATTLE_ANIM_FUNC_SHAKE, BATTLE_ANIM_GFX_BEAM +; BATTLE_ANIM_OBJ_SCREEN + battleanimobj RELATIVE_X | X_FLIP, $88, BATTLE_ANIM_FRAMESET_REFLECT, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_REFLECT +; BATTLE_ANIM_OBJ_HARDEN + battleanimobj RELATIVE_X | X_FLIP, $80, BATTLE_ANIM_FRAMESET_REFLECT, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_REFLECT +; BATTLE_ANIM_OBJ_CHICK + battleanimobj RELATIVE_X | X_FLIP, $50, BATTLE_ANIM_FRAMESET_CHICK_1, BATTLE_ANIM_FUNC_DIZZY, BATTLE_ANIM_GFX_STATUS +; BATTLE_ANIM_OBJ_AMNESIA + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_AMNESIA_1, BATTLE_ANIM_FUNC_AMNESIA, BATTLE_ANIM_GFX_STATUS +; BATTLE_ANIM_OBJ_ASLEEP + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_ASLEEP, BATTLE_ANIM_FUNC_FLOAT_UP, BATTLE_ANIM_GFX_STATUS +; BATTLE_ANIM_OBJ_SKULL_CROSSBONE + battleanimobj RELATIVE_X, $50, BATTLE_ANIM_FRAMESET_SKULL_CROSSBONE, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_POISON +; BATTLE_ANIM_OBJ_DIG_SAND + battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLE_ANIM_FRAMESET_DIG_SAND, BATTLE_ANIM_FUNC_DIG, BATTLE_ANIM_GFX_SAND +; BATTLE_ANIM_OBJ_DIG_PILE + battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLE_ANIM_FRAMESET_DIG_PILE, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_SAND +; BATTLE_ANIM_OBJ_SAND + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_SAND, BATTLE_ANIM_FUNC_USER_TO_TARGET, BATTLE_ANIM_GFX_SAND +; BATTLE_ANIM_OBJ_PARALYZED + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_PARALYZED, BATTLE_ANIM_FUNC_PARALYZED, BATTLE_ANIM_GFX_STATUS +; BATTLE_ANIM_OBJ_STRING_SHOT + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_STRING_SHOT_1, BATTLE_ANIM_FUNC_STRING, BATTLE_ANIM_GFX_WEB +; BATTLE_ANIM_OBJ_HAZE + battleanimobj ABSOLUTE_X, $00, BATTLE_ANIM_FRAMESET_HAZE, BATTLE_ANIM_FUNC_SPIRAL_DESCENT, BATTLE_ANIM_GFX_HAZE +; BATTLE_ANIM_OBJ_MIST + battleanimobj RELATIVE_X | X_FLIP, $48, BATTLE_ANIM_FRAMESET_MIST, BATTLE_ANIM_FUNC_SPIRAL_DESCENT, BATTLE_ANIM_GFX_HAZE +; BATTLE_ANIM_OBJ_SMOG + battleanimobj RELATIVE_X | X_FLIP, $48, BATTLE_ANIM_FRAMESET_HAZE, BATTLE_ANIM_FUNC_SPIRAL_DESCENT, BATTLE_ANIM_GFX_HAZE +; BATTLE_ANIM_OBJ_POISON_GAS + battleanimobj RELATIVE_X | X_FLIP, $78, BATTLE_ANIM_FRAMESET_HAZE, BATTLE_ANIM_FUNC_POISON_GAS, BATTLE_ANIM_GFX_HAZE +; BATTLE_ANIM_OBJ_HORN + battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLE_ANIM_FRAMESET_HORN, BATTLE_ANIM_FUNC_HORN, BATTLE_ANIM_GFX_HORN +; BATTLE_ANIM_OBJ_NEEDLE + battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLE_ANIM_FRAMESET_NEEDLE, BATTLE_ANIM_FUNC_NEEDLE, BATTLE_ANIM_GFX_HORN +; BATTLE_ANIM_OBJ_PETAL_DANCE + battleanimobj RELATIVE_X, $48, BATTLE_ANIM_FRAMESET_FLOWER, BATTLE_ANIM_FUNC_PETAL_DANCE, BATTLE_ANIM_GFX_FLOWER +; BATTLE_ANIM_OBJ_SLUDGE_BOMB + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_BARRAGE_BALL, BATTLE_ANIM_FUNC_THROW_TO_TARGET_DISAPPEAR, BATTLE_ANIM_GFX_EGG +; BATTLE_ANIM_OBJ_PAY_DAY + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_PAY_DAY, BATTLE_ANIM_FUNC_THIEF_PAYDAY, BATTLE_ANIM_GFX_STATUS +; BATTLE_ANIM_OBJ_COIN_HURL + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_PAY_DAY, BATTLE_ANIM_FUNC_USER_TO_TARGET_DISAPPEAR, BATTLE_ANIM_GFX_STATUS +; BATTLE_ANIM_OBJ_MIMIC + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_CIRCLING_SPARKLE, BATTLE_ANIM_FUNC_ABSORB_CIRCLE, BATTLE_ANIM_GFX_SPEED +; BATTLE_ANIM_OBJ_ATTRACT + battleanimobj RELATIVE_X, $78, BATTLE_ANIM_FRAMESET_HEART, BATTLE_ANIM_FUNC_POISON_GAS, BATTLE_ANIM_GFX_OBJECTS +; BATTLE_ANIM_OBJ_BONEMERANG + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_SPINNING_BONE, BATTLE_ANIM_FUNC_BONEMERANG, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_BONE_CLUB + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_SPINNING_BONE, BATTLE_ANIM_FUNC_USER_TO_TARGET_DISAPPEAR, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_BONE_RUSH + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_SPINNING_BONE, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_SWIFT + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_STAR, BATTLE_ANIM_FUNC_USER_TO_TARGET_SPIN, BATTLE_ANIM_GFX_OBJECTS +; BATTLE_ANIM_OBJ_KINESIS + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_SPOON, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_FLASH + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_SPARKLE, BATTLE_ANIM_FUNC_SHINY, BATTLE_ANIM_GFX_SPEED +; BATTLE_ANIM_OBJ_SHINY + battleanimobj RELATIVE_X, $88, BATTLE_ANIM_FRAMESET_SPARKLE, BATTLE_ANIM_FUNC_SHINY, BATTLE_ANIM_GFX_SPEED +; BATTLE_ANIM_OBJ_SKY_ATTACK + battleanimobj RELATIVE_X | X_FLIP, $88, BATTLE_ANIM_FRAMESET_SKY_ATTACK, BATTLE_ANIM_FUNC_SKY_ATTACK, BATTLE_ANIM_GFX_SKY_ATTACK +; BATTLE_ANIM_OBJ_LICK + battleanimobj RELATIVE_X | X_FLIP, $98, BATTLE_ANIM_FRAMESET_LICK, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_WATER +; BATTLE_ANIM_OBJ_WITHDRAW + battleanimobj RELATIVE_X | X_FLIP, $80, BATTLE_ANIM_FRAMESET_WITHDRAW_SHELL, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_REFLECT +; BATTLE_ANIM_OBJ_DRAIN + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_SMALL_BUBBLE, BATTLE_ANIM_FUNC_ABSORB_CIRCLE, BATTLE_ANIM_GFX_BUBBLE +; BATTLE_ANIM_OBJ_GROWTH + battleanimobj RELATIVE_X, $b0, BATTLE_ANIM_FRAMESET_SHRINKING_CHARGE_ORB, BATTLE_ANIM_FUNC_GROWTH_SWORDS_DANCE, BATTLE_ANIM_GFX_CHARGE +; BATTLE_ANIM_OBJ_CONVERSION + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_CONVERSION, BATTLE_ANIM_FUNC_ABSORB_CIRCLE, BATTLE_ANIM_GFX_EXPLOSION +; BATTLE_ANIM_OBJ_SMOKE + battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLE_ANIM_FRAMESET_HAZE, BATTLE_ANIM_FUNC_SMOKE_FLAME_WHEEL, BATTLE_ANIM_GFX_HAZE +; BATTLE_ANIM_OBJ_SMOKESCREEN + battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLE_ANIM_FRAMESET_BARRAGE_BALL, BATTLE_ANIM_FUNC_PRESENT_SMOKESCREEN, BATTLE_ANIM_GFX_EGG +; BATTLE_ANIM_OBJ_SWORDS_DANCE + battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLE_ANIM_FRAMESET_SWORD, BATTLE_ANIM_FUNC_GROWTH_SWORDS_DANCE, BATTLE_ANIM_GFX_WHIP +; BATTLE_ANIM_OBJ_SPEED_LINE + battleanimobj RELATIVE_X, $88, BATTLE_ANIM_FRAMESET_SPEED_LINE_1, BATTLE_ANIM_FUNC_SPEED_LINE, BATTLE_ANIM_GFX_SPEED +; BATTLE_ANIM_OBJ_SHARPEN + battleanimobj RELATIVE_X, $88, BATTLE_ANIM_FRAMESET_SHARPEN, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_SHAPES +; BATTLE_ANIM_OBJ_DEFENSE_CURL + battleanimobj RELATIVE_X, $88, BATTLE_ANIM_FRAMESET_DEFENSE_CURL, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_SHAPES +; BATTLE_ANIM_OBJ_METRONOME_HAND + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_METRONOME_HAND, BATTLE_ANIM_FUNC_METRONOME_HAND, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_METRONOME_SPARKLE + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_CIRCLING_SPARKLE, BATTLE_ANIM_FUNC_METRONOME_SPARKLE_SKETCH, BATTLE_ANIM_GFX_SPEED +; BATTLE_ANIM_OBJ_DISABLE + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_THUNDER_WAVE_DISABLE, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_LIGHTNING +; BATTLE_ANIM_OBJ_AGILITY + battleanimobj RELATIVE_X | X_FLIP | PRIORITY, $88, BATTLE_ANIM_FRAMESET_AGILITY, BATTLE_ANIM_FUNC_AGILITY, BATTLE_ANIM_GFX_WIND +; BATTLE_ANIM_OBJ_HEART + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_HEART, BATTLE_ANIM_FUNC_FLOAT_UP, BATTLE_ANIM_GFX_OBJECTS +; BATTLE_ANIM_OBJ_FLAME_WHEEL + battleanimobj RELATIVE_X, $98, BATTLE_ANIM_FRAMESET_EMBER, BATTLE_ANIM_FUNC_SMOKE_FLAME_WHEEL, BATTLE_ANIM_GFX_FIRE +; BATTLE_ANIM_OBJ_SACRED_FIRE + battleanimobj RELATIVE_X, $a8, BATTLE_ANIM_FRAMESET_FLAMETHROWER, BATTLE_ANIM_FUNC_SACRED_FIRE, BATTLE_ANIM_GFX_FIRE +; BATTLE_ANIM_OBJ_COTTON_SPORE + battleanimobj RELATIVE_X | X_FLIP, $68, BATTLE_ANIM_FRAMESET_COTTON, BATTLE_ANIM_FUNC_SPIRAL_DESCENT, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_MILK_DRINK + battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLE_ANIM_FRAMESET_MILK_BOTTLE, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_ANGER + battleanimobj RELATIVE_X | X_FLIP, $80, BATTLE_ANIM_FRAMESET_ANGER_VEIN, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_BELL_CHIME + battleanimobj RELATIVE_X | X_FLIP, $50, BATTLE_ANIM_FRAMESET_BELL_CHIME, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_BELL_CHIME_NOTE + battleanimobj RELATIVE_X | X_FLIP, $40, BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1, BATTLE_ANIM_FUNC_BELL_CHIME_NOTES, BATTLE_ANIM_GFX_NOISE +; BATTLE_ANIM_OBJ_BATON_PASS + battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLE_ANIM_FRAMESET_BATON_PASS, BATTLE_ANIM_FUNC_BATON_PASS, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_LOCK_ON + battleanimobj RELATIVE_X | X_FLIP, $88, BATTLE_ANIM_FRAMESET_LOCK_ON_1, BATTLE_ANIM_FUNC_LOCK_ON_MIND_READER, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_MIND_READER + battleanimobj RELATIVE_X | X_FLIP, $88, BATTLE_ANIM_FRAMESET_MIND_READER_1, BATTLE_ANIM_FUNC_LOCK_ON_MIND_READER, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_SAFEGUARD + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_SAFEGUARD, BATTLE_ANIM_FUNC_SAFEGUARD_PROTECT, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_MEGAPHONE + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_MEGAPHONE, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_PROTECT + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_STAR, BATTLE_ANIM_FUNC_SAFEGUARD_PROTECT, BATTLE_ANIM_GFX_OBJECTS +; BATTLE_ANIM_OBJ_THIEF + battleanimobj RELATIVE_X, $ff, BATTLE_ANIM_FRAMESET_ITEM_BAG, BATTLE_ANIM_FUNC_THIEF_PAYDAY, BATTLE_ANIM_GFX_STATUS +; BATTLE_ANIM_OBJ_OCTAZOOKA + battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLE_ANIM_FRAMESET_BARRAGE_BALL, BATTLE_ANIM_FUNC_USER_TO_TARGET_DISAPPEAR, BATTLE_ANIM_GFX_EGG +; BATTLE_ANIM_OBJ_PRESENT + battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLE_ANIM_FRAMESET_ITEM_BAG, BATTLE_ANIM_FUNC_PRESENT_SMOKESCREEN, BATTLE_ANIM_GFX_STATUS +; BATTLE_ANIM_OBJ_SPIKES + battleanimobj RELATIVE_X | X_FLIP, $70, BATTLE_ANIM_FRAMESET_SPIKE, BATTLE_ANIM_FUNC_SPIKES, BATTLE_ANIM_GFX_MISC +; BATTLE_ANIM_OBJ_POWDER_SNOW + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_POWDER_SNOW, BATTLE_ANIM_FUNC_USER_TO_TARGET_SPIN, BATTLE_ANIM_GFX_ICE +; BATTLE_ANIM_OBJ_DRAGONBREATH + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_BURNED, BATTLE_ANIM_FUNC_USER_TO_TARGET_DISAPPEAR, BATTLE_ANIM_GFX_FIRE +; BATTLE_ANIM_OBJ_CONVERSION2 + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_CONVERSION, BATTLE_ANIM_FUNC_CONVERSION2, BATTLE_ANIM_GFX_EXPLOSION +; BATTLE_ANIM_OBJ_SPIDER_WEB + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_SPIDER_WEB, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_WEB +; BATTLE_ANIM_OBJ_CAKE_TEMPT + battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLE_ANIM_FRAMESET_TEMPT_CAKE, BATTLE_ANIM_FUNC_PRESENT_SMOKESCREEN, BATTLE_ANIM_GFX_OBJECTS +; BATTLE_ANIM_OBJ_NIGHTMARE + battleanimobj RELATIVE_X | X_FLIP, $80, BATTLE_ANIM_FRAMESET_IMP, BATTLE_ANIM_FUNC_DIZZY, BATTLE_ANIM_GFX_ANGELS +; BATTLE_ANIM_OBJ_IN_NIGHTMARE + battleanimobj RELATIVE_X | X_FLIP, $80, BATTLE_ANIM_FRAMESET_IMP_FLIPPED, BATTLE_ANIM_FUNC_FLOAT_UP, BATTLE_ANIM_GFX_ANGELS +; BATTLE_ANIM_OBJ_LOVELY_KISS + battleanimobj RELATIVE_X | X_FLIP, $80, BATTLE_ANIM_FRAMESET_IMP, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_ANGELS +; BATTLE_ANIM_OBJ_SWEET_KISS + battleanimobj RELATIVE_X | X_FLIP, $80, BATTLE_ANIM_FRAMESET_CHERUB, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_ANGELS +; BATTLE_ANIM_OBJ_SKETCH + battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $80, BATTLE_ANIM_FRAMESET_PENCIL, BATTLE_ANIM_FUNC_METRONOME_SPARKLE_SKETCH, BATTLE_ANIM_GFX_OBJECTS +; BATTLE_ANIM_OBJ_ENCORE_HAND + battleanimobj RELATIVE_X | X_FLIP, $80, BATTLE_ANIM_FRAMESET_ENCORE_HAND, BATTLE_ANIM_FUNC_CLAMP_ENCORE, BATTLE_ANIM_GFX_OBJECTS +; BATTLE_ANIM_OBJ_ENCORE_STAR + battleanimobj RELATIVE_X | X_FLIP, $70, BATTLE_ANIM_FRAMESET_STAR, BATTLE_ANIM_FUNC_ENCORE_BELLY_DRUM, BATTLE_ANIM_GFX_OBJECTS +; BATTLE_ANIM_OBJ_DESTINY_BOND + battleanimobj RELATIVE_X | X_FLIP, $c0, BATTLE_ANIM_FRAMESET_DESTINY_BOND, BATTLE_ANIM_FUNC_USER_TO_TARGET, BATTLE_ANIM_GFX_ANGELS +; BATTLE_ANIM_OBJ_MORNING_SUN + battleanimobj RELATIVE_X | X_FLIP, $40, BATTLE_ANIM_FRAMESET_MORNING_SUN, BATTLE_ANIM_FUNC_SWAGGER_MORNING_SUN, BATTLE_ANIM_GFX_SHINE +; BATTLE_ANIM_OBJ_GLIMMER + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_GLIMMER, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_SHINE +; BATTLE_ANIM_OBJ_MOONLIGHT + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_MOONLIGHT, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_SHINE +; BATTLE_ANIM_OBJ_HIDDEN_POWER + battleanimobj RELATIVE_X, $88, BATTLE_ANIM_FRAMESET_CHARGE_ORB_1, BATTLE_ANIM_FUNC_HIDDEN_POWER, BATTLE_ANIM_GFX_CHARGE +; BATTLE_ANIM_OBJ_CROSS_CUTTER1 + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_CROSS_CUTTER_1, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_CUT +; BATTLE_ANIM_OBJ_CROSS_CUTTER2 + battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLE_ANIM_FRAMESET_CROSS_CUTTER_2, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_CUT +; BATTLE_ANIM_OBJ_SANDSTORM + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_POWDER, BATTLE_ANIM_FUNC_USER_TO_TARGET_SPIN, BATTLE_ANIM_GFX_POWDER +; BATTLE_ANIM_OBJ_ZAP_CANNON + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_ZAP_CANNON, BATTLE_ANIM_FUNC_USER_TO_TARGET_DISAPPEAR, BATTLE_ANIM_GFX_LIGHTNING +; BATTLE_ANIM_OBJ_SPITE + battleanimobj RELATIVE_X | X_FLIP, $40, BATTLE_ANIM_FRAMESET_IMP, BATTLE_ANIM_FUNC_POWDER, BATTLE_ANIM_GFX_ANGELS +; BATTLE_ANIM_OBJ_NAIL_DOWN + battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLE_ANIM_FRAMESET_NAIL_DOWN, BATTLE_ANIM_FUNC_NAIL_DOWN, BATTLE_ANIM_GFX_OBJECTS +; BATTLE_ANIM_OBJ_PERISH_SONG + battleanimobj ABSOLUTE_X, $00, BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1, BATTLE_ANIM_FUNC_PERISH_SONG, BATTLE_ANIM_GFX_NOISE +; BATTLE_ANIM_OBJ_FORESIGHT + battleanimobj RELATIVE_X, $80, BATTLE_ANIM_FRAMESET_FORESIGHT_SHINE, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_SHINE +; BATTLE_ANIM_OBJ_RAPID_SPIN + battleanimobj RELATIVE_X | X_FLIP, $b8, BATTLE_ANIM_FRAMESET_RAPID_SPIN, BATTLE_ANIM_FUNC_RAPID_SPIN, BATTLE_ANIM_GFX_WIND +; BATTLE_ANIM_OBJ_SWAGGER + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_SWAGGER, BATTLE_ANIM_FUNC_SWAGGER_MORNING_SUN, BATTLE_ANIM_GFX_WIND +; BATTLE_ANIM_OBJ_BELLY_DRUM_HAND + battleanimobj RELATIVE_X, $a8, BATTLE_ANIM_FRAMESET_PALM, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE + battleanimobj RELATIVE_X, $90, BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1, BATTLE_ANIM_FUNC_ENCORE_BELLY_DRUM, BATTLE_ANIM_GFX_NOISE +; BATTLE_ANIM_OBJ_STALKER + battleanimobj RELATIVE_X, $88, BATTLE_ANIM_FRAMESET_STALKER, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_PSYCHIC +; BATTLE_ANIM_OBJ_BETA_PURSUIT + battleanimobj RELATIVE_X, $a8, BATTLE_ANIM_FRAMESET_UPSIDE_DOWN_PUNCH, BATTLE_ANIM_FUNC_BETA_PURSUIT, BATTLE_ANIM_GFX_HIT +; BATTLE_ANIM_OBJ_SHOOTING_SPARKLE + battleanimobj RELATIVE_X | X_FLIP, $90, BATTLE_ANIM_FRAMESET_GROWING_SPARKLE, BATTLE_ANIM_FUNC_USER_TO_TARGET, BATTLE_ANIM_GFX_SPEED +; BATTLE_ANIM_OBJ_RAIN + battleanimobj RELATIVE_X | X_FLIP, $00, BATTLE_ANIM_FRAMESET_RAIN_1, BATTLE_ANIM_FUNC_RAIN, BATTLE_ANIM_GFX_WATER +; BATTLE_ANIM_OBJ_ENEMYFEET_1ROW + battleanimobj ABSOLUTE_X, $00, BATTLE_ANIM_FRAMESET_ENEMYFEET_1ROW, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_PLAYERHEAD +; BATTLE_ANIM_OBJ_PLAYERHEAD_1ROW + battleanimobj ABSOLUTE_X, $00, BATTLE_ANIM_FRAMESET_PLAYERHEAD_1ROW, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_ENEMYFEET +; BATTLE_ANIM_OBJ_ENEMYFEET_2ROW + battleanimobj ABSOLUTE_X, $00, BATTLE_ANIM_FRAMESET_ENEMYFEET_2ROW, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_PLAYERHEAD +; BATTLE_ANIM_OBJ_PLAYERHEAD_2ROW + battleanimobj ABSOLUTE_X, $00, BATTLE_ANIM_FRAMESET_PLAYERHEAD_2ROW, BATTLE_ANIM_FUNC_NULL, BATTLE_ANIM_GFX_ENEMYFEET + assert_table_length NUM_BATTLE_ANIM_OBJS diff --git a/data/moves/animations.asm b/data/moves/animations.asm new file mode 100644 index 0000000..3ee5f49 --- /dev/null +++ b/data/moves/animations.asm @@ -0,0 +1,4617 @@ +INCLUDE "constants.asm" + +SECTION "data/moves/animations.asm", ROMX + +BattleAnimations:: +; entries correspond to constants/move_constants.asm + table_width 2, BattleAnimations + dw BattleAnim_Dummy + dw BattleAnim_Pound + dw BattleAnim_KarateChop + dw BattleAnim_Doubleslap + dw BattleAnim_CometPunch + dw BattleAnim_MegaPunch + dw BattleAnim_PayDay + dw BattleAnim_FirePunch + dw BattleAnim_IcePunch + dw BattleAnim_Thunderpunch + dw BattleAnim_Scratch + dw BattleAnim_Vicegrip + dw BattleAnim_Guillotine + dw BattleAnim_RazorWind + dw BattleAnim_SwordsDance + dw BattleAnim_Cut + dw BattleAnim_Gust + dw BattleAnim_WingAttack + dw BattleAnim_Whirlwind + dw BattleAnim_Fly + dw BattleAnim_Bind + dw BattleAnim_Slam + dw BattleAnim_VineWhip + dw BattleAnim_Stomp + dw BattleAnim_DoubleKick + dw BattleAnim_MegaKick + dw BattleAnim_JumpKick + dw BattleAnim_RollingKick + dw BattleAnim_SandAttack + dw BattleAnim_Headbutt + dw BattleAnim_HornAttack + dw BattleAnim_FuryAttack + dw BattleAnim_HornDrill + dw BattleAnim_Tackle + dw BattleAnim_BodySlam + dw BattleAnim_Wrap + dw BattleAnim_TakeDown + dw BattleAnim_Thrash + dw BattleAnim_DoubleEdge + dw BattleAnim_TailWhip + dw BattleAnim_PoisonSting + dw BattleAnim_Twineedle + dw BattleAnim_PinMissile + dw BattleAnim_Leer + dw BattleAnim_Bite + dw BattleAnim_Growl + dw BattleAnim_Roar + dw BattleAnim_Sing + dw BattleAnim_Supersonic + dw BattleAnim_Sonicboom + dw BattleAnim_Disable + dw BattleAnim_Acid + dw BattleAnim_Ember + dw BattleAnim_Flamethrower + dw BattleAnim_Mist + dw BattleAnim_WaterGun + dw BattleAnim_HydroPump + dw BattleAnim_Surf + dw BattleAnim_IceBeam + dw BattleAnim_Blizzard + dw BattleAnim_Psybeam + dw BattleAnim_Bubblebeam + dw BattleAnim_AuroraBeam + dw BattleAnim_HyperBeam + dw BattleAnim_Peck + dw BattleAnim_DrillPeck + dw BattleAnim_Submission + dw BattleAnim_LowKick + dw BattleAnim_Counter + dw BattleAnim_SeismicToss + dw BattleAnim_Strength + dw BattleAnim_Absorb + dw BattleAnim_MegaDrain + dw BattleAnim_LeechSeed + dw BattleAnim_Growth + dw BattleAnim_RazorLeaf + dw BattleAnim_Solarbeam + dw BattleAnim_Poisonpowder + dw BattleAnim_StunSpore + dw BattleAnim_SleepPowder + dw BattleAnim_PetalDance + dw BattleAnim_StringShot + dw BattleAnim_DragonRage + dw BattleAnim_FireSpin + dw BattleAnim_Thundershock + dw BattleAnim_Thunderbolt + dw BattleAnim_ThunderWave + dw BattleAnim_Thunder + dw BattleAnim_RockThrow + dw BattleAnim_Earthquake + dw BattleAnim_Fissure + dw BattleAnim_Dig + dw BattleAnim_Toxic + dw BattleAnim_Confusion + dw BattleAnim_PsychicM + dw BattleAnim_Hypnosis + dw BattleAnim_Meditate + dw BattleAnim_Agility + dw BattleAnim_QuickAttack + dw BattleAnim_Rage + dw BattleAnim_Teleport + dw BattleAnim_NightShade + dw BattleAnim_Mimic + dw BattleAnim_Screech + dw BattleAnim_DoubleTeam + dw BattleAnim_Recover + dw BattleAnim_Harden + dw BattleAnim_Minimize + dw BattleAnim_Smokescreen + dw BattleAnim_ConfuseRay + dw BattleAnim_Withdraw + dw BattleAnim_DefenseCurl + dw BattleAnim_Barrier + dw BattleAnim_LightScreen + dw BattleAnim_Haze + dw BattleAnim_Reflect + dw BattleAnim_FocusEnergy + dw BattleAnim_Bide + dw BattleAnim_Metronome + dw BattleAnim_MirrorMove + dw BattleAnim_Selfdestruct + dw BattleAnim_EggBomb + dw BattleAnim_Lick + dw BattleAnim_Smog + dw BattleAnim_Sludge + dw BattleAnim_BoneClub + dw BattleAnim_FireBlast + dw BattleAnim_Waterfall + dw BattleAnim_Clamp + dw BattleAnim_Swift + dw BattleAnim_SkullBash + dw BattleAnim_SpikeCannon + dw BattleAnim_Constrict + dw BattleAnim_Amnesia + dw BattleAnim_Kinesis + dw BattleAnim_Softboiled + dw BattleAnim_HiJumpKick + dw BattleAnim_Glare + dw BattleAnim_DreamEater + dw BattleAnim_PoisonGas + dw BattleAnim_Barrage + dw BattleAnim_LeechLife + dw BattleAnim_LovelyKiss + dw BattleAnim_SkyAttack + dw BattleAnim_Transform + dw BattleAnim_Bubble + dw BattleAnim_DizzyPunch + dw BattleAnim_Spore + dw BattleAnim_Flash + dw BattleAnim_Psywave + dw BattleAnim_Splash + dw BattleAnim_AcidArmor + dw BattleAnim_Crabhammer + dw BattleAnim_Explosion + dw BattleAnim_FurySwipes + dw BattleAnim_Bonemerang + dw BattleAnim_Rest + dw BattleAnim_RockSlide + dw BattleAnim_HyperFang + dw BattleAnim_Sharpen + dw BattleAnim_Conversion + dw BattleAnim_TriAttack + dw BattleAnim_SuperFang + dw BattleAnim_Slash + dw BattleAnim_Substitute + dw BattleAnim_Struggle + dw BattleAnim_Sketch + dw BattleAnim_TripleKick + dw BattleAnim_Thief + dw BattleAnim_SpiderWeb + dw BattleAnim_MindReader + dw BattleAnim_Nightmare + dw BattleAnim_FlameWheel + dw BattleAnim_Snore + dw BattleAnim_NailDown + dw BattleAnim_Flail + dw BattleAnim_Conversion2 + dw BattleAnim_CoinHurl + dw BattleAnim_CottonSpore + dw BattleAnim_Reversal + dw BattleAnim_Spite + dw BattleAnim_PowderSnow + dw BattleAnim_Protect + dw BattleAnim_MachPunch + dw BattleAnim_ScaryFace + dw BattleAnim_FaintAttack + dw BattleAnim_SweetKiss + dw BattleAnim_BellyDrum + dw BattleAnim_SludgeBomb + dw BattleAnim_MudSlap + dw BattleAnim_Octazooka + dw BattleAnim_Spikes + dw BattleAnim_ZapCannon + dw BattleAnim_Foresight + dw BattleAnim_DestinyBond + dw BattleAnim_PerishSong + dw BattleAnim_Synchronize + dw BattleAnim_Detect + dw BattleAnim_BoneRush + dw BattleAnim_LockOn + dw BattleAnim_Outrage + dw BattleAnim_Sandstorm + dw BattleAnim_GigaDrain + dw BattleAnim_Endure + dw BattleAnim_Charm + dw BattleAnim_Rollout + dw BattleAnim_FalseSwipe + dw BattleAnim_Swagger + dw BattleAnim_MilkDrink + dw BattleAnim_Spark + dw BattleAnim_FuryCutter + dw BattleAnim_SteelWing + dw BattleAnim_Stalker + dw BattleAnim_Attract + dw BattleAnim_SleepTalk + dw BattleAnim_BellChime + dw BattleAnim_Return + dw BattleAnim_Present + dw BattleAnim_Frustration + dw BattleAnim_Safeguard + dw BattleAnim_PainSplit + dw BattleAnim_SacredFire + dw BattleAnim_Magnitude + dw BattleAnim_Dynamicpunch + dw BattleAnim_Megaphone + dw BattleAnim_Dragonbreath + dw BattleAnim_BatonPass + dw BattleAnim_Encore + dw BattleAnim_Pursuit + dw BattleAnim_RapidSpin + dw BattleAnim_Tempt + dw BattleAnim_IronTail + dw BattleAnim_RockHead + dw BattleAnim_VitalThrow + dw BattleAnim_MorningSun + dw BattleAnim_Synthesis + dw BattleAnim_Moonlight + dw BattleAnim_HiddenPower + dw BattleAnim_CrossCutter + dw BattleAnim_Twister + dw BattleAnim_RainDance + dw BattleAnim_SunnyDay + dw BattleAnim_Dummy + dw BattleAnim_Dummy + dw BattleAnim_Dummy + dw BattleAnim_Dummy + dw BattleAnim_Dummy + dw BattleAnim_Dummy + dw BattleAnim_StrongArm + dw BattleAnim_Dummy + dw BattleAnim_Dummy + dw BattleAnim_Dummy + assert_table_length NUM_ATTACKS + 1 + dw BattleAnim_Dummy + dw BattleAnim_Dummy + dw BattleAnim_Dummy + dw BattleAnim_Dummy + assert_table_length $100 +; $100 + dw BattleAnim_ThrowPokeBall + dw BattleAnim_SendOutMon + dw BattleAnim_ReturnMon + dw BattleAnim_Confused + dw BattleAnim_Slp + dw BattleAnim_Brn + dw BattleAnim_Psn + dw BattleAnim_Sap + dw BattleAnim_Frz + dw BattleAnim_Par + dw BattleAnim_InLove + dw BattleAnim_InSandstorm + dw BattleAnim_InNightmare + dw BattleAnim_Miss + dw BattleAnim_PlayerDamage + dw BattleAnim_ShakeHorizontalUnused + dw BattleAnim_PlayerStatDown + dw BattleAnim_BlinkEnemyMon + dw BattleAnim_ShakeHorizontalUnused2 + dw BattleAnim_EnemyStatDown + assert_table_length NUM_BATTLE_ANIMS + 1 + +BattleAnim_Dummy: +BattleAnim_MirrorMove: + anim_ret + +BattleAnim_ThrowPokeBall: + anim_if_param_equal ITEM_MASTER_BALL, .MasterBall + anim_if_param_equal ITEM_ULTRA_BALL, .UltraBall + anim_if_param_equal ITEM_GREAT_BALL, .GreatBall + anim_if_param_equal ITEM_POKE_BALL, .PokeBall +.TheTrainerBlockedTheBall: + anim_2gfx BATTLE_ANIM_GFX_POKE_BALL, BATTLE_ANIM_GFX_HIT + anim_sound 6, 2, SFX_THROW_BALL + anim_obj BATTLE_ANIM_OBJ_POKE_BALL_BLOCKED, 64, 92, $20 + anim_wait 20 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 112, 40, $0 + anim_wait 32 + anim_ret + +.UltraBall: + anim_2gfx BATTLE_ANIM_GFX_POKE_BALL, BATTLE_ANIM_GFX_SMOKE + anim_sound 6, 2, SFX_THROW_BALL + anim_obj BATTLE_ANIM_OBJ_POKE_BALL, 68, 92, $40 + anim_wait 36 + anim_obj BATTLE_ANIM_OBJ_POKE_BALL, 136, 65, $0 + anim_setobj $2, $6 + anim_wait 16 + anim_sound 0, 1, SFX_BALL_POOF + anim_obj BATTLE_ANIM_OBJ_BALL_POOF, 136, 64, $10 + anim_wait 16 + anim_bgeffect BATTLE_BG_EFFECT_RETURN_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 8 + anim_incobj 2 + anim_wait 16 + anim_incobj 1 + anim_wait 128 + anim_jump .FinishShake + +.GreatBall: + anim_2gfx BATTLE_ANIM_GFX_POKE_BALL, BATTLE_ANIM_GFX_SMOKE + anim_sound 6, 2, SFX_THROW_BALL + anim_obj BATTLE_ANIM_OBJ_POKE_BALL, 68, 92, $40 + anim_wait 36 + anim_obj BATTLE_ANIM_OBJ_POKE_BALL, 136, 65, $0 + anim_setobj $2, $6 + anim_wait 16 + anim_sound 0, 1, SFX_BALL_POOF + anim_obj BATTLE_ANIM_OBJ_BALL_POOF, 136, 64, $10 + anim_wait 16 + anim_bgeffect BATTLE_BG_EFFECT_RETURN_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 8 + anim_incobj 2 + anim_wait 16 + anim_incobj 1 + anim_wait 128 + anim_jump .FinishShake + +.PokeBall: + anim_2gfx BATTLE_ANIM_GFX_POKE_BALL, BATTLE_ANIM_GFX_SMOKE + anim_sound 6, 2, SFX_THROW_BALL + anim_obj BATTLE_ANIM_OBJ_POKE_BALL, 68, 92, $40 + anim_wait 36 + anim_obj BATTLE_ANIM_OBJ_POKE_BALL, 136, 65, $0 + anim_setobj $2, $6 + anim_wait 16 + anim_sound 0, 1, SFX_BALL_POOF + anim_obj BATTLE_ANIM_OBJ_BALL_POOF, 136, 64, $10 + anim_wait 16 + anim_bgeffect BATTLE_BG_EFFECT_RETURN_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 8 + anim_incobj 2 + anim_wait 16 + anim_incobj 1 + anim_wait 128 + anim_jump .FinishShake + +.MasterBall: + anim_3gfx BATTLE_ANIM_GFX_POKE_BALL, BATTLE_ANIM_GFX_SMOKE, BATTLE_ANIM_GFX_SPEED + anim_sound 6, 2, SFX_THROW_BALL + anim_obj BATTLE_ANIM_OBJ_POKE_BALL, 64, 92, $20 + anim_wait 36 + anim_obj BATTLE_ANIM_OBJ_POKE_BALL, 136, 65, $0 + anim_setobj $2, $6 + anim_wait 16 + anim_sound 0, 1, SFX_BALL_POOF + anim_obj BATTLE_ANIM_OBJ_BALL_POOF, 136, 64, $10 + anim_wait 24 + anim_obj BATTLE_ANIM_OBJ_MASTER_BALL_SPARKLE, 136, 56, $30 + anim_obj BATTLE_ANIM_OBJ_MASTER_BALL_SPARKLE, 136, 56, $31 + anim_obj BATTLE_ANIM_OBJ_MASTER_BALL_SPARKLE, 136, 56, $32 + anim_obj BATTLE_ANIM_OBJ_MASTER_BALL_SPARKLE, 136, 56, $33 + anim_obj BATTLE_ANIM_OBJ_MASTER_BALL_SPARKLE, 136, 56, $34 + anim_obj BATTLE_ANIM_OBJ_MASTER_BALL_SPARKLE, 136, 56, $35 + anim_obj BATTLE_ANIM_OBJ_MASTER_BALL_SPARKLE, 136, 56, $36 + anim_obj BATTLE_ANIM_OBJ_MASTER_BALL_SPARKLE, 136, 56, $37 + anim_wait 64 + anim_bgeffect BATTLE_BG_EFFECT_RETURN_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 8 + anim_incobj 2 + anim_wait 16 + anim_incobj 1 + anim_wait 128 +.FinishShake: + anim_setvar $0 +.Loop: + anim_sound 0, 1, SFX_BALL_WOBBLE + anim_wait 48 + anim_checkpokeball + anim_if_var_equal $1, .Click + anim_if_var_equal $2, .BreakFree + anim_incobj 1 + anim_jump .Loop + +.Click: + anim_keepsprites + anim_ret + +.BreakFree: + anim_setobj $1, $a + anim_sound 0, 1, SFX_BALL_POOF + anim_obj BATTLE_ANIM_OBJ_BALL_POOF, 136, 64, $10 + anim_wait 2 + anim_bgeffect BATTLE_BG_EFFECT_ENTER_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 32 + anim_ret + +BattleAnim_SendOutMon: + anim_if_param_equal $0, .Normal + anim_if_param_equal $1, .Shiny + anim_if_param_equal $2, .Unknown + anim_1gfx BATTLE_ANIM_GFX_SMOKE + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_BETA_SEND_OUT_MON2, $0, BG_EFFECT_USER, $0 + anim_sound 0, 0, SFX_BALL_POOF + anim_obj BATTLE_ANIM_OBJ_BETA_BALL_POOF, 48, 96, $0 + anim_bgeffect BATTLE_BG_EFFECT_ENTER_MON, $0, BG_EFFECT_USER, $0 + anim_wait 128 + anim_wait 4 + anim_call BattleAnim_ShowMon_0 + anim_ret + +.Unknown: + anim_1gfx BATTLE_ANIM_GFX_SMOKE + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_BETA_SEND_OUT_MON1, $0, BG_EFFECT_USER, $0 + anim_wait 1 + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_USER, $0 + anim_wait 4 + anim_sound 0, 0, SFX_BALL_POOF + anim_obj BATTLE_ANIM_OBJ_BETA_BALL_POOF, 48, 96, $0 + anim_incbgeffect BATTLE_BG_EFFECT_BETA_SEND_OUT_MON1 + anim_wait 96 + anim_incbgeffect BATTLE_BG_EFFECT_BETA_SEND_OUT_MON1 + anim_call BattleAnim_ShowMon_0 + anim_ret + +.Shiny: + anim_1gfx BATTLE_ANIM_GFX_SMOKE + anim_sound 0, 0, SFX_BALL_POOF + anim_obj BATTLE_ANIM_OBJ_BETA_BALL_POOF, 48, 96, $0 + anim_wait 16 + anim_1gfx BATTLE_ANIM_GFX_SPEED + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $6 + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_SHINY, 48, 96, $0 + anim_wait 4 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_SHINY, 48, 96, $8 + anim_wait 4 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_SHINY, 48, 96, $10 + anim_wait 4 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_SHINY, 48, 96, $18 + anim_wait 4 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_SHINY, 48, 96, $20 + anim_wait 4 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_SHINY, 48, 96, $28 + anim_bgeffect BATTLE_BG_EFFECT_ENTER_MON, $0, BG_EFFECT_USER, $0 + anim_wait 4 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_SHINY, 48, 96, $30 + anim_wait 4 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_SHINY, 48, 96, $38 + anim_wait 32 + anim_ret + +.Normal: + anim_1gfx BATTLE_ANIM_GFX_SMOKE + anim_sound 0, 0, SFX_BALL_POOF + anim_obj BATTLE_ANIM_OBJ_BALL_POOF, 44, 96, $0 + anim_wait 4 + anim_bgeffect BATTLE_BG_EFFECT_ENTER_MON, $0, BG_EFFECT_USER, $0 + anim_wait 32 + anim_ret + +BattleAnim_ReturnMon: + anim_sound 0, 0, SFX_BALL_POOF +BattleAnimSub_Return: + anim_bgeffect BATTLE_BG_EFFECT_RETURN_MON, $0, BG_EFFECT_USER, $0 + anim_wait 32 + anim_ret + +BattleAnim_Confused: + anim_1gfx BATTLE_ANIM_GFX_STATUS + anim_sound 0, 1, SFX_KINESIS + anim_obj BATTLE_ANIM_OBJ_CHICK, 44, 56, $15 + anim_obj BATTLE_ANIM_OBJ_CHICK, 44, 56, $aa + anim_obj BATTLE_ANIM_OBJ_CHICK, 44, 56, $bf + anim_wait 96 + anim_ret + +BattleAnim_Slp: + anim_1gfx BATTLE_ANIM_GFX_STATUS + anim_sound 0, 0, SFX_TAIL_WHIP +.loop + anim_obj BATTLE_ANIM_OBJ_ASLEEP, 64, 80, $0 + anim_wait 40 + anim_loop 3, .loop + anim_wait 32 + anim_ret + +BattleAnim_Brn: + anim_1gfx BATTLE_ANIM_GFX_FIRE +.loop + anim_sound 0, 0, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_BURNED, 56, 88, $10 + anim_wait 4 + anim_loop 3, .loop + anim_wait 6 + anim_ret + +BattleAnim_Psn: + anim_1gfx BATTLE_ANIM_GFX_POISON + anim_sound 0, 0, SFX_POISON + anim_obj BATTLE_ANIM_OBJ_SKULL, 64, 56, $0 + anim_wait 8 + anim_sound 0, 0, SFX_POISON + anim_obj BATTLE_ANIM_OBJ_SKULL, 48, 56, $0 + anim_wait 8 + anim_ret + +BattleAnim_Sap: + anim_1gfx BATTLE_ANIM_GFX_CHARGE + anim_sound 6, 3, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_ABSORB, 128, 48, $2 + anim_wait 6 + anim_sound 6, 3, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_ABSORB, 136, 64, $3 + anim_wait 6 + anim_sound 6, 3, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_ABSORB, 136, 32, $4 + anim_wait 16 + anim_ret + +BattleAnim_Frz: + anim_1gfx BATTLE_ANIM_GFX_ICE + anim_obj BATTLE_ANIM_OBJ_FROZEN, 44, 110, $0 + anim_sound 0, 0, SFX_SHINE + anim_wait 16 + anim_sound 0, 0, SFX_SHINE + anim_wait 16 + anim_ret + +BattleAnim_Par: + anim_1gfx BATTLE_ANIM_GFX_STATUS + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_sound 0, 0, SFX_THUNDERSHOCK + anim_obj BATTLE_ANIM_OBJ_PARALYZED, 20, 88, $42 + anim_obj BATTLE_ANIM_OBJ_PARALYZED, 76, 88, $c2 + anim_wait 128 + anim_ret + +BattleAnim_InLove: +; BUG: Uses BATTLE_ANIM_GFX_MISC when it was supposed to use BATTLE_ANIM_GFX_OBJECTS. +; This makes it show up as a pair of Kinesis spoons in-game instead of the intended heart. + anim_1gfx BATTLE_ANIM_GFX_MISC + anim_sound 0, 1, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_HEART, 64, 76, $0 + anim_wait 32 + anim_sound 0, 1, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_HEART, 36, 72, $0 + anim_wait 32 + anim_ret + +BattleAnim_InSandstorm: + anim_1gfx BATTLE_ANIM_GFX_POWDER +.loop1 + anim_sound 6, 3, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_SANDSTORM, 116, 56, $4 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_SANDSTORM, 116, 48, $3 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_SANDSTORM, 116, 56, $3 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_SANDSTORM, 116, 48, $4 + anim_wait 2 + anim_loop 2, .loop1 +.loop2 + anim_sound 0, 1, SFX_MENU + anim_wait 8 + anim_loop 10, .loop2 + anim_wait 16 + anim_ret + +BattleAnim_InNightmare: + anim_1gfx BATTLE_ANIM_GFX_ANGELS + anim_sound 0, 0, SFX_BUBBLEBEAM + anim_obj BATTLE_ANIM_OBJ_IN_NIGHTMARE, 68, 80, $0 + anim_wait 40 + anim_ret + +BattleAnim_Miss: + anim_ret + +BattleAnim_PlayerDamage: + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_Y, $20, $2, $20 + anim_wait 40 + anim_ret + +; Leftover from Generation I. In those games, this animation would be used instead of the standard damage animation +; if the move had an additional effect. +BattleAnim_ShakeHorizontalUnused: + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $20, $2, $20 + anim_wait 40 + anim_ret + +BattleAnim_PlayerStatDown: + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $20, $2, $40 + anim_wait 40 + anim_ret + +; Unused. Originally used in Generation I, and used once again in the final game, but not here for some reason. +BattleAnim_BlinkEnemyMon: +.loop + anim_bgeffect BATTLE_BG_EFFECT_HIDE_MON, $0, BG_EFFECT_USER, $0 + anim_wait 8 + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_USER, $0 + anim_wait 8 + anim_loop 6, .loop + anim_ret + +; Another leftover from Generation I. +BattleAnim_ShakeHorizontalUnused2: + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $20, $1, $20 + anim_wait 40 + anim_ret + +BattleAnim_EnemyStatDown: + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $20, $1, $40 + anim_wait 40 + anim_ret + +BattleAnim_Pound: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_POUND + anim_obj BATTLE_ANIM_OBJ_PALM, 136, 56, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_KarateChop: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_KARATE_CHOP + anim_obj BATTLE_ANIM_OBJ_PALM, 136, 40, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 40, $0 + anim_wait 6 + anim_sound 0, 1, SFX_KARATE_CHOP + anim_obj BATTLE_ANIM_OBJ_PALM, 136, 44, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 44, $0 + anim_wait 6 + anim_sound 0, 1, SFX_KARATE_CHOP + anim_obj BATTLE_ANIM_OBJ_PALM, 136, 48, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 48, $0 + anim_wait 16 + anim_ret + +BattleAnim_Doubleslap: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_if_param_equal $1, .alternate + anim_sound 0, 1, SFX_DOUBLESLAP + anim_obj BATTLE_ANIM_OBJ_PALM, 144, 48, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 48, $0 + anim_wait 8 + anim_ret + +.alternate: + anim_sound 0, 1, SFX_DOUBLESLAP + anim_obj BATTLE_ANIM_OBJ_PALM, 120, 48, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 120, 48, $0 + anim_wait 8 + anim_ret + +BattleAnim_CometPunch: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_if_param_equal $1, .alternate + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_PUNCH, 144, 48, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 48, $0 + anim_wait 8 + anim_ret + +.alternate: + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_PUNCH, 120, 64, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 120, 64, $0 + anim_wait 8 + anim_ret + +BattleAnim_MegaPunch: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $40, $2, $0 + anim_wait 64 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $7 +.loop + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_PUNCH, 136, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 56, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_PUNCH, 136, 56, $0 + anim_wait 6 + anim_loop 3, .loop + anim_ret + +BattleAnim_Stomp: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_STOMP + anim_obj BATTLE_ANIM_OBJ_KICK, 136, 40, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 40, $0 + anim_wait 6 + anim_sound 0, 1, SFX_STOMP + anim_obj BATTLE_ANIM_OBJ_KICK, 136, 44, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 44, $0 + anim_wait 6 + anim_sound 0, 1, SFX_STOMP + anim_obj BATTLE_ANIM_OBJ_KICK, 136, 48, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 48, $0 + anim_wait 16 + anim_ret + +BattleAnim_DoubleKick: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_if_param_equal $1, .alternate + anim_sound 0, 1, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 144, 48, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 48, $0 + anim_wait 8 + anim_ret + +.alternate: + anim_sound 0, 1, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 120, 64, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 120, 64, $0 + anim_wait 8 + anim_ret + +BattleAnim_JumpKick: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_JUMP_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 112, 72, $0 + anim_obj BATTLE_ANIM_OBJ_KICK, 100, 60, $0 + anim_setobj $1, $2 + anim_setobj $2, $2 + anim_wait 24 + anim_if_param_equal $1, .alternate ; Plays out the kick animation before the player hits themselves, unlike final game. + anim_sound 0, 1, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_HIT, 136, 48, $0 + anim_wait 16 + anim_ret + +.alternate + anim_wait 40 + anim_sound 0, 0, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_HIT, 44, 88, $0 + anim_wait 16 + anim_ret + +BattleAnim_HiJumpKick: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $40, $2, $0 + anim_wait 32 + anim_sound 0, 1, SFX_JUMP_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 112, 72, $0 + anim_setobj $1, $2 + anim_wait 16 + anim_if_param_equal $1, .alternate ; Plays out the kick animation before the player hits themselves, unlike final game. + anim_sound 0, 1, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_HIT, 136, 48, $0 + anim_wait 16 + anim_ret + +.alternate: + anim_wait 48 + anim_sound 0, 0, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_HIT, 44, 88, $0 + anim_wait 16 + anim_ret + +BattleAnim_RollingKick: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 112, 56, $0 + anim_setobj $1, $3 + anim_wait 12 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 48, $0 + anim_wait 16 + anim_ret + +BattleAnim_MegaKick: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $40, $2, $0 + anim_wait 64 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $7 +.loop + anim_sound 0, 1, SFX_MEGA_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 136, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 56, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_KICK, 136, 56, $0 + anim_wait 6 + anim_loop 3, .loop + anim_ret + +BattleAnim_HyperFang: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_BITE + anim_obj BATTLE_ANIM_OBJ_FANG, 136, 56, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_SuperFang: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $40, $2, $0 + anim_wait 64 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $7 +.loop + anim_sound 0, 1, SFX_BITE + anim_obj BATTLE_ANIM_OBJ_FANG, 136, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 56, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_FANG, 136, 56, $0 + anim_wait 6 + anim_loop 3, .loop + anim_ret + +BattleAnim_Ember: + anim_1gfx BATTLE_ANIM_GFX_FIRE + anim_sound 6, 2, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_EMBER, 64, 96, $12 + anim_wait 4 + anim_sound 6, 2, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_EMBER, 64, 100, $14 + anim_wait 4 + anim_sound 6, 2, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_EMBER, 64, 84, $13 + anim_wait 16 + anim_incobj 1 + anim_incobj 2 + anim_incobj 3 + anim_sound 0, 1, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_EMBER, 120, 68, $30 + anim_obj BATTLE_ANIM_OBJ_EMBER, 132, 68, $30 + anim_obj BATTLE_ANIM_OBJ_EMBER, 144, 68, $30 + anim_wait 32 + anim_ret + +BattleAnim_FirePunch: + anim_2gfx BATTLE_ANIM_GFX_HIT, BATTLE_ANIM_GFX_FIRE + anim_obj BATTLE_ANIM_OBJ_PUNCH_SHAKE, 136, 56, $43 + anim_call BattleAnimSub_Fire + anim_wait 16 + anim_ret + +BattleAnim_FireSpin: + anim_1gfx BATTLE_ANIM_GFX_FIRE +.loop + anim_sound 6, 2, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_FIRE_SPIN, 64, 88, $4 + anim_wait 2 + anim_sound 6, 2, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_FIRE_SPIN, 64, 96, $3 + anim_wait 2 + anim_sound 6, 2, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_FIRE_SPIN, 64, 88, $3 + anim_wait 2 + anim_sound 6, 2, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_FIRE_SPIN, 64, 96, $4 + anim_wait 2 + anim_loop 2, .loop + anim_wait 96 + anim_ret + +BattleAnim_DragonRage: + anim_1gfx BATTLE_ANIM_GFX_FIRE +.loop + anim_sound 6, 2, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_DRAGON_RAGE, 64, 92, $0 + anim_wait 3 + anim_loop 32, .loop + anim_wait 64 + anim_ret + +BattleAnim_Flamethrower: + anim_1gfx BATTLE_ANIM_GFX_FIRE + anim_sound 6, 2, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_FLAMETHROWER, 64, 92, $3 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FLAMETHROWER, 75, 86, $5 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FLAMETHROWER, 85, 81, $7 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FLAMETHROWER, 96, 76, $9 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FLAMETHROWER, 106, 71, $b + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FLAMETHROWER, 116, 66, $c + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FLAMETHROWER, 126, 61, $a + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FLAMETHROWER, 136, 56, $8 + anim_wait 16 +.loop + anim_sound 0, 1, SFX_EMBER + anim_wait 16 + anim_loop 8, .loop + anim_wait 16 + anim_ret + +BattleAnim_FireBlast: + anim_1gfx BATTLE_ANIM_GFX_FIRE +.loop1 + anim_sound 6, 2, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_FIRE_BLAST, 64, 92, $7 + anim_wait 6 + anim_loop 10, .loop1 +.loop2 + anim_sound 0, 1, SFX_EMBER + anim_wait 8 + anim_loop 16, .loop2 + anim_incobj 1 + anim_incobj 2 + anim_incobj 3 + anim_incobj 4 + anim_incobj 5 + anim_incobj 6 + anim_incobj 7 + anim_incobj 8 + anim_incobj 9 + anim_incobj 10 + anim_wait 2 +.loop3 + anim_sound 0, 1, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_FIRE_BLAST, 136, 56, $1 + anim_obj BATTLE_ANIM_OBJ_FIRE_BLAST, 136, 56, $2 + anim_obj BATTLE_ANIM_OBJ_FIRE_BLAST, 136, 56, $3 + anim_obj BATTLE_ANIM_OBJ_FIRE_BLAST, 136, 56, $4 + anim_obj BATTLE_ANIM_OBJ_FIRE_BLAST, 136, 56, $5 + anim_wait 16 + anim_loop 2, .loop3 + anim_wait 64 + anim_ret + +BattleAnim_IcePunch: + anim_2gfx BATTLE_ANIM_GFX_HIT, BATTLE_ANIM_GFX_ICE + anim_obj BATTLE_ANIM_OBJ_PUNCH_SHAKE, 136, 56, $43 + anim_call BattleAnimSub_Ice + anim_wait 32 + anim_ret + +BattleAnim_IceBeam: + anim_1gfx BATTLE_ANIM_GFX_ICE +.loop + anim_sound 6, 2, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_ICE_BEAM, 64, 92, $4 + anim_wait 4 + anim_loop 5, .loop + anim_obj BATTLE_ANIM_OBJ_ICE_BUILDUP, 136, 74, $10 +.loop2 + anim_sound 6, 2, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_ICE_BEAM, 64, 92, $4 + anim_wait 4 + anim_loop 15, .loop2 + anim_wait 48 + anim_sound 0, 1, SFX_SHINE + anim_wait 8 + anim_sound 0, 1, SFX_SHINE + anim_wait 8 + anim_ret + +BattleAnim_Blizzard: + anim_1gfx BATTLE_ANIM_GFX_ICE +.loop + anim_sound 6, 2, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_BLIZZARD, 64, 88, $63 + anim_wait 2 + anim_sound 6, 2, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_BLIZZARD, 64, 80, $64 + anim_wait 2 + anim_sound 6, 2, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_BLIZZARD, 64, 96, $63 + anim_wait 2 + anim_loop 3, .loop + anim_bgeffect BATTLE_BG_EFFECT_WHITE_HUES, $0, $8, $0 + anim_wait 32 + anim_obj BATTLE_ANIM_OBJ_ICE_BUILDUP, 136, 74, $10 + anim_wait 128 + anim_sound 0, 1, SFX_SHINE + anim_wait 8 + anim_sound 0, 1, SFX_SHINE + anim_wait 24 + anim_ret + +BattleAnim_Bubble: + anim_1gfx BATTLE_ANIM_GFX_BUBBLE + anim_sound 32, 2, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_BUBBLE, 64, 92, $c1 + anim_wait 6 + anim_sound 32, 2, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_BUBBLE, 64, 92, $e1 + anim_wait 6 + anim_sound 32, 2, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_BUBBLE, 64, 92, $d1 + anim_wait 128 + anim_wait 32 + anim_ret + +BattleAnim_Bubblebeam: + anim_1gfx BATTLE_ANIM_GFX_BUBBLE +.loop + anim_sound 16, 2, SFX_BUBBLEBEAM + anim_obj BATTLE_ANIM_OBJ_BUBBLE, 64, 92, $92 + anim_wait 6 + anim_sound 16, 2, SFX_BUBBLEBEAM + anim_obj BATTLE_ANIM_OBJ_BUBBLE, 64, 92, $b3 + anim_wait 6 + anim_sound 16, 2, SFX_BUBBLEBEAM + anim_obj BATTLE_ANIM_OBJ_BUBBLE, 64, 92, $f4 + anim_wait 8 + anim_loop 3, .loop + anim_wait 64 +; No rippling effect added yet. + anim_ret + +BattleAnim_WaterGun: + anim_1gfx BATTLE_ANIM_GFX_WATER + anim_sound 16, 2, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_WATER_GUN, 64, 88, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_WATER_GUN, 64, 76, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_WATER_GUN, 64, 82, $0 + anim_wait 128 +; No ripple effect here either. + anim_ret + +BattleAnim_HydroPump: + anim_1gfx BATTLE_ANIM_GFX_WATER + anim_sound 0, 1, SFX_HYDRO_PUMP + anim_obj BATTLE_ANIM_OBJ_HYDRO_PUMP, 108, 72, $0 + anim_wait 16 + anim_sound 0, 1, SFX_HYDRO_PUMP + anim_obj BATTLE_ANIM_OBJ_HYDRO_PUMP, 116, 72, $0 + anim_wait 16 + anim_sound 0, 1, SFX_HYDRO_PUMP + anim_obj BATTLE_ANIM_OBJ_HYDRO_PUMP, 124, 72, $0 + anim_wait 16 + anim_sound 0, 1, SFX_HYDRO_PUMP + anim_obj BATTLE_ANIM_OBJ_HYDRO_PUMP, 132, 72, $0 + anim_wait 16 + anim_sound 0, 1, SFX_HYDRO_PUMP + anim_obj BATTLE_ANIM_OBJ_HYDRO_PUMP, 140, 72, $0 + anim_wait 16 + anim_sound 0, 1, SFX_HYDRO_PUMP + anim_obj BATTLE_ANIM_OBJ_HYDRO_PUMP, 148, 72, $0 + anim_wait 16 + anim_sound 0, 1, SFX_HYDRO_PUMP + anim_obj BATTLE_ANIM_OBJ_HYDRO_PUMP, 156, 72, $0 + anim_wait 96 + anim_ret + +BattleAnim_Surf: + anim_1gfx BATTLE_ANIM_GFX_BUBBLE + anim_bgeffect BATTLE_BG_EFFECT_SURF, $0, $0, $0 + anim_obj BATTLE_ANIM_OBJ_SURF, 88, 104, $8 +.loop + anim_sound 0, 1, SFX_SURF + anim_wait 32 + anim_loop 4, .loop + anim_incobj 1 + anim_wait 56 + anim_ret + +BattleAnim_VineWhip: + anim_1gfx BATTLE_ANIM_GFX_WHIP + anim_sound 0, 1, SFX_VINE_WHIP + anim_obj BATTLE_ANIM_OBJ_VINE_WHIP2, 116, 52, $80 + anim_wait 4 + anim_sound 0, 1, SFX_VINE_WHIP + anim_obj BATTLE_ANIM_OBJ_VINE_WHIP1, 128, 60, $0 + anim_wait 4 + anim_incobj 1 + anim_wait 4 + anim_ret + +BattleAnim_LeechSeed: + anim_1gfx BATTLE_ANIM_GFX_PLANT + anim_sound 16, 2, SFX_VINE_WHIP + anim_obj BATTLE_ANIM_OBJ_LEECH_SEED, 48, 80, $20 + anim_wait 8 + anim_sound 16, 2, SFX_VINE_WHIP + anim_obj BATTLE_ANIM_OBJ_LEECH_SEED, 48, 80, $30 + anim_wait 8 + anim_sound 16, 2, SFX_VINE_WHIP + anim_obj BATTLE_ANIM_OBJ_LEECH_SEED, 48, 80, $28 + anim_wait 32 + anim_sound 0, 1, SFX_CHARGE + anim_wait 128 + anim_ret + +BattleAnim_RazorLeaf: + anim_1gfx BATTLE_ANIM_GFX_PLANT + anim_sound 0, 0, SFX_VINE_WHIP + anim_obj BATTLE_ANIM_OBJ_RAZOR_LEAF, 48, 80, $28 + anim_obj BATTLE_ANIM_OBJ_RAZOR_LEAF, 48, 80, $5c + anim_obj BATTLE_ANIM_OBJ_RAZOR_LEAF, 48, 80, $10 + anim_obj BATTLE_ANIM_OBJ_RAZOR_LEAF, 48, 80, $e8 + anim_obj BATTLE_ANIM_OBJ_RAZOR_LEAF, 48, 80, $9c + anim_obj BATTLE_ANIM_OBJ_RAZOR_LEAF, 48, 80, $d0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_RAZOR_LEAF, 48, 80, $1c + anim_obj BATTLE_ANIM_OBJ_RAZOR_LEAF, 48, 80, $50 + anim_obj BATTLE_ANIM_OBJ_RAZOR_LEAF, 48, 80, $dc + anim_obj BATTLE_ANIM_OBJ_RAZOR_LEAF, 48, 80, $90 + anim_wait 80 + anim_sound 16, 2, SFX_VINE_WHIP + anim_incobj 3 + anim_wait 2 + anim_sound 16, 2, SFX_VINE_WHIP + anim_incobj 5 + anim_wait 2 + anim_sound 16, 2, SFX_VINE_WHIP + anim_incobj 7 + anim_wait 2 + anim_sound 16, 2, SFX_VINE_WHIP + anim_incobj 9 + anim_wait 2 + anim_sound 16, 2, SFX_VINE_WHIP + anim_incobj 1 + anim_wait 2 + anim_sound 16, 2, SFX_VINE_WHIP + anim_incobj 2 + anim_wait 2 + anim_sound 16, 2, SFX_VINE_WHIP + anim_incobj 4 + anim_wait 2 + anim_sound 16, 2, SFX_VINE_WHIP + anim_incobj 6 + anim_wait 2 + anim_sound 16, 2, SFX_VINE_WHIP + anim_incobj 8 + anim_wait 2 + anim_sound 16, 2, SFX_VINE_WHIP + anim_incobj 10 + anim_wait 64 + anim_ret + +BattleAnim_Solarbeam: + anim_if_param_equal $0, .FireSolarBeam + ; charge turn + anim_1gfx BATTLE_ANIM_GFX_CHARGE + anim_sound 0, 0, SFX_CHARGE + anim_obj BATTLE_ANIM_OBJ_ABSORB_CENTER, 48, 84, $0 + anim_obj BATTLE_ANIM_OBJ_SOLAR_BEAM_CHARGE, 48, 84, $0 + anim_obj BATTLE_ANIM_OBJ_SOLAR_BEAM_CHARGE, 48, 84, $8 + anim_obj BATTLE_ANIM_OBJ_SOLAR_BEAM_CHARGE, 48, 84, $10 + anim_obj BATTLE_ANIM_OBJ_SOLAR_BEAM_CHARGE, 48, 84, $18 + anim_obj BATTLE_ANIM_OBJ_SOLAR_BEAM_CHARGE, 48, 84, $20 + anim_obj BATTLE_ANIM_OBJ_SOLAR_BEAM_CHARGE, 48, 84, $28 + anim_obj BATTLE_ANIM_OBJ_SOLAR_BEAM_CHARGE, 48, 84, $30 + anim_obj BATTLE_ANIM_OBJ_SOLAR_BEAM_CHARGE, 48, 84, $38 + anim_wait 104 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_WHITE, $0, $2, $4 + anim_wait 64 + anim_ret + +.FireSolarBeam + anim_1gfx BATTLE_ANIM_GFX_BEAM + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_call BattleAnimSub_Beam + anim_wait 48 + anim_ret + +BattleAnim_Thunderpunch: + anim_2gfx BATTLE_ANIM_GFX_HIT, BATTLE_ANIM_GFX_LIGHTNING + anim_obj BATTLE_ANIM_OBJ_PUNCH_SHAKE, 136, 56, $43 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $4 + anim_sound 0, 1, SFX_THUNDER + anim_obj BATTLE_ANIM_OBJ_THUNDER_RIGHT, 152, 68, $0 + anim_wait 64 + anim_ret + +BattleAnim_Thundershock: + anim_2gfx BATTLE_ANIM_GFX_LIGHTNING, BATTLE_ANIM_GFX_EXPLOSION + anim_obj BATTLE_ANIM_OBJ_THUNDERSHOCK_BALL, 136, 56, $2 + anim_wait 16 + anim_sound 0, 1, SFX_THUNDERSHOCK + anim_obj BATTLE_ANIM_OBJ_SPARKS_CIRCLE, 136, 56, $0 + anim_wait 128 + anim_ret + +BattleAnim_Thunderbolt: + anim_2gfx BATTLE_ANIM_GFX_LIGHTNING, BATTLE_ANIM_GFX_EXPLOSION + anim_obj BATTLE_ANIM_OBJ_THUNDERBOLT_BALL, 136, 56, $2 + anim_wait 16 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_sound 0, 1, SFX_THUNDERSHOCK + anim_obj BATTLE_ANIM_OBJ_SPARKS_CIRCLE_BIG, 136, 56, $0 + anim_wait 64 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_wait 64 + anim_ret + +BattleAnim_ThunderWave: + anim_1gfx BATTLE_ANIM_GFX_LIGHTNING + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $7 + anim_sound 0, 1, SFX_THUNDERSHOCK + anim_obj BATTLE_ANIM_OBJ_THUNDER_WAVE, 136, 56, $0 + anim_wait 20 + anim_bgp $1b + anim_incobj 1 + anim_wait 128 + anim_ret + +BattleAnim_Thunder: + anim_1gfx BATTLE_ANIM_GFX_LIGHTNING + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $40 + anim_sound 0, 1, SFX_THUNDER + anim_obj BATTLE_ANIM_OBJ_THUNDER_LEFT, 120, 68, $0 + anim_wait 16 + anim_sound 0, 1, SFX_THUNDER + anim_obj BATTLE_ANIM_OBJ_THUNDER_RIGHT, 152, 68, $0 + anim_wait 16 + anim_sound 0, 1, SFX_THUNDER + anim_obj BATTLE_ANIM_OBJ_THUNDER_CENTER, 136, 68, $0 + anim_wait 48 + anim_ret + +BattleAnim_RazorWind: + anim_if_param_equal $1, BattleAnim_FocusEnergy + anim_1gfx BATTLE_ANIM_GFX_WHIP + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $1, $0 +.loop + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_sound 0, 1, SFX_RAZOR_WIND + anim_obj BATTLE_ANIM_OBJ_RAZOR_WIND2, 152, 40, $3 + anim_wait 4 + anim_sound 0, 1, SFX_RAZOR_WIND + anim_obj BATTLE_ANIM_OBJ_RAZOR_WIND2, 136, 56, $3 + anim_wait 4 + anim_sound 0, 1, SFX_RAZOR_WIND + anim_obj BATTLE_ANIM_OBJ_RAZOR_WIND2, 152, 64, $3 + anim_wait 4 + anim_sound 0, 1, SFX_RAZOR_WIND + anim_obj BATTLE_ANIM_OBJ_RAZOR_WIND1, 120, 40, $83 + anim_wait 4 + anim_sound 0, 1, SFX_RAZOR_WIND + anim_obj BATTLE_ANIM_OBJ_RAZOR_WIND1, 120, 64, $83 + anim_wait 4 + anim_loop 3, .loop + anim_wait 32 + anim_ret + +BattleAnim_Sonicboom: + anim_2gfx BATTLE_ANIM_GFX_WHIP, BATTLE_ANIM_GFX_HIT +.loop + anim_sound 3, 0, SFX_RAZOR_WIND + anim_obj BATTLE_ANIM_OBJ_SONICBOOM, 64, 80, $3 + anim_wait 8 + anim_sound 3, 0, SFX_RAZOR_WIND + anim_obj BATTLE_ANIM_OBJ_SONICBOOM, 64, 88, $2 + anim_wait 8 + anim_sound 3, 0, SFX_RAZOR_WIND + anim_obj BATTLE_ANIM_OBJ_SONICBOOM, 64, 96, $4 + anim_wait 8 + anim_loop 2, .loop + anim_wait 32 + anim_incobj 1 + anim_incobj 2 + anim_incobj 3 + anim_incobj 4 + anim_incobj 5 + anim_incobj 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_Gust: + anim_2gfx BATTLE_ANIM_GFX_WIND, BATTLE_ANIM_GFX_HIT +.loop + anim_sound 0, 1, SFX_RAZOR_WIND + anim_obj BATTLE_ANIM_OBJ_GUST, 136, 72, $0 + anim_wait 6 + anim_loop 9, .loop + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 64, $18 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 128, 32, $18 + anim_wait 16 + anim_ret + +BattleAnim_Selfdestruct: + anim_1gfx BATTLE_ANIM_GFX_EXPLOSION + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $48 + anim_if_param_equal $1, .loop + anim_call BattleAnimSub_Explosion2 + anim_wait 16 + anim_ret + +.loop + anim_call BattleAnimSub_Explosion1 + anim_wait 5 + anim_bgeffect BATTLE_BG_EFFECT_HIDE_MON, $0, BG_EFFECT_USER, $0 + anim_loop 2, .loop + anim_wait 16 + anim_ret + +BattleAnim_Explosion: + anim_1gfx BATTLE_ANIM_GFX_EXPLOSION + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $60, $4, $10 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $48 + anim_if_param_equal $1, .loop + anim_call BattleAnimSub_Explosion2 + anim_wait 16 + anim_ret + +.loop + anim_call BattleAnimSub_Explosion1 + anim_wait 5 + anim_bgeffect BATTLE_BG_EFFECT_HIDE_MON, $0, BG_EFFECT_USER, $0 + anim_loop 2, .loop + anim_wait 16 + anim_ret + +BattleAnim_Acid: + anim_1gfx BATTLE_ANIM_GFX_POISON + anim_call BattleAnimSub_Acid + anim_wait 64 + anim_ret + +BattleAnim_RockThrow: + anim_1gfx BATTLE_ANIM_GFX_ROCKS + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_SMALL_ROCK, 128, 68, $30 + anim_wait 2 + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_BIG_ROCK, 136, 64, $40 + anim_wait 2 + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_SMALL_ROCK, 144, 68, $30 + anim_wait 96 + anim_ret + +BattleAnim_RockSlide: + anim_1gfx BATTLE_ANIM_GFX_ROCKS +.loop + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_SMALL_ROCK, 128, 64, $40 + anim_wait 2 + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_BIG_ROCK, 120, 68, $30 + anim_wait 2 + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_SMALL_ROCK, 152, 68, $30 + anim_wait 2 + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_BIG_ROCK, 144, 64, $40 + anim_wait 2 + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_SMALL_ROCK, 136, 68, $30 + anim_wait 16 + anim_loop 2, .loop + anim_wait 96 + anim_ret + +BattleAnim_Sing: + anim_1gfx BATTLE_ANIM_GFX_NOISE + anim_sound 16, 2, SFX_SING +.loop + anim_obj BATTLE_ANIM_OBJ_SING, 64, 92, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_SING, 64, 92, $1 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_SING, 64, 92, $2 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_SING, 64, 92, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_SING, 64, 92, $2 + anim_wait 8 + anim_loop 4, .loop + anim_wait 64 + anim_ret + +BattleAnim_Poisonpowder: +BattleAnim_SleepPowder: +BattleAnim_Spore: +BattleAnim_StunSpore: + anim_1gfx BATTLE_ANIM_GFX_POWDER +.loop + anim_sound 0, 1, SFX_POWDER + anim_obj BATTLE_ANIM_OBJ_POWDER, 104, 16, $0 + anim_wait 4 + anim_sound 0, 1, SFX_POWDER + anim_obj BATTLE_ANIM_OBJ_POWDER, 136, 16, $0 + anim_wait 4 + anim_sound 0, 1, SFX_POWDER + anim_obj BATTLE_ANIM_OBJ_POWDER, 112, 16, $0 + anim_wait 4 + anim_sound 0, 1, SFX_POWDER + anim_obj BATTLE_ANIM_OBJ_POWDER, 128, 16, $0 + anim_wait 4 + anim_sound 0, 1, SFX_POWDER + anim_obj BATTLE_ANIM_OBJ_POWDER, 120, 16, $0 + anim_wait 4 + anim_loop 2, .loop + anim_wait 128 + anim_ret + +BattleAnim_HyperBeam: + anim_1gfx BATTLE_ANIM_GFX_BEAM + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $30, $4, $10 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $80 + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_call BattleAnimSub_Beam + anim_wait 48 + anim_ret + +BattleAnim_AuroraBeam: + anim_1gfx BATTLE_ANIM_GFX_BEAM + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_bgeffect BATTLE_BG_EFFECT_ALTERNATE_HUES, $0, $2, $0 + anim_wait 64 + anim_call BattleAnimSub_Beam + anim_wait 48 + anim_incobj 5 + anim_wait 64 + anim_ret + +BattleAnim_Vicegrip: + anim_1gfx BATTLE_ANIM_GFX_CUT + anim_sound 0, 1, SFX_VICEGRIP + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_LEFT, 152, 40, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_UP_RIGHT, 120, 72, $0 + anim_wait 32 + anim_ret + +BattleAnim_Scratch: + anim_1gfx BATTLE_ANIM_GFX_CUT + anim_sound 0, 1, SFX_SCRATCH + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_LEFT, 144, 48, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_LEFT, 140, 44, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_LEFT, 136, 40, $0 + anim_wait 32 + anim_ret + +BattleAnim_FurySwipes: + anim_1gfx BATTLE_ANIM_GFX_CUT + anim_if_param_equal $1, .alternate + anim_sound 0, 1, SFX_SCRATCH + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_LEFT, 144, 48, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_LEFT, 140, 44, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_LEFT, 136, 40, $0 + anim_sound 0, 1, SFX_SCRATCH + anim_wait 32 + anim_ret + +.alternate: + anim_sound 0, 1, SFX_SCRATCH + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_RIGHT, 120, 48, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_RIGHT, 124, 44, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_RIGHT, 128, 40, $0 + anim_sound 0, 1, SFX_SCRATCH + anim_wait 32 + anim_ret + +BattleAnim_Cut: + anim_1gfx BATTLE_ANIM_GFX_CUT + anim_sound 0, 1, SFX_CUT + anim_obj BATTLE_ANIM_OBJ_CUT_LONG_DOWN_LEFT, 152, 40, $0 + anim_wait 32 + anim_ret + +BattleAnim_Slash: + anim_1gfx BATTLE_ANIM_GFX_CUT + anim_sound 0, 1, SFX_CUT + anim_obj BATTLE_ANIM_OBJ_CUT_LONG_DOWN_LEFT, 152, 40, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_LONG_DOWN_LEFT, 148, 36, $0 + anim_wait 32 + anim_ret + +BattleAnim_Clamp: + anim_2gfx BATTLE_ANIM_GFX_CUT, BATTLE_ANIM_GFX_HIT + anim_obj BATTLE_ANIM_OBJ_CLAMP, 136, 56, $a0 + anim_obj BATTLE_ANIM_OBJ_CLAMP, 136, 56, $20 + anim_wait 16 + anim_sound 0, 1, SFX_BITE + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 48, $18 + anim_wait 32 + anim_sound 0, 1, SFX_BITE + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 128, 64, $18 + anim_wait 16 + anim_ret + +BattleAnim_Bite: + anim_2gfx BATTLE_ANIM_GFX_CUT, BATTLE_ANIM_GFX_HIT + anim_obj BATTLE_ANIM_OBJ_BITE, 136, 56, $98 + anim_obj BATTLE_ANIM_OBJ_BITE, 136, 56, $18 + anim_wait 8 + anim_sound 0, 1, SFX_BITE + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 48, $18 + anim_wait 16 + anim_sound 0, 1, SFX_BITE + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 128, 64, $18 + anim_wait 8 + anim_ret + +BattleAnim_Teleport: + anim_1gfx BATTLE_ANIM_GFX_SPEED + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_TELEPORT, $0, BG_EFFECT_USER, $0 + anim_wait 32 + anim_bgeffect BATTLE_BG_EFFECT_HIDE_MON, $0, BG_EFFECT_USER, $0 + anim_wait 3 + anim_incbgeffect BATTLE_BG_EFFECT_TELEPORT + anim_call BattleAnim_ShowMon_0 + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $1, $0 + anim_call BattleAnimSub_WarpAway + anim_wait 64 + anim_ret + +BattleAnim_Fly: + anim_if_param_equal $1, .turn1 + anim_if_param_equal $2, .miss + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_WING_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 32 +.miss: + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_USER, $0 + anim_wait 32 + anim_ret + +.turn1: + anim_1gfx BATTLE_ANIM_GFX_SPEED + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $1, $0 + anim_bgeffect BATTLE_BG_EFFECT_HIDE_MON, $0, BG_EFFECT_USER, $0 + anim_call BattleAnimSub_WarpAway + anim_wait 64 + anim_ret + +BattleAnim_DoubleTeam: + anim_call BattleAnim_TargetObj_1Row + anim_sound 0, 0, SFX_PSYBEAM + anim_bgeffect BATTLE_BG_EFFECT_DOUBLE_TEAM, $0, BG_EFFECT_USER, $0 + anim_wait 128 + anim_incbgeffect BATTLE_BG_EFFECT_DOUBLE_TEAM + anim_wait 24 + anim_incbgeffect BATTLE_BG_EFFECT_DOUBLE_TEAM + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Recover: + anim_1gfx BATTLE_ANIM_GFX_BUBBLE + anim_call BattleAnim_TargetObj_1Row + anim_sound 0, 0, SFX_FULL_HEAL + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING, $0, BG_EFFECT_USER, $40 + anim_obj BATTLE_ANIM_OBJ_RECOVER, 44, 88, $30 + anim_obj BATTLE_ANIM_OBJ_RECOVER, 44, 88, $31 + anim_obj BATTLE_ANIM_OBJ_RECOVER, 44, 88, $32 + anim_obj BATTLE_ANIM_OBJ_RECOVER, 44, 88, $33 + anim_obj BATTLE_ANIM_OBJ_RECOVER, 44, 88, $34 + anim_obj BATTLE_ANIM_OBJ_RECOVER, 44, 88, $35 + anim_obj BATTLE_ANIM_OBJ_RECOVER, 44, 88, $36 + anim_obj BATTLE_ANIM_OBJ_RECOVER, 44, 88, $37 + anim_wait 64 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Absorb: + anim_1gfx BATTLE_ANIM_GFX_CHARGE + anim_obj BATTLE_ANIM_OBJ_ABSORB_CENTER, 44, 88, $0 +.loop + anim_sound 6, 3, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_ABSORB, 128, 48, $2 + anim_wait 6 + anim_sound 6, 3, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_ABSORB, 136, 64, $3 + anim_wait 6 + anim_sound 6, 3, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_ABSORB, 136, 32, $4 + anim_wait 6 + anim_loop 5, .loop + anim_wait 32 + anim_ret + +BattleAnim_MegaDrain: + anim_1gfx BATTLE_ANIM_GFX_CHARGE + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_FADE_MONS_TO_BLACK_REPEATING, $0, BG_EFFECT_TARGET, $10 + anim_setvar $0 +.loop + anim_sound 6, 3, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_ABSORB, 128, 48, $2 + anim_wait 6 + anim_sound 6, 3, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_ABSORB, 136, 64, $3 + anim_wait 6 + anim_sound 6, 3, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_ABSORB, 136, 32, $4 + anim_wait 6 + anim_incvar + anim_if_var_equal $7, .done + anim_if_var_equal $2, .spawn + anim_jump .loop + +.spawn + anim_obj BATTLE_ANIM_OBJ_ABSORB_CENTER, 44, 88, $0 + anim_jump .loop + +.done + anim_wait 32 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MONS_TO_BLACK_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_EggBomb: + anim_2gfx BATTLE_ANIM_GFX_EGG, BATTLE_ANIM_GFX_EXPLOSION + anim_sound 0, 0, SFX_SWITCH_POKEMON + anim_obj BATTLE_ANIM_OBJ_EGG, 44, 104, $1 + anim_wait 128 + anim_wait 96 + anim_incobj 1 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $6 + anim_sound 0, 1, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION2, 128, 64, $0 + anim_wait 8 + anim_sound 0, 1, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION2, 144, 68, $0 + anim_wait 8 + anim_sound 0, 1, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION2, 136, 72, $0 + anim_wait 24 + anim_ret + +BattleAnim_Softboiled: + anim_2gfx BATTLE_ANIM_GFX_EGG, BATTLE_ANIM_GFX_BUBBLE + anim_call BattleAnim_TargetObj_1Row + anim_sound 0, 0, SFX_SWITCH_POKEMON + anim_obj BATTLE_ANIM_OBJ_EGG, 44, 104, $6 + anim_wait 128 + anim_incobj 2 + anim_obj BATTLE_ANIM_OBJ_EGG, 76, 104, $b + anim_wait 16 + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING, $0, BG_EFFECT_USER, $40 + anim_sound 0, 0, SFX_GAME_FREAK_LOGO_RG +.loop + anim_obj BATTLE_ANIM_OBJ_RECOVER, 44, 88, $20 + anim_wait 8 + anim_loop 8, .loop + anim_wait 128 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_FocusEnergy: + anim_1gfx BATTLE_ANIM_GFX_SPEED + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT, $0, BG_EFFECT_USER, $40 + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 +.loop + anim_sound 0, 0, SFX_SWORDS_DANCE + anim_obj BATTLE_ANIM_OBJ_FOCUS, 44, 108, $6 + anim_wait 2 + anim_sound 0, 0, SFX_SWORDS_DANCE + anim_obj BATTLE_ANIM_OBJ_FOCUS, 36, 108, $6 + anim_wait 2 + anim_sound 0, 0, SFX_SWORDS_DANCE + anim_obj BATTLE_ANIM_OBJ_FOCUS, 52, 108, $8 + anim_wait 2 + anim_sound 0, 0, SFX_SWORDS_DANCE + anim_obj BATTLE_ANIM_OBJ_FOCUS, 28, 108, $8 + anim_wait 2 + anim_sound 0, 0, SFX_SWORDS_DANCE + anim_obj BATTLE_ANIM_OBJ_FOCUS, 60, 108, $6 + anim_wait 2 + anim_sound 0, 0, SFX_SWORDS_DANCE + anim_obj BATTLE_ANIM_OBJ_FOCUS, 20, 108, $8 + anim_wait 2 + anim_sound 0, 0, SFX_SWORDS_DANCE + anim_obj BATTLE_ANIM_OBJ_FOCUS, 68, 108, $8 + anim_wait 2 + anim_loop 5, .loop + anim_wait 8 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Bide: + anim_if_param_equal $0, BattleAnim_MegaPunch + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_sound 0, 0, SFX_ESCAPE_ROPE + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING, $0, BG_EFFECT_USER, $20 + anim_wait 72 + anim_incbgeffect BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Bind: + anim_1gfx BATTLE_ANIM_GFX_ROPE + anim_sound 0, 1, SFX_BIND + anim_obj BATTLE_ANIM_OBJ_BIND1, 132, 64, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_BIND2, 132, 56, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_BIND1, 132, 48, $0 + anim_wait 64 + anim_sound 0, 1, SFX_BIND + anim_incobj 1 + anim_incobj 2 + anim_incobj 3 + anim_wait 128 + anim_ret + +BattleAnim_Wrap: + anim_1gfx BATTLE_ANIM_GFX_ROPE + anim_sound 0, 1, SFX_BIND + anim_obj BATTLE_ANIM_OBJ_BIND1, 132, 64, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_BIND1, 132, 56, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_BIND1, 132, 48, $0 + anim_wait 64 + anim_sound 0, 1, SFX_BIND + anim_incobj 1 + anim_incobj 2 + anim_incobj 3 + anim_wait 128 + anim_ret + +BattleAnim_Confusion: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_UserObj_2Row + anim_sound 0, 1, SFX_PSYCHIC + anim_bgeffect BATTLE_BG_EFFECT_NIGHT_SHADE, $0, BG_EFFECT_TARGET, $8 + anim_wait 128 + anim_incbgeffect BATTLE_BG_EFFECT_NIGHT_SHADE + anim_call BattleAnim_ShowMon_1 + anim_ret + +BattleAnim_Constrict: + anim_1gfx BATTLE_ANIM_GFX_ROPE + anim_sound 0, 1, SFX_BIND + anim_obj BATTLE_ANIM_OBJ_BIND2, 132, 64, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_BIND1, 132, 48, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_BIND2, 132, 40, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_BIND1, 132, 56, $0 + anim_wait 96 + anim_ret + +BattleAnim_Earthquake: + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $60, $4, $10 +.loop + anim_sound 0, 1, SFX_EMBER + anim_wait 32 + anim_loop 4, .loop + anim_ret + +BattleAnim_Fissure: + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $80 + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $60, $4, $0 +.loop + anim_sound 0, 1, SFX_EMBER + anim_wait 32 + anim_loop 4, .loop + anim_ret + +BattleAnim_Growl: + anim_1gfx BATTLE_ANIM_GFX_NOISE + anim_battlergfx_2row + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_cry $0 +.loop + anim_call BattleAnimSub_Sound + anim_wait 16 + anim_loop 3, .loop + anim_bgeffect BATTLE_BG_EFFECT_BATTLEROBJ_1ROW, $0, BG_EFFECT_USER, $0 + anim_wait 8 + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_BLACK_REPEATING, $0, BG_EFFECT_TARGET, $40 + anim_wait 64 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_BLACK_REPEATING + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_USER, $0 + anim_wait 3 + anim_incobj 10 + anim_wait 8 + anim_ret + +BattleAnim_Roar: + anim_1gfx BATTLE_ANIM_GFX_NOISE + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_cry $1 +.loop + anim_call BattleAnimSub_Sound + anim_wait 16 + anim_loop 3, .loop + anim_wait 16 + anim_if_param_equal $0, .done + anim_bgeffect BATTLE_BG_EFFECT_REMOVE_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 64 +.done + anim_ret + +BattleAnim_Supersonic: + anim_1gfx BATTLE_ANIM_GFX_PSYCHIC +.loop + anim_sound 6, 2, SFX_SUPERSONIC + anim_obj BATTLE_ANIM_OBJ_WAVE, 64, 88, $2 + anim_wait 4 + anim_loop 10, .loop + anim_wait 64 + anim_ret + +BattleAnim_Screech: + anim_1gfx BATTLE_ANIM_GFX_PSYCHIC + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $8, $1, $20 + anim_sound 6, 2, SFX_SCREECH +.loop + anim_obj BATTLE_ANIM_OBJ_WAVE, 64, 88, $2 + anim_wait 2 + anim_loop 2, .loop + anim_wait 64 + anim_ret + +BattleAnim_ConfuseRay: + anim_1gfx BATTLE_ANIM_GFX_SPEED + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_BGPALS_INVERTED, $0, $2, $0 + anim_obj BATTLE_ANIM_OBJ_CONFUSE_RAY, 64, 88, $0 + anim_obj BATTLE_ANIM_OBJ_CONFUSE_RAY, 64, 88, $80 + anim_obj BATTLE_ANIM_OBJ_CONFUSE_RAY, 64, 88, $88 + anim_obj BATTLE_ANIM_OBJ_CONFUSE_RAY, 64, 88, $90 + anim_obj BATTLE_ANIM_OBJ_CONFUSE_RAY, 64, 88, $98 + anim_obj BATTLE_ANIM_OBJ_CONFUSE_RAY, 64, 88, $a0 + anim_obj BATTLE_ANIM_OBJ_CONFUSE_RAY, 64, 88, $a8 + anim_obj BATTLE_ANIM_OBJ_CONFUSE_RAY, 64, 88, $b0 + anim_obj BATTLE_ANIM_OBJ_CONFUSE_RAY, 64, 88, $b8 +.loop + anim_sound 6, 2, SFX_WHIRLWIND + anim_wait 16 + anim_loop 12, .loop + anim_wait 64 + anim_ret + +BattleAnim_Leer: + anim_1gfx BATTLE_ANIM_GFX_BEAM + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_call BattleAnimSub_EyeBeams + anim_wait 16 + anim_ret + +BattleAnim_Reflect: + anim_1gfx BATTLE_ANIM_GFX_REFLECT + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_SCREEN, 72, 80, $0 + anim_wait 24 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_SCREEN, 72, 80, $0 + anim_wait 64 + anim_ret + +BattleAnim_LightScreen: + anim_2gfx BATTLE_ANIM_GFX_SPEED, BATTLE_ANIM_GFX_REFLECT + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_sound 0, 0, SFX_GAME_FREAK_LOGO_RG + anim_obj BATTLE_ANIM_OBJ_SCREEN, 72, 80, $0 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_SHINY, 72, 80, $0 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_SHINY, 72, 80, $8 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_SHINY, 72, 80, $10 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_SHINY, 72, 80, $18 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_SCREEN, 72, 80, $0 + anim_obj BATTLE_ANIM_OBJ_SHINY, 72, 80, $20 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_SHINY, 72, 80, $28 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_SHINY, 72, 80, $30 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_SHINY, 72, 80, $38 + anim_wait 64 + anim_ret + +BattleAnim_Amnesia: + anim_1gfx BATTLE_ANIM_GFX_STATUS + anim_sound 0, 0, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_AMNESIA, 64, 80, $2 + anim_wait 16 + anim_obj BATTLE_ANIM_OBJ_AMNESIA, 68, 80, $1 + anim_wait 16 + anim_obj BATTLE_ANIM_OBJ_AMNESIA, 72, 80, $0 + anim_wait 64 + anim_ret + +BattleAnim_DizzyPunch: + anim_2gfx BATTLE_ANIM_GFX_STATUS, BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 40, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL_YFIX, 136, 64, $0 + anim_wait 16 + anim_sound 0, 1, SFX_KINESIS + anim_obj BATTLE_ANIM_OBJ_CHICK, 136, 24, $15 + anim_obj BATTLE_ANIM_OBJ_CHICK, 136, 24, $aa + anim_obj BATTLE_ANIM_OBJ_CHICK, 136, 24, $bf + anim_wait 96 + anim_ret + +BattleAnim_Rest: + anim_1gfx BATTLE_ANIM_GFX_STATUS + anim_sound 0, 0, SFX_TAIL_WHIP +.loop + anim_obj BATTLE_ANIM_OBJ_ASLEEP, 64, 80, $0 + anim_wait 40 + anim_loop 3, .loop + anim_wait 32 + anim_ret + +BattleAnim_AcidArmor: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_2Row + anim_bgeffect BATTLE_BG_EFFECT_ACID_ARMOR, $0, BG_EFFECT_USER, $8 + anim_sound 0, 0, SFX_MEGA_PUNCH + anim_wait 128 + anim_incbgeffect BATTLE_BG_EFFECT_ACID_ARMOR + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Splash: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 0, SFX_VICEGRIP + anim_call BattleAnim_TargetObj_2Row + anim_bgeffect BATTLE_BG_EFFECT_BOUNCE_DOWN, $0, BG_EFFECT_USER, $0 + anim_wait 128 + anim_incbgeffect BATTLE_BG_EFFECT_BOUNCE_DOWN + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Dig: + anim_2gfx BATTLE_ANIM_GFX_SAND, BATTLE_ANIM_GFX_HIT + anim_if_param_equal $0, .hit + anim_if_param_equal $2, .fail + anim_call BattleAnim_TargetObj_2Row + anim_bgeffect BATTLE_BG_EFFECT_DIG, $0, BG_EFFECT_USER, $1 + anim_obj BATTLE_ANIM_OBJ_DIG_PILE, 72, 104, $0 +.loop + anim_sound 0, 0, SFX_RAZOR_WIND + anim_obj BATTLE_ANIM_OBJ_DIG_SAND, 56, 104, $0 + anim_wait 16 + anim_loop 6, .loop + anim_wait 32 + anim_bgeffect BATTLE_BG_EFFECT_HIDE_MON, $0, BG_EFFECT_USER, $0 + anim_wait 8 + anim_incbgeffect BATTLE_BG_EFFECT_DIG + anim_call BattleAnim_ShowMon_0 + anim_ret + +.hit + anim_sound 0, 0, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 32 +.fail + anim_bgeffect BATTLE_BG_EFFECT_ENTER_MON, $0, BG_EFFECT_USER, $0 + anim_wait 32 + anim_ret + +BattleAnim_SandAttack: + anim_1gfx BATTLE_ANIM_GFX_SAND + anim_call BattleAnimSub_SandOrMud + anim_ret + +BattleAnim_StringShot: + anim_1gfx BATTLE_ANIM_GFX_WEB + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $2, $0 + anim_sound 6, 2, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_STRING_SHOT, 64, 80, $0 + anim_wait 4 + anim_sound 0, 1, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_STRING_SHOT, 132, 48, $1 + anim_wait 4 + anim_sound 6, 2, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_STRING_SHOT, 64, 88, $0 + anim_wait 4 + anim_sound 0, 1, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_STRING_SHOT, 132, 64, $1 + anim_wait 4 + anim_sound 6, 2, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_STRING_SHOT, 64, 84, $0 + anim_wait 4 + anim_sound 0, 1, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_STRING_SHOT, 132, 56, $2 + anim_wait 64 + anim_ret + +BattleAnim_Headbutt: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $14, $2, $0 + anim_wait 32 + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 4 + anim_sound 0, 1, SFX_HEADBUTT + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 8 + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Tackle: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 4 + anim_sound 0, 1, SFX_TACKLE + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 48, $0 + anim_wait 8 + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_BodySlam: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_2Row + anim_bgeffect BATTLE_BG_EFFECT_BOUNCE_DOWN, $0, BG_EFFECT_USER, $0 + anim_wait 32 + anim_incbgeffect BATTLE_BG_EFFECT_BOUNCE_DOWN + anim_wait 4 + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 3 + anim_sound 0, 1, SFX_TACKLE + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 48, $0 + anim_wait 6 + anim_sound 0, 1, SFX_TACKLE + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 48, $0 + anim_wait 3 + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_TakeDown: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 3 + anim_sound 0, 1, SFX_TACKLE + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 128, 56, $0 + anim_wait 6 + anim_sound 0, 1, SFX_TACKLE + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 48, $0 + anim_wait 3 + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_DoubleEdge: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $20 + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 3 + anim_sound 0, 1, SFX_TACKLE + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 128, 48, $0 + anim_wait 6 + anim_sound 0, 1, SFX_TACKLE + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 144, 48, $0 + anim_wait 3 + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Submission: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_UserObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_WOBBLE_MON, $0, BG_EFFECT_TARGET, $0 + anim_sound 0, 1, SFX_SUBMISSION + anim_wait 32 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 120, 48, $0 + anim_wait 32 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 152, 56, $0 + anim_wait 32 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 52, $0 + anim_wait 32 + anim_incbgeffect BATTLE_BG_EFFECT_WOBBLE_MON + anim_call BattleAnim_ShowMon_1 + anim_ret + +BattleAnim_Whirlwind: + anim_1gfx BATTLE_ANIM_GFX_WIND +.loop + anim_sound 0, 0, SFX_RAZOR_WIND + anim_obj BATTLE_ANIM_OBJ_GUST, 64, 112, $0 + anim_wait 6 + anim_loop 9, .loop + anim_incobj 1 + anim_incobj 2 + anim_incobj 3 + anim_incobj 4 + anim_incobj 5 + anim_incobj 6 + anim_incobj 7 + anim_incobj 8 + anim_incobj 9 + anim_sound 16, 2, SFX_WHIRLWIND + anim_wait 128 + anim_if_param_equal $0, .done + anim_bgeffect BATTLE_BG_EFFECT_REMOVE_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 64 +.done + anim_ret + +BattleAnim_Hypnosis: + anim_1gfx BATTLE_ANIM_GFX_PSYCHIC +.loop + anim_sound 6, 2, SFX_SUPERSONIC + anim_obj BATTLE_ANIM_OBJ_WAVE, 64, 88, $2 + anim_obj BATTLE_ANIM_OBJ_WAVE, 56, 80, $2 + anim_wait 8 + anim_loop 3, .loop + anim_wait 64 + anim_ret + +BattleAnim_Haze: + anim_1gfx BATTLE_ANIM_GFX_HAZE + anim_sound 0, 1, SFX_SURF +.loop + anim_obj BATTLE_ANIM_OBJ_HAZE, 48, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HAZE, 132, 16, $0 + anim_wait 12 + anim_loop 5, .loop + anim_wait 128 + anim_ret + +BattleAnim_Mist: + anim_obp0 $54 + anim_1gfx BATTLE_ANIM_GFX_HAZE + anim_sound 0, 0, SFX_SURF +.loop + anim_obj BATTLE_ANIM_OBJ_MIST, 48, 56, $0 + anim_wait 8 + anim_loop 10, .loop + anim_wait 128 + anim_ret + +BattleAnim_Smog: + anim_1gfx BATTLE_ANIM_GFX_HAZE + anim_sound 0, 1, SFX_BUBBLEBEAM +.loop + anim_obj BATTLE_ANIM_OBJ_SMOG, 132, 16, $0 + anim_wait 8 + anim_loop 10, .loop + anim_wait 128 + anim_ret + +BattleAnim_PoisonGas: + anim_1gfx BATTLE_ANIM_GFX_HAZE + anim_sound 16, 2, SFX_BUBBLEBEAM +.loop + anim_obj BATTLE_ANIM_OBJ_POISON_GAS, 44, 80, $2 + anim_wait 8 + anim_loop 10, .loop + anim_wait 128 + anim_ret + +BattleAnim_HornAttack: + anim_2gfx BATTLE_ANIM_GFX_HORN, BATTLE_ANIM_GFX_HIT + anim_obj BATTLE_ANIM_OBJ_HORN, 72, 80, $1 + anim_wait 16 + anim_sound 0, 1, SFX_HORN_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_FuryAttack: + anim_2gfx BATTLE_ANIM_GFX_HORN, BATTLE_ANIM_GFX_HIT + anim_obj BATTLE_ANIM_OBJ_HORN, 72, 72, $2 + anim_wait 8 + anim_sound 0, 1, SFX_HORN_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT, 128, 40, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_HORN, 80, 88, $2 + anim_wait 8 + anim_sound 0, 1, SFX_HORN_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT, 136, 56, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_HORN, 76, 80, $2 + anim_wait 8 + anim_sound 0, 1, SFX_HORN_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT, 132, 48, $0 + anim_wait 8 + anim_ret + +BattleAnim_HornDrill: + anim_2gfx BATTLE_ANIM_GFX_HORN, BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $80 + anim_obj BATTLE_ANIM_OBJ_HORN, 72, 80, $3 + anim_wait 8 +.loop + anim_sound 0, 1, SFX_HORN_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 132, 40, $0 + anim_wait 8 + anim_sound 0, 1, SFX_HORN_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 140, 48, $0 + anim_wait 8 + anim_sound 0, 1, SFX_HORN_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 132, 56, $0 + anim_wait 8 + anim_sound 0, 1, SFX_HORN_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 124, 48, $0 + anim_wait 8 + anim_loop 5, .loop + anim_ret + +BattleAnim_PoisonSting: + anim_2gfx BATTLE_ANIM_GFX_HORN, BATTLE_ANIM_GFX_HIT + anim_obj BATTLE_ANIM_OBJ_NEEDLE, 64, 92, $14 + anim_wait 16 + anim_sound 0, 1, SFX_POISON_STING + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL, 136, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_Twineedle: + anim_2gfx BATTLE_ANIM_GFX_HORN, BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_POISON_STING + anim_obj BATTLE_ANIM_OBJ_NEEDLE, 64, 92, $14 + anim_obj BATTLE_ANIM_OBJ_NEEDLE, 56, 84, $14 + anim_wait 16 + anim_sound 0, 1, SFX_POISON_STING + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL, 136, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL, 128, 48, $0 + anim_wait 16 + anim_ret + +BattleAnim_PinMissile: + anim_2gfx BATTLE_ANIM_GFX_HORN, BATTLE_ANIM_GFX_HIT +.loop + anim_obj BATTLE_ANIM_OBJ_NEEDLE, 64, 92, $28 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_NEEDLE, 56, 84, $28 + anim_sound 0, 1, SFX_POISON_STING + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL, 136, 56, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_NEEDLE, 52, 88, $28 + anim_sound 0, 1, SFX_POISON_STING + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL, 128, 48, $0 + anim_wait 8 + anim_sound 0, 1, SFX_POISON_STING + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL, 132, 52, $0 + anim_loop 3, .loop + anim_wait 16 + anim_ret + +BattleAnim_SpikeCannon: + anim_2gfx BATTLE_ANIM_GFX_HORN, BATTLE_ANIM_GFX_HIT +.loop + anim_obj BATTLE_ANIM_OBJ_NEEDLE, 64, 92, $18 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_NEEDLE, 56, 84, $18 + anim_sound 0, 1, SFX_POISON_STING + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL, 136, 56, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_NEEDLE, 52, 88, $18 + anim_sound 0, 1, SFX_POISON_STING + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL, 128, 48, $0 + anim_wait 8 + anim_sound 0, 1, SFX_POISON_STING + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL, 132, 52, $0 + anim_loop 3, .loop + anim_wait 16 + anim_ret + +BattleAnim_Transform: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_2Row + anim_sound 0, 0, SFX_PSYBEAM + anim_bgeffect BATTLE_BG_EFFECT_WAVE_DEFORM_MON, $0, BG_EFFECT_USER, $0 + anim_wait 48 + anim_transform + anim_incbgeffect BATTLE_BG_EFFECT_WAVE_DEFORM_MON + anim_wait 48 + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_PetalDance: + anim_sound 0, 0, SFX_MENU + anim_2gfx BATTLE_ANIM_GFX_FLOWER, BATTLE_ANIM_GFX_HIT +.loop + anim_obj BATTLE_ANIM_OBJ_PETAL_DANCE, 48, 56, $0 + anim_wait 11 + anim_loop 8, .loop + anim_wait 128 + anim_wait 64 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_Barrage: + anim_2gfx BATTLE_ANIM_GFX_EGG, BATTLE_ANIM_GFX_EXPLOSION + anim_sound 6, 2, SFX_THROW_BALL + anim_obj BATTLE_ANIM_OBJ_SLUDGE_BOMB, 64, 92, $10 + anim_wait 36 + anim_sound 0, 1, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION2, 136, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_PayDay: + anim_2gfx BATTLE_ANIM_GFX_HIT, BATTLE_ANIM_GFX_STATUS + anim_sound 0, 1, SFX_POUND + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 128, 56, $0 + anim_wait 16 + anim_sound 0, 1, SFX_PAY_DAY + anim_obj BATTLE_ANIM_OBJ_PAY_DAY, 120, 76, $1 + anim_wait 64 + anim_ret + +BattleAnim_Mimic: + anim_1gfx BATTLE_ANIM_GFX_SPEED + anim_obp0 $fc + anim_sound 63, 3, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_MIMIC, 132, 44, $0 + anim_obj BATTLE_ANIM_OBJ_MIMIC, 132, 44, $8 + anim_obj BATTLE_ANIM_OBJ_MIMIC, 132, 44, $10 + anim_obj BATTLE_ANIM_OBJ_MIMIC, 132, 44, $18 + anim_obj BATTLE_ANIM_OBJ_MIMIC, 132, 44, $20 + anim_obj BATTLE_ANIM_OBJ_MIMIC, 132, 44, $28 + anim_obj BATTLE_ANIM_OBJ_MIMIC, 132, 44, $30 + anim_obj BATTLE_ANIM_OBJ_MIMIC, 132, 44, $38 + anim_wait 128 + anim_wait 48 + anim_ret + +BattleAnim_LovelyKiss: + anim_2gfx BATTLE_ANIM_GFX_OBJECTS, BATTLE_ANIM_GFX_ANGELS + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $2, $0 + anim_obj BATTLE_ANIM_OBJ_LOVELY_KISS, 144, 40, $0 + anim_wait 32 + anim_sound 0, 1, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_HEART, 128, 40, $0 + anim_wait 40 + anim_ret + +BattleAnim_Bonemerang: + anim_2gfx BATTLE_ANIM_GFX_MISC, BATTLE_ANIM_GFX_HIT + anim_sound 6, 2, SFX_HYDRO_PUMP + anim_obj BATTLE_ANIM_OBJ_BONEMERANG, 88, 56, $1c + anim_wait 24 + anim_sound 0, 1, SFX_THRASH + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 24 + anim_ret + +BattleAnim_Swift: + anim_1gfx BATTLE_ANIM_GFX_OBJECTS + anim_sound 6, 2, SFX_GAME_FREAK_LOGO_RG + anim_obj BATTLE_ANIM_OBJ_SWIFT, 64, 88, $4 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_SWIFT, 64, 72, $4 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_SWIFT, 64, 76, $4 + anim_wait 96 + anim_ret + +BattleAnim_Crabhammer: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $40, $2, $0 + anim_wait 64 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $7 +.loop + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 56, $0 + anim_wait 12 + anim_loop 3, .loop + anim_ret + +BattleAnim_SkullBash: + anim_if_param_equal $1, BattleAnim_FocusEnergy + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $14, $2, $0 + anim_wait 32 + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $7 + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 4 +.loop + anim_sound 0, 1, SFX_HEADBUTT + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 8 + anim_loop 3, .loop + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Kinesis: + anim_2gfx BATTLE_ANIM_GFX_MISC, BATTLE_ANIM_GFX_NOISE + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_obj BATTLE_ANIM_OBJ_KINESIS, 80, 76, $0 + anim_wait 32 +.loop + anim_sound 0, 0, SFX_KINESIS + anim_obj BATTLE_ANIM_OBJ_SOUND, 64, 88, $0 + anim_wait 32 + anim_loop 3, .loop + anim_wait 64 + anim_ret + +BattleAnim_Peck: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_PECK + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL_YFIX, 128, 48, $0 + anim_wait 8 + anim_sound 0, 1, SFX_PECK + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL_YFIX, 136, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_DrillPeck: + anim_1gfx BATTLE_ANIM_GFX_HIT +.loop + anim_sound 0, 1, SFX_PECK + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL_YFIX, 124, 56, $0 + anim_wait 4 + anim_sound 0, 1, SFX_PECK + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL_YFIX, 132, 48, $0 + anim_wait 4 + anim_sound 0, 1, SFX_PECK + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL_YFIX, 140, 56, $0 + anim_wait 4 + anim_sound 0, 1, SFX_PECK + anim_obj BATTLE_ANIM_OBJ_HIT_SMALL_YFIX, 132, 64, $0 + anim_wait 4 + anim_loop 5, .loop + anim_wait 16 + anim_ret + +BattleAnim_Guillotine: + anim_1gfx BATTLE_ANIM_GFX_CUT + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $20 + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $40, $2, $0 + anim_sound 0, 1, SFX_VICEGRIP + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_LEFT, 156, 44, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_LEFT, 152, 40, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_DOWN_LEFT, 148, 36, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_UP_RIGHT, 124, 76, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_UP_RIGHT, 120, 72, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_UP_RIGHT, 116, 68, $0 + anim_obj BATTLE_ANIM_OBJ_CUT_UP_RIGHT, 120, 72, $0 + anim_wait 32 + anim_ret + +BattleAnim_Flash: + anim_1gfx BATTLE_ANIM_GFX_SPEED + anim_sound 0, 1, SFX_GAME_FREAK_LOGO_RG + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $40 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_FLASH, 136, 56, $0 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_FLASH, 136, 56, $8 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_FLASH, 136, 56, $10 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_FLASH, 136, 56, $18 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_FLASH, 136, 56, $20 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_FLASH, 136, 56, $28 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_FLASH, 136, 56, $30 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_FLASH, 136, 56, $38 + anim_wait 32 + anim_ret + +BattleAnim_Substitute: + anim_sound 0, 0, SFX_SURF + anim_if_param_equal $3, .dropsub2 + anim_if_param_equal $2, .raisesub + anim_if_param_equal $1, .dropsub + anim_1gfx BATTLE_ANIM_GFX_SMOKE + anim_bgeffect BATTLE_BG_EFFECT_REMOVE_MON, $0, BG_EFFECT_USER, $0 + anim_wait 48 + anim_raisesub + anim_obj BATTLE_ANIM_OBJ_BALL_POOF, 48, 96, $0 + anim_bgeffect BATTLE_BG_EFFECT_ENTER_MON, $0, BG_EFFECT_USER, $0 + anim_wait 32 + anim_ret + +.dropsub: + anim_bgeffect BATTLE_BG_EFFECT_REMOVE_MON, $0, BG_EFFECT_USER, $0 + anim_wait 48 + anim_dropsub + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_USER, $0 + anim_wait 32 + anim_ret + +.raisesub: + anim_bgeffect BATTLE_BG_EFFECT_REMOVE_MON, $0, BG_EFFECT_USER, $0 + anim_wait 48 + anim_raisesub + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_USER, $0 + anim_wait 32 + anim_ret + +.dropsub2: + anim_bgeffect BATTLE_BG_EFFECT_HIDE_MON, $0, BG_EFFECT_USER, $0 + anim_wait 48 + anim_dropsub + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_USER, $0 + anim_wait 32 + anim_ret + +BattleAnim_Minimize: + anim_sound 0, 0, SFX_SURF + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_2Row + anim_bgeffect BATTLE_BG_EFFECT_WAVE_DEFORM_MON, $0, BG_EFFECT_USER, $0 + anim_wait 48 + anim_minimizeopp + anim_incbgeffect BATTLE_BG_EFFECT_WAVE_DEFORM_MON + anim_wait 48 + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_SkyAttack: + anim_if_param_equal $1, BattleAnim_FocusEnergy + anim_1gfx BATTLE_ANIM_GFX_SKY_ATTACK + anim_bgeffect BATTLE_BG_EFFECT_REMOVE_MON, $0, BG_EFFECT_USER, $0 + anim_wait 32 + anim_sound 0, 0, SFX_HYPER_BEAM + anim_obj BATTLE_ANIM_OBJ_SKY_ATTACK, 48, 88, $40 + anim_wait 64 + anim_incobj 1 + anim_wait 21 + anim_sound 0, 1, SFX_HYPER_BEAM + anim_bgeffect BATTLE_BG_EFFECT_ALTERNATE_HUES, $0, $2, $0 + anim_wait 64 + anim_incobj 1 + anim_wait 32 + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_USER, $0 + anim_wait 16 + anim_ret + +BattleAnim_NightShade: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_bgp $1b + anim_obp1 $1b + anim_wait 32 + anim_call BattleAnim_UserObj_2Row + anim_bgeffect BATTLE_BG_EFFECT_NIGHT_SHADE, $0, BG_EFFECT_TARGET, $8 + anim_sound 0, 1, SFX_PSYCHIC + anim_wait 128 + anim_incbgeffect BATTLE_BG_EFFECT_NIGHT_SHADE + anim_call BattleAnim_ShowMon_1 + anim_ret + +BattleAnim_Lick: + anim_1gfx BATTLE_ANIM_GFX_WATER + anim_sound 0, 1, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_LICK, 136, 56, $0 + anim_wait 64 + anim_ret + +BattleAnim_TriAttack: + anim_3gfx BATTLE_ANIM_GFX_FIRE, BATTLE_ANIM_GFX_ICE, BATTLE_ANIM_GFX_LIGHTNING + anim_call BattleAnimSub_Fire + anim_wait 16 + anim_call BattleAnimSub_Ice + anim_wait 16 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $4 + anim_sound 0, 1, SFX_THUNDER + anim_obj BATTLE_ANIM_OBJ_THUNDER_RIGHT, 152, 68, $0 + anim_wait 16 + anim_ret + +BattleAnim_Withdraw: + anim_1gfx BATTLE_ANIM_GFX_REFLECT + anim_call BattleAnim_TargetObj_2Row + anim_bgeffect BATTLE_BG_EFFECT_WITHDRAW, $0, BG_EFFECT_USER, $50 + anim_wait 48 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_WITHDRAW, 48, 88, $0 + anim_wait 128 + anim_incobj 2 + anim_wait 1 + anim_incbgeffect BATTLE_BG_EFFECT_WITHDRAW + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Psybeam: + anim_1gfx BATTLE_ANIM_GFX_PSYCHIC + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_BGPALS_INVERTED, $0, $2, $0 +.loop + anim_sound 6, 2, SFX_PSYBEAM + anim_obj BATTLE_ANIM_OBJ_WAVE, 64, 88, $4 + anim_wait 4 + anim_loop 30, .loop + anim_wait 64 + anim_ret + +BattleAnim_DreamEater: + anim_1gfx BATTLE_ANIM_GFX_BUBBLE + anim_bgp $1b + anim_obp0 $27 + anim_call BattleAnimSub_Drain + anim_wait 128 + anim_wait 48 + anim_ret + +BattleAnim_LeechLife: + anim_1gfx BATTLE_ANIM_GFX_BUBBLE + anim_call BattleAnimSub_Drain + anim_wait 128 + anim_wait 48 + anim_ret + +BattleAnim_Harden: + anim_1gfx BATTLE_ANIM_GFX_REFLECT + anim_obp0 $0 + anim_call BattleAnim_TargetObj_1Row + anim_call BattleAnimSub_Metallic + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Psywave: + anim_1gfx BATTLE_ANIM_GFX_PSYCHIC + anim_bgeffect BATTLE_BG_EFFECT_PSYCHIC, $0, $0, $0 +.loop + anim_sound 6, 2, SFX_PSYCHIC + anim_obj BATTLE_ANIM_OBJ_WAVE, 64, 80, $2 + anim_wait 8 + anim_sound 6, 2, SFX_PSYCHIC + anim_obj BATTLE_ANIM_OBJ_WAVE, 64, 88, $3 + anim_wait 8 + anim_sound 6, 2, SFX_PSYCHIC + anim_obj BATTLE_ANIM_OBJ_WAVE, 64, 96, $4 + anim_wait 8 + anim_loop 3, .loop + anim_wait 32 + anim_incbgeffect BATTLE_BG_EFFECT_PSYCHIC + anim_wait 4 + anim_ret + +BattleAnim_Glare: + anim_1gfx BATTLE_ANIM_GFX_BEAM + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $40 + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_call BattleAnimSub_EyeBeams + anim_wait 16 + anim_ret + +BattleAnim_Thrash: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_POUND + anim_obj BATTLE_ANIM_OBJ_PALM, 120, 72, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 120, 72, $0 + anim_wait 6 + anim_sound 0, 1, SFX_THRASH + anim_obj BATTLE_ANIM_OBJ_PUNCH, 136, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 56, $0 + anim_wait 6 + anim_sound 0, 1, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 152, 40, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 152, 40, $0 + anim_wait 16 + anim_ret + +BattleAnim_Growth: + anim_bgeffect BATTLE_BG_EFFECT_WHITE_HUES, $0, $8, $0 + anim_1gfx BATTLE_ANIM_GFX_CHARGE + anim_sound 0, 0, SFX_SWORDS_DANCE + anim_obj BATTLE_ANIM_OBJ_GROWTH, 48, 108, $0 + anim_obj BATTLE_ANIM_OBJ_GROWTH, 48, 108, $8 + anim_obj BATTLE_ANIM_OBJ_GROWTH, 48, 108, $10 + anim_obj BATTLE_ANIM_OBJ_GROWTH, 48, 108, $18 + anim_obj BATTLE_ANIM_OBJ_GROWTH, 48, 108, $20 + anim_obj BATTLE_ANIM_OBJ_GROWTH, 48, 108, $28 + anim_obj BATTLE_ANIM_OBJ_GROWTH, 48, 108, $30 + anim_obj BATTLE_ANIM_OBJ_GROWTH, 48, 108, $38 + anim_wait 64 + anim_ret + +BattleAnim_Conversion: + anim_1gfx BATTLE_ANIM_GFX_EXPLOSION + anim_sound 63, 3, SFX_SHARPEN + anim_obj BATTLE_ANIM_OBJ_CONVERSION, 132, 44, $0 + anim_obj BATTLE_ANIM_OBJ_CONVERSION, 132, 44, $8 + anim_obj BATTLE_ANIM_OBJ_CONVERSION, 132, 44, $10 + anim_obj BATTLE_ANIM_OBJ_CONVERSION, 132, 44, $18 + anim_obj BATTLE_ANIM_OBJ_CONVERSION, 132, 44, $20 + anim_obj BATTLE_ANIM_OBJ_CONVERSION, 132, 44, $28 + anim_obj BATTLE_ANIM_OBJ_CONVERSION, 132, 44, $30 + anim_obj BATTLE_ANIM_OBJ_CONVERSION, 132, 44, $38 + anim_wait 128 + anim_wait 48 + anim_ret + +BattleAnim_Smokescreen: + anim_3gfx BATTLE_ANIM_GFX_HAZE, BATTLE_ANIM_GFX_EGG, BATTLE_ANIM_GFX_SMOKE + anim_sound 6, 2, SFX_THROW_BALL + anim_obj BATTLE_ANIM_OBJ_SMOKESCREEN, 64, 92, $6c + anim_wait 24 + anim_incobj 1 + anim_sound 0, 1, SFX_BALL_POOF + anim_obj BATTLE_ANIM_OBJ_BALL_POOF, 108, 70, $10 + anim_wait 8 +.loop + anim_sound 0, 1, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_SMOKE, 132, 60, $20 + anim_wait 8 + anim_loop 5, .loop + anim_wait 128 + anim_ret + +BattleAnim_Strength: + anim_2gfx BATTLE_ANIM_GFX_ROCKS, BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_Y, $10, $1, $20 + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_STRENGTH, 64, 104, $1 + anim_wait 128 + anim_incobj 1 + anim_wait 20 + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 132, 40, $0 + anim_wait 16 + anim_ret + +BattleAnim_SwordsDance: + anim_1gfx BATTLE_ANIM_GFX_WHIP + anim_sound 0, 0, SFX_SWORDS_DANCE + anim_obj BATTLE_ANIM_OBJ_SWORDS_DANCE, 48, 108, $0 + anim_obj BATTLE_ANIM_OBJ_SWORDS_DANCE, 48, 108, $d + anim_obj BATTLE_ANIM_OBJ_SWORDS_DANCE, 48, 108, $1a + anim_obj BATTLE_ANIM_OBJ_SWORDS_DANCE, 48, 108, $27 + anim_obj BATTLE_ANIM_OBJ_SWORDS_DANCE, 48, 108, $34 + anim_wait 64 + anim_ret + +BattleAnim_QuickAttack: + anim_2gfx BATTLE_ANIM_GFX_SPEED, BATTLE_ANIM_GFX_HIT + anim_sound 0, 0, SFX_MENU + anim_bgeffect BATTLE_BG_EFFECT_HIDE_MON, $0, BG_EFFECT_USER, $0 + anim_obj BATTLE_ANIM_OBJ_SPEED_LINE, 24, 88, $2 + anim_obj BATTLE_ANIM_OBJ_SPEED_LINE, 32, 88, $1 + anim_obj BATTLE_ANIM_OBJ_SPEED_LINE, 40, 88, $0 + anim_obj BATTLE_ANIM_OBJ_SPEED_LINE, 48, 88, $80 + anim_obj BATTLE_ANIM_OBJ_SPEED_LINE, 56, 88, $81 + anim_obj BATTLE_ANIM_OBJ_SPEED_LINE, 64, 88, $82 + anim_wait 12 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 8 + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_USER, $0 + anim_wait 16 + anim_ret + +BattleAnim_Meditate: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_sound 0, 0, SFX_PSYBEAM + anim_bgeffect BATTLE_BG_EFFECT_WAVE_DEFORM_MON, $0, BG_EFFECT_USER, $0 + anim_wait 48 + anim_incbgeffect BATTLE_BG_EFFECT_WAVE_DEFORM_MON + anim_wait 48 + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Sharpen: + anim_1gfx BATTLE_ANIM_GFX_SHAPES + anim_obp0 $e4 + anim_call BattleAnim_TargetObj_1Row + anim_sound 0, 0, SFX_SHARPEN + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING, $0, BG_EFFECT_USER, $40 + anim_obj BATTLE_ANIM_OBJ_SHARPEN, 48, 88, $0 + anim_wait 128 + anim_incobj 2 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_DefenseCurl: + anim_1gfx BATTLE_ANIM_GFX_SHAPES + anim_obp0 $e4 + anim_call BattleAnim_TargetObj_1Row + anim_sound 0, 0, SFX_SHARPEN + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING, $0, BG_EFFECT_USER, $40 + anim_obj BATTLE_ANIM_OBJ_DEFENSE_CURL, 48, 88, $0 + anim_wait 128 + anim_incobj 2 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_SeismicToss: + anim_2gfx BATTLE_ANIM_GFX_GLOBE, BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_Y, $10, $1, $20 + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_SEISMIC_TOSS, 64, 104, $1 + anim_wait 128 + anim_incobj 1 + anim_wait 20 + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 132, 40, $0 + anim_wait 16 + anim_ret + +BattleAnim_Rage: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING, $0, BG_EFFECT_USER, $20 + anim_wait 72 + anim_incbgeffect BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_sound 0, 1, SFX_THRASH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 120, 72, $0 + anim_wait 6 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 56, $0 + anim_wait 6 + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 152, 40, $0 + anim_wait 16 + anim_ret + +BattleAnim_Agility: + anim_1gfx BATTLE_ANIM_GFX_WIND + anim_obp0 $fc + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING, $0, BG_EFFECT_USER, $40 + anim_obj BATTLE_ANIM_OBJ_AGILITY, 8, 24, $10 + anim_obj BATTLE_ANIM_OBJ_AGILITY, 8, 48, $2 + anim_obj BATTLE_ANIM_OBJ_AGILITY, 8, 88, $8 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_AGILITY, 8, 32, $6 + anim_obj BATTLE_ANIM_OBJ_AGILITY, 8, 56, $c + anim_obj BATTLE_ANIM_OBJ_AGILITY, 8, 80, $4 + anim_obj BATTLE_ANIM_OBJ_AGILITY, 8, 104, $e +.loop + anim_sound 0, 0, SFX_RAZOR_WIND + anim_wait 4 + anim_loop 18, .loop + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_BoneClub: + anim_2gfx BATTLE_ANIM_GFX_HIT, BATTLE_ANIM_GFX_MISC + anim_obj BATTLE_ANIM_OBJ_BONE_CLUB, 64, 88, $2 + anim_wait 32 + anim_sound 0, 1, SFX_BONE_CLUB + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_Barrier: + anim_1gfx BATTLE_ANIM_GFX_REFLECT + anim_battlergfx_2row + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_wait 8 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_SCREEN, 72, 80, $0 + anim_wait 32 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_SCREEN, 72, 80, $0 + anim_wait 32 +; This whole section was cut from the final game. + anim_bgeffect BATTLE_BG_EFFECT_BATTLEROBJ_1ROW, $0, $0, $0 + anim_wait 6 + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING, $0, $1, $40 + anim_wait 72 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Waterfall: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 16 + anim_call BattleAnim_ShowMon_0 + anim_sound 0, 1, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 3 + anim_sound 0, 1, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 48, $0 + anim_wait 3 + anim_sound 0, 1, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 40, $0 + anim_wait 3 + anim_sound 0, 1, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 32, $0 + anim_wait 3 + anim_sound 0, 1, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 24, $0 + anim_wait 8 + anim_ret + +BattleAnim_PsychicM: + anim_1gfx BATTLE_ANIM_GFX_PSYCHIC + anim_bgeffect BATTLE_BG_EFFECT_ALTERNATE_HUES, $0, $2, $0 + anim_bgeffect BATTLE_BG_EFFECT_PSYCHIC, $0, $0, $0 +.loop + anim_sound 6, 2, SFX_PSYCHIC + anim_obj BATTLE_ANIM_OBJ_WAVE, 64, 88, $2 + anim_wait 8 + anim_loop 10, .loop + anim_wait 128 + anim_incbgeffect BATTLE_BG_EFFECT_PSYCHIC + anim_wait 4 + anim_ret + +BattleAnim_Sludge: + anim_1gfx BATTLE_ANIM_GFX_POISON + anim_call BattleAnimSub_Sludge + anim_wait 64 + anim_ret + +BattleAnim_Toxic: + anim_1gfx BATTLE_ANIM_GFX_POISON + anim_bgeffect BATTLE_BG_EFFECT_BLACK_HUES, $0, $8, $0 + anim_call BattleAnimSub_Acid + anim_wait 32 + anim_call BattleAnimSub_Sludge + anim_wait 64 + anim_ret + +BattleAnim_Metronome: + anim_2gfx BATTLE_ANIM_GFX_MISC, BATTLE_ANIM_GFX_SPEED + anim_sound 0, 0, SFX_GAME_FREAK_LOGO_RG + anim_obj BATTLE_ANIM_OBJ_METRONOME_HAND, 72, 88, $0 +.loop + anim_obj BATTLE_ANIM_OBJ_METRONOME_SPARKLE, 72, 80, $0 + anim_wait 8 + anim_loop 5, .loop + anim_wait 48 + anim_ret + +BattleAnim_Counter: + anim_1gfx BATTLE_ANIM_GFX_HIT +.loop + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_sound 0, 1, SFX_POUND + anim_obj BATTLE_ANIM_OBJ_PALM, 120, 72, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 120, 72, $0 + anim_wait 6 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_PUNCH, 136, 40, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 40, $0 + anim_wait 6 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_sound 0, 1, SFX_MEGA_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 152, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 152, 56, $0 + anim_wait 6 + anim_loop 3, .loop + anim_wait 16 + anim_ret + +BattleAnim_LowKick: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_sound 0, 1, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 124, 64, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 124, 64, $0 + anim_wait 6 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_sound 0, 1, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 132, 64, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 132, 64, $0 + anim_wait 6 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $2 + anim_sound 0, 1, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 140, 64, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 140, 64, $0 + anim_wait 16 + anim_ret + +BattleAnim_WingAttack: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_WING_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 148, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 116, 56, $0 + anim_wait 6 + anim_sound 0, 1, SFX_WING_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 120, 56, $0 + anim_wait 6 + anim_sound 0, 1, SFX_WING_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 140, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 124, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_Slam: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_WING_ATTACK + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $7 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 124, 40, $0 + anim_wait 16 + anim_ret + +BattleAnim_Disable: + anim_2gfx BATTLE_ANIM_GFX_LIGHTNING, BATTLE_ANIM_GFX_STATUS + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_obj BATTLE_ANIM_OBJ_DISABLE, 132, 56, $0 + anim_wait 16 + anim_sound 0, 1, SFX_BIND + anim_obj BATTLE_ANIM_OBJ_PARALYZED, 104, 56, $42 + anim_obj BATTLE_ANIM_OBJ_PARALYZED, 160, 56, $c2 + anim_wait 128 + anim_ret + +BattleAnim_TailWhip: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_sound 0, 0, SFX_TAIL_WHIP + anim_bgeffect BATTLE_BG_EFFECT_WOBBLE_MON, $0, BG_EFFECT_USER, $0 + anim_wait 32 + anim_incbgeffect BATTLE_BG_EFFECT_WOBBLE_MON + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Struggle: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 1, SFX_POUND + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_Sketch: + anim_1gfx BATTLE_ANIM_GFX_OBJECTS + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING, $0, BG_EFFECT_USER, $20 + anim_sound 0, 0, SFX_SHARPEN + anim_obj BATTLE_ANIM_OBJ_SKETCH, 72, 80, $0 + anim_wait 80 + anim_incbgeffect BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_wait 1 + anim_ret + +BattleAnim_TripleKick: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_if_param_equal $1, .alternate1 + anim_if_param_equal $2, .alternate2 + anim_sound 0, 1, SFX_MEGA_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 144, 48, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 48, $0 + anim_wait 8 + anim_ret + +.alternate1: + anim_sound 0, 1, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 120, 64, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 120, 64, $0 + anim_wait 8 + anim_ret + +.alternate2: + anim_sound 0, 1, SFX_DOUBLE_KICK + anim_obj BATTLE_ANIM_OBJ_KICK, 132, 32, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 132, 32, $0 + anim_wait 8 + anim_ret + +BattleAnim_Thief: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 16 + anim_sound 0, 1, SFX_TACKLE + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 128, 48, $0 + anim_wait 16 + anim_call BattleAnim_ShowMon_0 + anim_wait 1 + anim_1gfx BATTLE_ANIM_GFX_STATUS + anim_sound 0, 1, SFX_PAY_DAY + anim_obj BATTLE_ANIM_OBJ_THIEF, 120, 76, $1 + anim_wait 64 + anim_ret + +BattleAnim_SpiderWeb: + anim_1gfx BATTLE_ANIM_GFX_WEB + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $2, $0 + anim_obj BATTLE_ANIM_OBJ_SPIDER_WEB, 132, 48, $0 + anim_sound 6, 2, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_STRING_SHOT, 64, 80, $0 + anim_wait 4 + anim_sound 6, 2, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_STRING_SHOT, 64, 88, $0 + anim_wait 4 + anim_sound 6, 2, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_STRING_SHOT, 64, 84, $0 + anim_wait 64 + anim_ret + +BattleAnim_MindReader: + anim_1gfx BATTLE_ANIM_GFX_MISC +.loop + anim_sound 0, 1, SFX_SWITCH_POKEMON + anim_obj BATTLE_ANIM_OBJ_MIND_READER, 132, 48, $3 + anim_obj BATTLE_ANIM_OBJ_MIND_READER, 132, 48, $12 + anim_obj BATTLE_ANIM_OBJ_MIND_READER, 132, 48, $20 + anim_obj BATTLE_ANIM_OBJ_MIND_READER, 132, 48, $31 + anim_wait 16 + anim_loop 2, .loop + anim_wait 32 + anim_ret + +BattleAnim_Nightmare: + anim_1gfx BATTLE_ANIM_GFX_ANGELS + anim_bgp $1b + anim_obp0 $f + anim_obj BATTLE_ANIM_OBJ_NIGHTMARE, 132, 40, $0 + anim_obj BATTLE_ANIM_OBJ_NIGHTMARE, 132, 40, $a0 +.loop + anim_sound 0, 1, SFX_POISON + anim_wait 16 + anim_loop 6, .loop + anim_ret + +BattleAnim_FlameWheel: + anim_1gfx BATTLE_ANIM_GFX_FIRE +.loop + anim_sound 0, 0, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_FLAME_WHEEL, 48, 96, $0 + anim_wait 6 + anim_loop 8, .loop + anim_wait 96 + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 4 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $6 + anim_sound 0, 1, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_FIRE_BLAST, 136, 48, $1 + anim_obj BATTLE_ANIM_OBJ_FIRE_BLAST, 136, 48, $4 + anim_obj BATTLE_ANIM_OBJ_FIRE_BLAST, 136, 48, $5 + anim_wait 8 + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 3 + anim_incobj 9 + anim_wait 8 + anim_ret + +BattleAnim_Snore: + anim_2gfx BATTLE_ANIM_GFX_STATUS, BATTLE_ANIM_GFX_NOISE + anim_obj BATTLE_ANIM_OBJ_ASLEEP, 64, 80, $0 + anim_wait 32 + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $60, $2, $0 +.loop + anim_sound 0, 0, SFX_STRENGTH + anim_call BattleAnimSub_Sound + anim_wait 16 + anim_loop 2, .loop + anim_wait 8 + anim_ret + +BattleAnim_NailDown: + anim_2gfx BATTLE_ANIM_GFX_HIT, BATTLE_ANIM_GFX_OBJECTS + anim_obj BATTLE_ANIM_OBJ_NAIL_DOWN, 68, 72, $0 + anim_wait 32 + anim_incobj 1 + anim_wait 12 + anim_sound 0, 0, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT, 44, 96, $0 + anim_wait 16 + anim_ret + +BattleAnim_Flail: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_sound 0, 0, SFX_SUBMISSION + anim_bgeffect BATTLE_BG_EFFECT_FLAIL, $0, BG_EFFECT_USER, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 120, 48, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 152, 48, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 48, $0 + anim_wait 8 + anim_incbgeffect BATTLE_BG_EFFECT_FLAIL + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Conversion2: + anim_1gfx BATTLE_ANIM_GFX_EXPLOSION + anim_bgeffect BATTLE_BG_EFFECT_ALTERNATE_HUES, $0, $2, $0 + anim_sound 63, 3, SFX_SHARPEN + anim_obj BATTLE_ANIM_OBJ_CONVERSION2, 132, 44, $0 + anim_obj BATTLE_ANIM_OBJ_CONVERSION2, 132, 44, $8 + anim_obj BATTLE_ANIM_OBJ_CONVERSION2, 132, 44, $10 + anim_obj BATTLE_ANIM_OBJ_CONVERSION2, 132, 44, $18 + anim_obj BATTLE_ANIM_OBJ_CONVERSION2, 132, 44, $20 + anim_obj BATTLE_ANIM_OBJ_CONVERSION2, 132, 44, $28 + anim_obj BATTLE_ANIM_OBJ_CONVERSION2, 132, 44, $30 + anim_obj BATTLE_ANIM_OBJ_CONVERSION2, 132, 44, $38 + anim_wait 128 + anim_ret + +BattleAnim_CoinHurl: + anim_2gfx BATTLE_ANIM_GFX_STATUS, BATTLE_ANIM_GFX_HIT + anim_sound 6, 2, SFX_PAY_DAY +.loop + anim_if_param_and $1, .obj1 + anim_obj BATTLE_ANIM_OBJ_COIN_HURL, 64, 92, $4 + anim_wait 16 + anim_obj BATTLE_ANIM_OBJ_HIT, 132, 58, $4 + anim_jump .okay + +.obj1 + anim_obj BATTLE_ANIM_OBJ_COIN_HURL, 64, 80, $4 + anim_wait 16 + anim_obj BATTLE_ANIM_OBJ_HIT, 132, 46, $4 +.okay + anim_wait 6 + anim_jumpuntil .loop + anim_ret + +BattleAnim_CottonSpore: + anim_obp0 $54 + anim_1gfx BATTLE_ANIM_GFX_MISC +.loop + anim_sound 0, 1, SFX_POWDER + anim_obj BATTLE_ANIM_OBJ_COTTON_SPORE, 132, 32, $0 + anim_wait 8 + anim_loop 5, .loop +.loop2 + anim_sound 0, 1, SFX_POWDER + anim_wait 8 + anim_loop 16, .loop2 + anim_ret + +BattleAnim_Reversal: + anim_2gfx BATTLE_ANIM_GFX_SHINE, BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $0, $0 + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT, 112, 64, $0 + anim_wait 2 + anim_sound 0, 1, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_FORESIGHT, 120, 56, $0 + anim_wait 2 + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT, 128, 56, $0 + anim_wait 2 + anim_sound 0, 1, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_FORESIGHT, 136, 48, $0 + anim_wait 2 + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT, 144, 48, $0 + anim_wait 2 + anim_sound 0, 1, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_FORESIGHT, 152, 40, $0 + anim_wait 24 + anim_ret + +BattleAnim_Spite: + anim_1gfx BATTLE_ANIM_GFX_ANGELS + anim_obj BATTLE_ANIM_OBJ_SPITE, 132, 16, $0 +.loop + anim_sound 0, 1, SFX_BUBBLEBEAM + anim_wait 32 + anim_loop 3, .loop + anim_wait 32 + anim_ret + +BattleAnim_PowderSnow: + anim_1gfx BATTLE_ANIM_GFX_ICE +.loop + anim_sound 6, 2, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_POWDER_SNOW, 64, 88, $23 + anim_wait 2 + anim_sound 6, 2, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_POWDER_SNOW, 64, 80, $24 + anim_wait 2 + anim_sound 6, 2, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_POWDER_SNOW, 64, 96, $23 + anim_wait 2 + anim_loop 2, .loop + anim_bgeffect BATTLE_BG_EFFECT_WHITE_HUES, $0, $8, $0 + anim_wait 40 + anim_call BattleAnimSub_Ice + anim_wait 32 + anim_ret + +BattleAnim_Protect: + anim_1gfx BATTLE_ANIM_GFX_OBJECTS + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $2, $0 + anim_obj BATTLE_ANIM_OBJ_PROTECT, 80, 80, $0 + anim_obj BATTLE_ANIM_OBJ_PROTECT, 80, 80, $d + anim_obj BATTLE_ANIM_OBJ_PROTECT, 80, 80, $1a + anim_obj BATTLE_ANIM_OBJ_PROTECT, 80, 80, $27 + anim_obj BATTLE_ANIM_OBJ_PROTECT, 80, 80, $34 +.loop + anim_sound 0, 0, SFX_SHINE + anim_wait 4 + anim_loop 32, .loop + anim_ret + +BattleAnim_MachPunch: + anim_2gfx BATTLE_ANIM_GFX_SPEED, BATTLE_ANIM_GFX_HIT + anim_bgeffect BATTLE_BG_EFFECT_HIDE_MON, $0, BG_EFFECT_USER, $0 + anim_sound 0, 0, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_SPEED_LINE, 24, 88, $2 + anim_obj BATTLE_ANIM_OBJ_SPEED_LINE, 32, 88, $1 + anim_obj BATTLE_ANIM_OBJ_SPEED_LINE, 40, 88, $0 + anim_obj BATTLE_ANIM_OBJ_SPEED_LINE, 48, 88, $80 + anim_obj BATTLE_ANIM_OBJ_SPEED_LINE, 56, 88, $81 + anim_obj BATTLE_ANIM_OBJ_SPEED_LINE, 64, 88, $82 + anim_wait 12 + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_PUNCH, 136, 56, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 8 + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_USER, $0 + anim_wait 16 + anim_ret + +BattleAnim_ScaryFace: + anim_1gfx BATTLE_ANIM_GFX_BEAM + anim_bgeffect BATTLE_BG_EFFECT_ALTERNATE_HUES, $0, $2, $0 + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_call BattleAnimSub_EyeBeams + anim_wait 64 + anim_ret + +BattleAnim_FaintAttack: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_WHITE_WAIT_FADE_BACK, $0, BG_EFFECT_USER, $80 + anim_wait 96 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT, 120, 32, $0 + anim_wait 8 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT, 152, 40, $0 + anim_wait 8 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT, 136, 48, $0 + anim_wait 32 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_WHITE_WAIT_FADE_BACK + anim_call BattleAnim_ShowMon_0 + anim_wait 4 + anim_ret + +BattleAnim_SweetKiss: + anim_2gfx BATTLE_ANIM_GFX_OBJECTS, BATTLE_ANIM_GFX_ANGELS + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $2, $0 + anim_obj BATTLE_ANIM_OBJ_SWEET_KISS, 104, 40, $0 + anim_wait 32 + anim_sound 0, 1, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_HEART, 120, 40, $0 + anim_wait 40 + anim_ret + +BattleAnim_BellyDrum: + anim_2gfx BATTLE_ANIM_GFX_HIT, BATTLE_ANIM_GFX_NOISE + anim_sound 0, 0, SFX_BELLY_DRUM + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_HAND, 64, 104, $0 + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE, 64, 92, $f8 + anim_wait 24 + anim_sound 0, 0, SFX_BELLY_DRUM + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_HAND, 64, 104, $0 + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE, 64, 92, $f8 + anim_wait 24 + anim_sound 0, 0, SFX_BELLY_DRUM + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_HAND, 64, 104, $0 + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE, 64, 92, $f8 + anim_wait 12 + anim_sound 0, 0, SFX_BELLY_DRUM + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_HAND, 64, 104, $0 + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE, 64, 92, $f8 + anim_wait 12 + anim_sound 0, 0, SFX_BELLY_DRUM + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_HAND, 64, 104, $0 + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE, 64, 92, $f8 + anim_wait 24 + anim_sound 0, 0, SFX_BELLY_DRUM + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_HAND, 64, 104, $0 + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE, 64, 92, $f8 + anim_wait 12 + anim_sound 0, 0, SFX_BELLY_DRUM + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_HAND, 64, 104, $0 + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE, 64, 92, $f8 + anim_wait 12 + anim_sound 0, 0, SFX_BELLY_DRUM + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_HAND, 64, 104, $0 + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE, 64, 92, $f8 + anim_wait 12 + anim_sound 0, 0, SFX_BELLY_DRUM + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_HAND, 64, 104, $0 + anim_obj BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE, 64, 92, $f8 + anim_wait 12 + anim_ret + +BattleAnim_SludgeBomb: + anim_2gfx BATTLE_ANIM_GFX_EGG, BATTLE_ANIM_GFX_POISON + anim_bgeffect BATTLE_BG_EFFECT_BLACK_HUES, $0, $8, $0 + anim_sound 6, 2, SFX_THROW_BALL + anim_obj BATTLE_ANIM_OBJ_SLUDGE_BOMB, 64, 92, $10 + anim_wait 36 + anim_call BattleAnimSub_Sludge + anim_wait 64 + anim_ret + +BattleAnim_MudSlap: + anim_1gfx BATTLE_ANIM_GFX_SAND + anim_obp0 $fc + anim_call BattleAnimSub_SandOrMud + anim_ret + +BattleAnim_Octazooka: + anim_3gfx BATTLE_ANIM_GFX_HAZE, BATTLE_ANIM_GFX_EGG, BATTLE_ANIM_GFX_SMOKE + anim_sound 6, 2, SFX_THROW_BALL + anim_obj BATTLE_ANIM_OBJ_OCTAZOOKA, 64, 92, $4 + anim_wait 16 + anim_sound 0, 1, SFX_BALL_POOF + anim_obj BATTLE_ANIM_OBJ_BALL_POOF, 132, 56, $10 + anim_wait 8 + anim_if_param_equal $0, .done +.loop + anim_sound 0, 1, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_SMOKE, 132, 60, $20 + anim_wait 8 + anim_loop 5, .loop + anim_wait 128 +.done + anim_ret + +BattleAnim_Spikes: + anim_1gfx BATTLE_ANIM_GFX_MISC + anim_sound 6, 2, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_SPIKES, 48, 88, $20 + anim_wait 8 + anim_sound 6, 2, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_SPIKES, 48, 88, $30 + anim_wait 8 + anim_sound 6, 2, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_SPIKES, 48, 88, $28 + anim_wait 64 + anim_ret + +BattleAnim_ZapCannon: + anim_2gfx BATTLE_ANIM_GFX_LIGHTNING, BATTLE_ANIM_GFX_EXPLOSION + anim_bgp $1b + anim_obp0 $30 + anim_sound 6, 2, SFX_THUNDERSHOCK + anim_obj BATTLE_ANIM_OBJ_ZAP_CANNON, 64, 92, $2 + anim_wait 40 + anim_sound 0, 1, SFX_THUNDERSHOCK + anim_obj BATTLE_ANIM_OBJ_THUNDERBOLT_BALL, 136, 56, $2 + anim_wait 16 + anim_obj BATTLE_ANIM_OBJ_SPARKS_CIRCLE_BIG, 136, 56, $0 + anim_wait 128 + anim_ret + +BattleAnim_Foresight: + anim_1gfx BATTLE_ANIM_GFX_SHINE + anim_call BattleAnim_UserObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $0, $0 + anim_sound 0, 1, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_FORESIGHT, 132, 40, $0 + anim_wait 24 + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_BLACK_REPEATING, $0, BG_EFFECT_TARGET, $40 + anim_wait 64 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_BLACK_REPEATING + anim_call BattleAnim_ShowMon_1 + anim_wait 8 + anim_ret + +BattleAnim_DestinyBond: + anim_1gfx BATTLE_ANIM_GFX_ANGELS + anim_bgp $1b + anim_obp0 $0 + anim_if_param_equal $1, .fainted + anim_sound 6, 2, SFX_WHIRLWIND + anim_obj BATTLE_ANIM_OBJ_DESTINY_BOND, 44, 120, $2 + anim_wait 128 + anim_ret + +.fainted: + anim_obj BATTLE_ANIM_OBJ_DESTINY_BOND, 132, 76, $0 + anim_sound 0, 1, SFX_KINESIS + anim_bgeffect BATTLE_BG_EFFECT_RETURN_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 32 + anim_ret + +BattleAnim_PerishSong: + anim_1gfx BATTLE_ANIM_GFX_NOISE + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_bgeffect BATTLE_BG_EFFECT_ALTERNATE_HUES, $0, $2, $0 + anim_obj BATTLE_ANIM_OBJ_PERISH_SONG, 88, 0, $0 + anim_obj BATTLE_ANIM_OBJ_PERISH_SONG, 88, 0, $8 + anim_obj BATTLE_ANIM_OBJ_PERISH_SONG, 88, 0, $10 + anim_obj BATTLE_ANIM_OBJ_PERISH_SONG, 88, 0, $18 + anim_obj BATTLE_ANIM_OBJ_PERISH_SONG, 88, 0, $20 + anim_obj BATTLE_ANIM_OBJ_PERISH_SONG, 88, 0, $28 + anim_obj BATTLE_ANIM_OBJ_PERISH_SONG, 88, 0, $30 + anim_obj BATTLE_ANIM_OBJ_PERISH_SONG, 88, 0, $38 + anim_wait 112 + anim_ret + +BattleAnim_Synchronize: + anim_1gfx BATTLE_ANIM_GFX_SPEED + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_bgeffect BATTLE_BG_EFFECT_ALTERNATE_HUES, $0, $2, $0 + anim_battlergfx_1row + anim_bgeffect BATTLE_BG_EFFECT_BATTLEROBJ_2ROW, $0, BG_EFFECT_TARGET, $0 + anim_wait 6 + anim_sound 0, 0, SFX_PSYCHIC + anim_bgeffect BATTLE_BG_EFFECT_NIGHT_SHADE, $0, BG_EFFECT_USER, $8 +.loop + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_SHOOTING_SPARKLE, 64, 88, $4 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_SHOOTING_SPARKLE, 64, 80, $4 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_SHOOTING_SPARKLE, 64, 96, $4 + anim_wait 8 + anim_loop 2, .loop + anim_incbgeffect BATTLE_BG_EFFECT_NIGHT_SHADE + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 3 + anim_incobj 1 + anim_wait 16 + anim_bgeffect BATTLE_BG_EFFECT_BATTLEROBJ_2ROW, $0, BG_EFFECT_USER, $0 + anim_wait 6 + anim_sound 0, 1, SFX_PSYCHIC + anim_bgeffect BATTLE_BG_EFFECT_NIGHT_SHADE, $0, BG_EFFECT_TARGET, $8 + anim_wait 64 + anim_incbgeffect BATTLE_BG_EFFECT_NIGHT_SHADE + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_USER, $0 + anim_wait 3 + anim_incobj 8 + anim_wait 1 + anim_ret + +BattleAnim_Detect: + anim_1gfx BATTLE_ANIM_GFX_SHINE + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $0, $0 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_FORESIGHT, 64, 88, $0 + anim_wait 24 + anim_ret + +BattleAnim_BoneRush: + anim_2gfx BATTLE_ANIM_GFX_HIT, BATTLE_ANIM_GFX_MISC + anim_sound 0, 1, SFX_BONE_CLUB + anim_obj BATTLE_ANIM_OBJ_BONE_RUSH, 132, 56, $2 + anim_wait 16 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 120, 48, $0 + anim_wait 16 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 64, $0 + anim_wait 16 + anim_ret + +BattleAnim_LockOn: + anim_1gfx BATTLE_ANIM_GFX_MISC +.loop + anim_sound 0, 1, SFX_SWITCH_POKEMON + anim_obj BATTLE_ANIM_OBJ_LOCK_ON, 132, 48, $3 + anim_obj BATTLE_ANIM_OBJ_LOCK_ON, 132, 48, $12 + anim_obj BATTLE_ANIM_OBJ_LOCK_ON, 132, 48, $20 + anim_obj BATTLE_ANIM_OBJ_LOCK_ON, 132, 48, $31 + anim_wait 16 + anim_loop 2, .loop + anim_wait 32 + anim_ret + +BattleAnim_Outrage: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING, $0, BG_EFFECT_USER, $20 + anim_wait 72 + anim_incbgeffect BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $6 + anim_sound 0, 1, SFX_THRASH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 120, 72, $0 + anim_wait 6 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 56, $0 + anim_wait 6 + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 152, 40, $0 + anim_wait 16 + anim_ret + +BattleAnim_Sandstorm: + anim_1gfx BATTLE_ANIM_GFX_POWDER +.loop + anim_sound 6, 3, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_SANDSTORM, 64, 88, $63 + anim_wait 2 + anim_sound 6, 3, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_SANDSTORM, 64, 80, $64 + anim_wait 2 + anim_sound 6, 3, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_SANDSTORM, 64, 96, $63 + anim_wait 2 + anim_loop 3, .loop +.loop2 + anim_sound 0, 1, SFX_MENU + anim_wait 8 + anim_loop 24, .loop2 + anim_wait 16 + anim_ret + +BattleAnim_GigaDrain: + anim_2gfx BATTLE_ANIM_GFX_BUBBLE, BATTLE_ANIM_GFX_CHARGE + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_FADE_MONS_TO_BLACK_REPEATING, $0, BG_EFFECT_TARGET, $10 + anim_call BattleAnimSub_Drain + anim_wait 48 + anim_wait 128 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MONS_TO_BLACK_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_wait 1 + anim_1gfx BATTLE_ANIM_GFX_SHINE + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $0, $0 +.loop + anim_sound 0, 0, SFX_GAME_FREAK_LOGO_RG + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 24, 64, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 56, 104, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 24, 104, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 56, 64, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 40, 84, $0 + anim_wait 5 + anim_loop 2, .loop + anim_wait 32 + anim_ret + +BattleAnim_Endure: + anim_1gfx BATTLE_ANIM_GFX_SPEED + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING, $0, BG_EFFECT_USER, $20 + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $2, $0 +.loop + anim_sound 0, 0, SFX_SWORDS_DANCE + anim_obj BATTLE_ANIM_OBJ_FOCUS, 44, 108, $6 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FOCUS, 36, 108, $6 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FOCUS, 52, 108, $8 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FOCUS, 28, 108, $8 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FOCUS, 60, 108, $6 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FOCUS, 20, 108, $8 + anim_wait 2 + anim_obj BATTLE_ANIM_OBJ_FOCUS, 68, 108, $8 + anim_wait 2 + anim_loop 5, .loop + anim_wait 8 + anim_incbgeffect BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Charm: + anim_1gfx BATTLE_ANIM_GFX_OBJECTS + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_WOBBLE_MON, $0, BG_EFFECT_USER, $0 + anim_sound 0, 0, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_HEART, 64, 80, $0 + anim_wait 32 + anim_incbgeffect BATTLE_BG_EFFECT_WOBBLE_MON + anim_call BattleAnim_ShowMon_0 + anim_wait 4 + anim_ret + +BattleAnim_Rollout: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_sound 0, 0, SFX_EMBER + anim_call BattleAnim_TargetObj_2Row + anim_bgeffect BATTLE_BG_EFFECT_ROLLOUT, $60, $1, $1 + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 4 + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG, 136, 40, $0 + anim_wait 8 + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_FalseSwipe: + anim_2gfx BATTLE_ANIM_GFX_SHINE, BATTLE_ANIM_GFX_CUT + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $0, $0 + anim_sound 0, 1, SFX_CUT + anim_obj BATTLE_ANIM_OBJ_CUT_LONG_DOWN_LEFT, 152, 40, $0 + anim_wait 4 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 136, 40, $0 + anim_wait 32 + anim_ret + +BattleAnim_Swagger: + anim_2gfx BATTLE_ANIM_GFX_MISC, BATTLE_ANIM_GFX_WIND +.loop + anim_sound 0, 0, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_SWAGGER, 72, 88, $44 + anim_wait 32 + anim_loop 2, .loop + anim_wait 32 + anim_obj BATTLE_ANIM_OBJ_ANGER, 104, 40, $0 + anim_wait 40 + anim_ret + +BattleAnim_MilkDrink: + anim_2gfx BATTLE_ANIM_GFX_MISC, BATTLE_ANIM_GFX_BUBBLE + anim_call BattleAnim_TargetObj_1Row + anim_obj BATTLE_ANIM_OBJ_MILK_DRINK, 74, 104, $0 + anim_wait 16 + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING, $0, BG_EFFECT_USER, $40 + anim_sound 0, 0, SFX_GAME_FREAK_LOGO_RG +.loop + anim_obj BATTLE_ANIM_OBJ_RECOVER, 44, 88, $20 + anim_wait 8 + anim_loop 8, .loop + anim_wait 128 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Spark: + anim_2gfx BATTLE_ANIM_GFX_LIGHTNING, BATTLE_ANIM_GFX_EXPLOSION + anim_sound 0, 0, SFX_THUNDERSHOCK + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $2, $7 + anim_obj BATTLE_ANIM_OBJ_THUNDER_WAVE, 48, 92, $0 + anim_wait 24 + anim_setobj $1, $3 + anim_wait 1 + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 16 + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 3 + anim_incobj 2 + anim_wait 1 + anim_sound 0, 1, SFX_THUNDERSHOCK + anim_obj BATTLE_ANIM_OBJ_THUNDERBOLT_BALL, 136, 56, $2 + anim_obj BATTLE_ANIM_OBJ_SPARKS_CIRCLE, 136, 56, $0 + anim_wait 32 + anim_ret + +BattleAnim_FuryCutter: + anim_1gfx BATTLE_ANIM_GFX_CUT +.loop + anim_sound 0, 1, SFX_CUT + anim_if_param_and %00000001, .obj1 + anim_obj BATTLE_ANIM_OBJ_CUT_LONG_DOWN_LEFT, 152, 40, $0 + anim_jump .okay + +.obj1 + anim_obj BATTLE_ANIM_OBJ_CUT_LONG_DOWN_RIGHT, 112, 40, $0 +.okay + anim_wait 16 + anim_jumpuntil .loop + anim_ret + +BattleAnim_SteelWing: + anim_1gfx BATTLE_ANIM_GFX_REFLECT + anim_obp0 $0 + anim_call BattleAnim_TargetObj_1Row + anim_call BattleAnimSub_Metallic + anim_call BattleAnim_ShowMon_0 + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_resetobp0 + anim_sound 0, 1, SFX_WING_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 148, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 116, 56, $0 + anim_wait 6 + anim_sound 0, 1, SFX_WING_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 120, 56, $0 + anim_wait 6 + anim_sound 0, 1, SFX_WING_ATTACK + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 140, 56, $0 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 124, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_Stalker: + anim_1gfx BATTLE_ANIM_GFX_PSYCHIC + anim_obp0 $e0 + anim_sound 0, 1, SFX_BUBBLEBEAM + anim_obj BATTLE_ANIM_OBJ_STALKER, 148, 32, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_STALKER, 116, 64, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_STALKER, 148, 64, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_STALKER, 116, 32, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_STALKER, 132, 48, $0 + anim_wait 128 + anim_ret + +BattleAnim_Attract: + anim_1gfx BATTLE_ANIM_GFX_OBJECTS +.loop + anim_sound 16, 2, SFX_LICK + anim_obj BATTLE_ANIM_OBJ_ATTRACT, 44, 80, $2 + anim_wait 8 + anim_loop 5, .loop + anim_wait 128 + anim_wait 64 + anim_ret + +BattleAnim_SleepTalk: + anim_1gfx BATTLE_ANIM_GFX_STATUS +.loop + anim_sound 0, 0, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_ASLEEP, 64, 80, $0 + anim_wait 40 + anim_loop 2, .loop + anim_wait 32 + anim_ret + +BattleAnim_BellChime: + anim_2gfx BATTLE_ANIM_GFX_MISC, BATTLE_ANIM_GFX_NOISE + anim_obj BATTLE_ANIM_OBJ_BELL_CHIME, 72, 56, $0 + anim_wait 32 +.loop + anim_sound 0, 0, SFX_READ_TEXT + anim_obj BATTLE_ANIM_OBJ_BELL_CHIME_NOTE, 72, 52, $0 + anim_wait 8 + anim_sound 0, 0, SFX_READ_TEXT + anim_obj BATTLE_ANIM_OBJ_BELL_CHIME_NOTE, 72, 52, $1 + anim_wait 8 + anim_sound 0, 0, SFX_READ_TEXT + anim_obj BATTLE_ANIM_OBJ_BELL_CHIME_NOTE, 72, 52, $2 + anim_wait 8 + anim_sound 0, 0, SFX_READ_TEXT + anim_obj BATTLE_ANIM_OBJ_BELL_CHIME_NOTE, 72, 52, $0 + anim_wait 8 + anim_sound 0, 0, SFX_READ_TEXT + anim_obj BATTLE_ANIM_OBJ_BELL_CHIME_NOTE, 72, 52, $2 + anim_wait 8 + anim_loop 4, .loop + anim_wait 64 + anim_ret + +BattleAnim_Return: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_2Row + anim_bgeffect BATTLE_BG_EFFECT_BOUNCE_DOWN, $0, BG_EFFECT_USER, $0 + anim_wait 64 + anim_incbgeffect BATTLE_BG_EFFECT_BOUNCE_DOWN + anim_wait 32 + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 4 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG, 136, 40, $0 + anim_wait 8 + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Present: + anim_2gfx BATTLE_ANIM_GFX_STATUS, BATTLE_ANIM_GFX_BUBBLE + anim_sound 0, 1, SFX_SWITCH_POKEMON + anim_obj BATTLE_ANIM_OBJ_PRESENT, 64, 88, $6c + anim_wait 56 + anim_obj BATTLE_ANIM_OBJ_AMNESIA, 104, 48, $0 + anim_wait 48 + anim_incobj 2 + anim_if_param_equal $1, .heal + anim_incobj 1 + anim_wait 1 + anim_1gfx BATTLE_ANIM_GFX_EXPLOSION + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $24 + anim_call BattleAnimSub_Explosion2 + anim_wait 16 + anim_ret + +.heal + anim_wait 1 + anim_call BattleAnim_UserObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING, $0, BG_EFFECT_TARGET, $40 + anim_sound 0, 1, SFX_GAME_FREAK_LOGO_RG +.loop2 + anim_obj BATTLE_ANIM_OBJ_RECOVER, 132, 48, $24 + anim_wait 8 + anim_loop 8, .loop2 + anim_wait 128 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING + anim_call BattleAnim_ShowMon_1 + anim_ret + +BattleAnim_Frustration: + anim_1gfx BATTLE_ANIM_GFX_MISC + anim_obj BATTLE_ANIM_OBJ_ANGER, 72, 80, $0 + anim_wait 40 + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_WOBBLE_MON, $0, BG_EFFECT_USER, $0 + anim_wait 8 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 120, 48, $0 + anim_wait 8 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 152, 48, $0 + anim_wait 8 + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 48, $0 + anim_wait 8 + anim_incbgeffect BATTLE_BG_EFFECT_WOBBLE_MON + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_Safeguard: + anim_1gfx BATTLE_ANIM_GFX_MISC + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_obj BATTLE_ANIM_OBJ_SAFEGUARD, 80, 80, $0 + anim_obj BATTLE_ANIM_OBJ_SAFEGUARD, 80, 80, $d + anim_obj BATTLE_ANIM_OBJ_SAFEGUARD, 80, 80, $1a + anim_obj BATTLE_ANIM_OBJ_SAFEGUARD, 80, 80, $27 + anim_obj BATTLE_ANIM_OBJ_SAFEGUARD, 80, 80, $34 +.loop + anim_sound 0, 0, SFX_SHINE + anim_wait 4 + anim_loop 32, .loop + anim_ret + +BattleAnim_PainSplit: + anim_2gfx BATTLE_ANIM_GFX_HIT, BATTLE_ANIM_GFX_OBJECTS + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $1, $0 + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 4 + anim_sound 0, 1, SFX_TACKLE + anim_obj BATTLE_ANIM_OBJ_HIT, 112, 48, $0 + anim_obj BATTLE_ANIM_OBJ_HIT, 76, 96, $0 + anim_obj BATTLE_ANIM_OBJ_ENCORE_STAR, 112, 32, $34 + anim_obj BATTLE_ANIM_OBJ_ENCORE_STAR, 76, 80, $2c + anim_wait 8 + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_SacredFire: + anim_1gfx BATTLE_ANIM_GFX_FIRE + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_OBPALS, $0, $2, $0 + anim_bgeffect BATTLE_BG_EFFECT_ALTERNATE_HUES, $0, $2, $0 +.loop + anim_sound 0, 0, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_SACRED_FIRE, 48, 104, $0 + anim_wait 8 + anim_loop 8, .loop + anim_wait 96 + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 4 + anim_sound 0, 1, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_FIRE_BLAST, 136, 48, $1 + anim_obj BATTLE_ANIM_OBJ_FIRE_BLAST, 136, 48, $4 + anim_obj BATTLE_ANIM_OBJ_FIRE_BLAST, 136, 48, $5 + anim_wait 8 + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 3 + anim_incobj 9 + anim_wait 8 + anim_ret + +BattleAnim_Magnitude: + anim_1gfx BATTLE_ANIM_GFX_ROCKS + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $80 + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $60, $4, $0 +.loop + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_SMALL_ROCK, 128, 64, $40 + anim_wait 2 + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_BIG_ROCK, 120, 68, $30 + anim_wait 2 + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_SMALL_ROCK, 152, 68, $30 + anim_wait 2 + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_BIG_ROCK, 144, 64, $40 + anim_wait 2 + anim_sound 0, 1, SFX_STRENGTH + anim_obj BATTLE_ANIM_OBJ_SMALL_ROCK, 136, 68, $30 + anim_wait 16 + anim_loop 2, .loop + anim_wait 96 + anim_ret + +BattleAnim_Dynamicpunch: + anim_2gfx BATTLE_ANIM_GFX_HIT, BATTLE_ANIM_GFX_EXPLOSION + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_PUNCH_SHAKE, 136, 56, $43 + anim_wait 16 + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $24 + anim_call BattleAnimSub_Explosion2 + anim_wait 16 + anim_ret + +BattleAnim_Megaphone: + anim_2gfx BATTLE_ANIM_GFX_MISC, BATTLE_ANIM_GFX_NOISE + anim_obj BATTLE_ANIM_OBJ_MEGAPHONE, 64, 88, $0 + anim_wait 32 + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $60, $2, $0 +.loop + anim_sound 0, 0, SFX_MEGAPHONE + anim_call BattleAnimSub_Sound + anim_wait 16 + anim_loop 2, .loop + anim_wait 8 + anim_ret + +BattleAnim_Dragonbreath: + anim_1gfx BATTLE_ANIM_GFX_FIRE + anim_sound 6, 2, SFX_EMBER +.loop + anim_obj BATTLE_ANIM_OBJ_DRAGONBREATH, 64, 92, $4 + anim_wait 4 + anim_loop 10, .loop + anim_wait 64 + anim_ret + +BattleAnim_BatonPass: + anim_1gfx BATTLE_ANIM_GFX_MISC + anim_obj BATTLE_ANIM_OBJ_BATON_PASS, 44, 104, $20 + anim_call BattleAnim_ReturnMon + anim_wait 64 + anim_ret + +BattleAnim_Encore: + anim_1gfx BATTLE_ANIM_GFX_OBJECTS + anim_obj BATTLE_ANIM_OBJ_ENCORE_HAND, 64, 80, $90 + anim_obj BATTLE_ANIM_OBJ_ENCORE_HAND, 64, 80, $10 + anim_wait 16 + anim_sound 0, 1, SFX_SWITCH_POKEMON + anim_obj BATTLE_ANIM_OBJ_ENCORE_STAR, 64, 72, $2c + anim_wait 32 + anim_sound 0, 1, SFX_SWITCH_POKEMON + anim_obj BATTLE_ANIM_OBJ_ENCORE_STAR, 64, 72, $34 + anim_wait 16 + anim_ret + +BattleAnim_Pursuit: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_if_param_equal $1, .pursued + anim_sound 0, 1, SFX_COMET_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 56, $0 + anim_wait 16 + anim_ret + +.pursued: + anim_bgeffect BATTLE_BG_EFFECT_HIDE_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 4 + anim_call BattleAnim_UserObj_1Row + anim_obj BATTLE_ANIM_OBJ_BETA_PURSUIT, 132, 64, $0 + anim_wait 64 + anim_obj BATTLE_ANIM_OBJ_BETA_PURSUIT, 132, 64, $1 + anim_sound 0, 1, SFX_BALL_POOF + anim_bgeffect BATTLE_BG_EFFECT_ENTER_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 64 + anim_incobj 3 + anim_wait 16 + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 120, 56, $0 + anim_bgeffect BATTLE_BG_EFFECT_BETA_PURSUIT, $0, BG_EFFECT_TARGET, $0 + anim_wait 16 + anim_call BattleAnim_ShowMon_1 + anim_wait 1 + anim_ret + +BattleAnim_RapidSpin: + anim_2gfx BATTLE_ANIM_GFX_WIND, BATTLE_ANIM_GFX_HIT + anim_obp0 $e4 +.loop + anim_sound 0, 0, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_RAPID_SPIN, 44, 112, $0 + anim_wait 2 + anim_loop 5, .loop + anim_wait 24 + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 4 + anim_resetobp0 + anim_sound 0, 1, SFX_MEGA_KICK + anim_obj BATTLE_ANIM_OBJ_HIT, 136, 40, $0 + anim_wait 8 + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 3 + anim_incobj 6 + anim_wait 1 + anim_ret + +BattleAnim_Tempt: + anim_1gfx BATTLE_ANIM_GFX_OBJECTS + anim_sound 0, 0, SFX_SWITCH_POKEMON + anim_obj BATTLE_ANIM_OBJ_CAKE_TEMPT, 64, 88, $6c + anim_wait 56 + anim_ret + +BattleAnim_IronTail: + anim_1gfx BATTLE_ANIM_GFX_REFLECT + anim_obp0 $0 + anim_call BattleAnim_TargetObj_1Row + anim_call BattleAnimSub_Metallic + anim_wait 4 + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_resetobp0 + anim_bgeffect BATTLE_BG_EFFECT_WOBBLE_MON, $0, BG_EFFECT_USER, $0 + anim_wait 16 + anim_sound 0, 1, SFX_MEGA_KICK + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 48, $0 + anim_wait 16 + anim_incbgeffect BATTLE_BG_EFFECT_WOBBLE_MON + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_RockHead: + anim_1gfx BATTLE_ANIM_GFX_SHINE + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $0, $0 + anim_sound 0, 0, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_FORESIGHT, 48, 88, $0 + anim_wait 24 + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_TACKLE, $0, BG_EFFECT_USER, $0 + anim_wait 4 + anim_sound 0, 1, SFX_HEADBUTT + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 136, 48, $0 + anim_wait 8 + anim_call BattleAnim_ShowMon_0 + anim_ret + +BattleAnim_VitalThrow: + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_VITAL_THROW, $0, BG_EFFECT_USER, $0 + anim_wait 16 + anim_sound 0, 0, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_HIT, 64, 88, $0 + anim_wait 8 + anim_sound 0, 0, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_HIT, 56, 80, $0 + anim_wait 8 + anim_sound 0, 0, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_HIT, 68, 104, $0 + anim_wait 8 + anim_incbgeffect BATTLE_BG_EFFECT_VITAL_THROW + anim_wait 16 + anim_call BattleAnim_ShowMon_0 + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_HIT_BIG, 132, 56, $0 + anim_wait 16 + anim_ret + +BattleAnim_MorningSun: + anim_1gfx BATTLE_ANIM_GFX_SHINE + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $0, $0 +.loop + anim_obj BATTLE_ANIM_OBJ_MORNING_SUN, 16, 48, $88 + anim_wait 6 + anim_loop 5, .loop + anim_wait 32 + anim_sound 0, 0, SFX_GAME_FREAK_LOGO_RG + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 44, 64, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 24, 96, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 56, 104, $0 + anim_wait 16 + anim_if_param_equal $2, .done + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING, $0, BG_EFFECT_USER, $40 + anim_wait 32 + anim_if_param_equal $1, .one + anim_wait 96 +.one + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING + anim_call BattleAnim_ShowMon_0 +.done + anim_ret + +BattleAnim_Synthesis: + anim_1gfx BATTLE_ANIM_GFX_SHINE + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $0, $0 + anim_if_param_equal $1, .one + anim_sound 0, 0, SFX_GAME_FREAK_LOGO_RG + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 44, 64, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 24, 96, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 56, 104, $0 + anim_wait 21 + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING, $0, BG_EFFECT_USER, $40 + anim_wait 32 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_ret + +.one +.loop + anim_sound 0, 0, SFX_GAME_FREAK_LOGO_RG + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 24, 64, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 56, 104, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 24, 104, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 56, 64, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 40, 84, $0 + anim_wait 5 + anim_loop 2, .loop + anim_wait 16 + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING, $0, BG_EFFECT_USER, $40 + anim_wait 128 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_ret + + anim_ret ; unreferenced + +BattleAnim_Moonlight: + anim_1gfx BATTLE_ANIM_GFX_SHINE + anim_bgp $1b + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $0, $0 + anim_obj BATTLE_ANIM_OBJ_MOONLIGHT, 16, 56, $0 + anim_obj BATTLE_ANIM_OBJ_MOONLIGHT, 32, 72, $0 + anim_obj BATTLE_ANIM_OBJ_MOONLIGHT, 48, 88, $0 + anim_obj BATTLE_ANIM_OBJ_MOONLIGHT, 64, 104, $0 + anim_wait 64 + anim_sound 0, 0, SFX_GAME_FREAK_LOGO_RG + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 44, 64, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 24, 96, $0 + anim_wait 5 + anim_obj BATTLE_ANIM_OBJ_GLIMMER, 56, 104, $0 + anim_wait 16 + anim_bgp $e4 + anim_if_param_equal $0, .done + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING, $0, BG_EFFECT_USER, $40 + anim_wait 32 + anim_if_param_equal $1, .one + anim_wait 96 +.one + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING + anim_call BattleAnim_ShowMon_0 +.done + anim_ret + +BattleAnim_HiddenPower: + anim_1gfx BATTLE_ANIM_GFX_CHARGE + anim_call BattleAnim_TargetObj_1Row + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING, $0, BG_EFFECT_USER, $20 + anim_bgeffect BATTLE_BG_EFFECT_CYCLE_MID_OBPALS, $0, $2, $0 + anim_obj BATTLE_ANIM_OBJ_HIDDEN_POWER, 44, 88, $0 + anim_obj BATTLE_ANIM_OBJ_HIDDEN_POWER, 44, 88, $8 + anim_obj BATTLE_ANIM_OBJ_HIDDEN_POWER, 44, 88, $10 + anim_obj BATTLE_ANIM_OBJ_HIDDEN_POWER, 44, 88, $18 + anim_obj BATTLE_ANIM_OBJ_HIDDEN_POWER, 44, 88, $20 + anim_obj BATTLE_ANIM_OBJ_HIDDEN_POWER, 44, 88, $28 + anim_obj BATTLE_ANIM_OBJ_HIDDEN_POWER, 44, 88, $30 + anim_obj BATTLE_ANIM_OBJ_HIDDEN_POWER, 44, 88, $38 +.loop + anim_sound 0, 0, SFX_SWORDS_DANCE + anim_wait 8 + anim_loop 12, .loop + anim_incbgeffect BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING + anim_call BattleAnim_ShowMon_0 + anim_wait 1 + anim_incobj 2 + anim_incobj 3 + anim_incobj 4 + anim_incobj 5 + anim_incobj 6 + anim_incobj 7 + anim_incobj 8 + anim_incobj 9 + anim_wait 16 + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 56, $0 + anim_wait 64 + anim_ret + +BattleAnim_CrossCutter: + anim_1gfx BATTLE_ANIM_GFX_CUT + anim_sound 0, 1, SFX_CUT + anim_obj BATTLE_ANIM_OBJ_CROSS_CUTTER1, 152, 40, $0 + anim_obj BATTLE_ANIM_OBJ_CROSS_CUTTER2, 120, 72, $0 + anim_wait 8 + anim_bgeffect BATTLE_BG_EFFECT_SHAKE_SCREEN_X, $58, $2, $0 + anim_wait 92 + anim_sound 0, 1, SFX_VICEGRIP + anim_bgeffect BATTLE_BG_EFFECT_FLASH_INVERTED, $0, $4, $20 + anim_wait 16 + anim_ret + +BattleAnim_Twister: + anim_2gfx BATTLE_ANIM_GFX_WIND, BATTLE_ANIM_GFX_HIT +.loop1 + anim_sound 0, 0, SFX_RAZOR_WIND + anim_obj BATTLE_ANIM_OBJ_GUST, 64, 112, $0 + anim_wait 6 + anim_loop 9, .loop1 +.loop2 + anim_sound 0, 0, SFX_RAZOR_WIND + anim_wait 8 + anim_loop 8, .loop2 + anim_incobj 1 + anim_incobj 2 + anim_incobj 3 + anim_incobj 4 + anim_incobj 5 + anim_incobj 6 + anim_incobj 7 + anim_incobj 8 + anim_incobj 9 + anim_wait 64 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 144, 64, $18 +.loop3 + anim_sound 0, 1, SFX_RAZOR_WIND + anim_wait 8 + anim_loop 4, .loop3 + anim_obj BATTLE_ANIM_OBJ_HIT_YFIX, 128, 32, $18 +.loop4 + anim_sound 0, 1, SFX_RAZOR_WIND + anim_wait 8 + anim_loop 4, .loop4 + anim_incobj 1 + anim_incobj 2 + anim_incobj 3 + anim_incobj 4 + anim_incobj 5 + anim_incobj 6 + anim_incobj 7 + anim_incobj 8 + anim_incobj 9 + anim_wait 32 + anim_ret + +BattleAnim_RainDance: + anim_1gfx BATTLE_ANIM_GFX_WATER + anim_bgp $f8 + anim_sound 0, 1, SFX_BUBBLEBEAM + anim_obj BATTLE_ANIM_OBJ_RAIN, 88, 0, $0 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_RAIN, 88, 0, $1 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_RAIN, 88, 0, $2 + anim_wait 128 + anim_ret + +BattleAnim_SunnyDay: + anim_1gfx BATTLE_ANIM_GFX_WATER + anim_bgp $90 + anim_obp0 $55 + anim_sound 0, 1, SFX_GAME_FREAK_LOGO_RG + anim_obj BATTLE_ANIM_OBJ_RAIN, 88, 0, $2 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_RAIN, 88, 0, $2 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_RAIN, 88, 0, $2 + anim_wait 128 + anim_ret + +BattleAnim_StrongArm: + anim_1gfx BATTLE_ANIM_GFX_REFLECT + anim_obp0 $00 + anim_call BattleAnim_TargetObj_1Row + anim_call BattleAnimSub_Metallic + anim_call BattleAnim_ShowMon_0 + anim_1gfx BATTLE_ANIM_GFX_HIT + anim_resetobp0 + anim_sound 0, 1, SFX_MEGA_PUNCH + anim_obj BATTLE_ANIM_OBJ_PUNCH, 136, 56, $0 + anim_wait 6 + anim_obj BATTLE_ANIM_OBJ_HIT_BIG_YFIX, 136, 56, $0 + anim_wait 6 + anim_ret + +BattleAnimSub_Drain: + anim_sound 6, 3, SFX_WATER_GUN + anim_obj BATTLE_ANIM_OBJ_DRAIN, $84, $2c, $0 + anim_obj BATTLE_ANIM_OBJ_DRAIN, $84, $2c, $8 + anim_obj BATTLE_ANIM_OBJ_DRAIN, $84, $2c, $10 + anim_obj BATTLE_ANIM_OBJ_DRAIN, $84, $2c, $18 + anim_obj BATTLE_ANIM_OBJ_DRAIN, $84, $2c, $20 + anim_obj BATTLE_ANIM_OBJ_DRAIN, $84, $2c, $28 + anim_obj BATTLE_ANIM_OBJ_DRAIN, $84, $2c, $30 + anim_obj BATTLE_ANIM_OBJ_DRAIN, $84, $2c, $38 + anim_ret + +BattleAnimSub_EyeBeams: + anim_sound 6, 2, SFX_LEER + anim_obj BATTLE_ANIM_OBJ_LEER, 72, 84, $0 + anim_obj BATTLE_ANIM_OBJ_LEER, 64, 80, $0 + anim_obj BATTLE_ANIM_OBJ_LEER, 88, 76, $0 + anim_obj BATTLE_ANIM_OBJ_LEER, 80, 72, $0 + anim_obj BATTLE_ANIM_OBJ_LEER, 104, 68, $0 + anim_obj BATTLE_ANIM_OBJ_LEER, 96, 64, $0 + anim_obj BATTLE_ANIM_OBJ_LEER, 120, 60, $0 + anim_obj BATTLE_ANIM_OBJ_LEER, 112, 56, $0 + anim_obj BATTLE_ANIM_OBJ_LEER_TIP, 130, 54, $0 + anim_obj BATTLE_ANIM_OBJ_LEER_TIP, 122, 50, $0 + anim_ret + +BattleAnimSub_WarpAway: + anim_sound 0, 0, SFX_WARP_TO + anim_obj BATTLE_ANIM_OBJ_WARP, 44, 108, $0 + anim_obj BATTLE_ANIM_OBJ_WARP, 44, 100, $0 + anim_obj BATTLE_ANIM_OBJ_WARP, 44, 92, $0 + anim_obj BATTLE_ANIM_OBJ_WARP, 44, 84, $0 + anim_obj BATTLE_ANIM_OBJ_WARP, 44, 76, $0 + anim_obj BATTLE_ANIM_OBJ_WARP, 44, 68, $0 + anim_obj BATTLE_ANIM_OBJ_WARP, 44, 60, $0 + anim_ret + +BattleAnimSub_Beam: + anim_sound 0, 0, SFX_HYPER_BEAM + anim_obj BATTLE_ANIM_OBJ_BEAM, 64, 92, $0 + anim_wait 4 + anim_sound 0, 0, SFX_HYPER_BEAM + anim_obj BATTLE_ANIM_OBJ_BEAM, 80, 84, $0 + anim_wait 4 + anim_sound 0, 1, SFX_HYPER_BEAM + anim_obj BATTLE_ANIM_OBJ_BEAM, 96, 76, $0 + anim_wait 4 + anim_sound 0, 1, SFX_HYPER_BEAM + anim_obj BATTLE_ANIM_OBJ_BEAM, 112, 68, $0 + anim_obj BATTLE_ANIM_OBJ_BEAM_TIP, 126, 62, $0 + anim_ret + +BattleAnimSub_Explosion1: + anim_sound 0, 0, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION1, 24, 64, $0 + anim_wait 5 + anim_sound 0, 0, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION1, 56, 104, $0 + anim_wait 5 + anim_sound 0, 0, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION1, 24, 104, $0 + anim_wait 5 + anim_sound 0, 0, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION1, 56, 64, $0 + anim_wait 5 + anim_sound 0, 0, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION1, 40, 84, $0 + anim_ret + +BattleAnimSub_Explosion2: + anim_sound 0, 1, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION1, 148, 32, $0 + anim_wait 5 + anim_sound 0, 1, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION1, 116, 72, $0 + anim_wait 5 + anim_sound 0, 1, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION1, 148, 72, $0 + anim_wait 5 + anim_sound 0, 1, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION1, 116, 32, $0 + anim_wait 5 + anim_sound 0, 1, SFX_EGG_BOMB + anim_obj BATTLE_ANIM_OBJ_EXPLOSION1, 132, 52, $0 + anim_ret + +BattleAnimSub_Sound: + anim_obj BATTLE_ANIM_OBJ_SOUND, 64, 76, $0 + anim_obj BATTLE_ANIM_OBJ_SOUND, 64, 88, $1 + anim_obj BATTLE_ANIM_OBJ_SOUND, 64, 100, $2 + anim_ret + +BattleAnimSub_Fire: +.loop + anim_sound 0, 1, SFX_EMBER + anim_obj BATTLE_ANIM_OBJ_BURNED, 136, 56, $10 + anim_obj BATTLE_ANIM_OBJ_BURNED, 136, 56, $90 + anim_wait 4 + anim_loop 4, .loop + anim_ret + +BattleAnimSub_Ice: + anim_sound 0, 1, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_ICE, 128, 42, $0 + anim_wait 6 + anim_sound 0, 1, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_ICE, 144, 70, $0 + anim_wait 6 + anim_sound 0, 1, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_ICE, 120, 56, $0 + anim_wait 6 + anim_sound 0, 1, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_ICE, 152, 56, $0 + anim_wait 6 + anim_sound 0, 1, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_ICE, 144, 42, $0 + anim_wait 6 + anim_sound 0, 1, SFX_SHINE + anim_obj BATTLE_ANIM_OBJ_ICE, 128, 70, $0 + anim_ret + +BattleAnimSub_Sludge: +.loop + anim_sound 0, 1, SFX_POISON + anim_obj BATTLE_ANIM_OBJ_SLUDGE, 132, 72, $0 + anim_wait 8 + anim_sound 0, 1, SFX_POISON + anim_obj BATTLE_ANIM_OBJ_SLUDGE, 116, 72, $0 + anim_wait 8 + anim_sound 0, 1, SFX_POISON + anim_obj BATTLE_ANIM_OBJ_SLUDGE, 148, 72, $0 + anim_wait 8 + anim_loop 5, .loop + anim_ret + +BattleAnimSub_Acid: +.loop + anim_sound 6, 2, SFX_BUBBLEBEAM + anim_obj BATTLE_ANIM_OBJ_ACID, 64, 92, $10 + anim_wait 5 + anim_loop 8, .loop + anim_ret + +BattleAnimSub_Metallic: + anim_sound 0, 0, SFX_SHINE + anim_bgeffect BATTLE_BG_EFFECT_FADE_MON_TO_BLACK, $0, BG_EFFECT_USER, $40 + anim_wait 8 + anim_obj BATTLE_ANIM_OBJ_HARDEN, 48, 84, $0 + anim_wait 32 + anim_obj BATTLE_ANIM_OBJ_HARDEN, 48, 84, $0 + anim_wait 64 + anim_incbgeffect BATTLE_BG_EFFECT_FADE_MON_TO_BLACK + anim_ret + +BattleAnimSub_SandOrMud: +.loop + anim_sound 6, 2, SFX_MENU + anim_obj BATTLE_ANIM_OBJ_SAND, 64, 92, $4 + anim_wait 4 + anim_loop 8, .loop + anim_wait 64 + anim_ret + +BattleAnim_TargetObj_1Row: + anim_battlergfx_2row + anim_bgeffect BATTLE_BG_EFFECT_BATTLEROBJ_1ROW, $0, BG_EFFECT_TARGET, $0 + anim_wait 6 + anim_ret + +BattleAnim_TargetObj_2Row: + anim_battlergfx_1row + anim_bgeffect BATTLE_BG_EFFECT_BATTLEROBJ_2ROW, $0, BG_EFFECT_TARGET, $0 + anim_wait 6 + anim_ret + +BattleAnim_ShowMon_0: + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_TARGET, $0 + anim_wait 3 + anim_incobj 1 + anim_wait 1 + anim_ret + +BattleAnim_UserObj_1Row: + anim_battlergfx_2row + anim_bgeffect BATTLE_BG_EFFECT_BATTLEROBJ_1ROW, $0, BG_EFFECT_USER, $0 + anim_wait 6 + anim_ret + +BattleAnim_UserObj_2Row: + anim_battlergfx_1row + anim_bgeffect BATTLE_BG_EFFECT_BATTLEROBJ_2ROW, $0, BG_EFFECT_USER, $0 + anim_wait 6 + anim_ret + +BattleAnim_ShowMon_1: + anim_bgeffect BATTLE_BG_EFFECT_SHOW_MON, $0, BG_EFFECT_USER, $0 + anim_wait 3 + anim_incobj 1 + anim_wait 1 + anim_ret diff --git a/data/predef_pointers.inc b/data/predef_pointers.inc index 1166cc9..99c7e61 100644 --- a/data/predef_pointers.inc +++ b/data/predef_pointers.inc @@ -51,8 +51,8 @@ GiveItemPredef:: add_predef Function3e1a4 add_predef Function3ef19 add_predef CalcAndPlaceExpBar - add_predef Function3e91e - add_predef Function3e963 ; 28 + add_predef GetBattleMonBackpic + add_predef GetEnemyMonFrontpic ; 28 add_predef Function421f8 add_predef FillMoves add_predef Function41fa1 @@ -63,7 +63,7 @@ GiveItemPredef:: add_predef ConvertMon_1to2 ; 30 add_predef CopyMonToTempMon add_predef ListMoves - add_predef Function50bcd + add_predef GetMonBackpic add_predef PlaceNonFaintStatus add_predef Function508c4 add_predef PartyMenuInBattle_Setup @@ -78,9 +78,9 @@ GiveItemPredef:: add_predef PrintMoveType add_predef PrintMonTypes ; 40 add_predef GetUnownLetter - add_predef Functioncb6ff - add_predef Functioncb710 - add_predef Functioncb733 + add_predef ChangeBGPalColor0_4Frames + add_predef PredefShakeScreenVertically + add_predef PredefShakeScreenHorizontally add_predef Function145b8 add_predef Function146dc add_predef Function145de diff --git a/engine/battle_anims/anim_commands.asm b/engine/battle_anims/anim_commands.asm new file mode 100644 index 0000000..75ca252 --- /dev/null +++ b/engine/battle_anims/anim_commands.asm @@ -0,0 +1,1095 @@ +INCLUDE "constants.asm" + +SECTION "engine/battle_anims/anim_commands.asm", ROMX + +Functioncc000: +Functioncc000_2: + ret + +PlayBattleAnim: + ld c, 8 +.wait + call DelayFrame + dec c + jr nz, .wait + + ld hl, hVBlank + ld a, [hl] + push af + + ld [hl], 1 + xor a + ld [wDisableVBlankOAMUpdate], a + call RunBattleAnimScript_User + call RunBattleAnimScript_Target + pop af + ldh [hVBlank], a + xor a + ld [wDisableVBlankOAMUpdate], a + ret + +RunBattleAnimScript_User: + ld a, [wOptions] + bit BATTLE_SCENE, a + jr z, .enabled + +; If high byte doesn't equal 0, go ahead and skip to the animation-playing part. + ld a, [wFXAnimID + 1] + and a + ret z +.enabled + xor a + ldh [hBGMapMode], a + call BattleAnimAssignPals + xor a + ld [wBattleAnimOAMPointerLo + 1], a ; TODO + +.playframe + call RunBattleAnimCommand + call _ExecuteBGEffects + call BattleAnim_UpdateOAM_All + call DelayFrame + + ld a, [wBattleAnimFlags] + bit BATTLEANIM_STOP_F, a + jr z, .playframe + + bit BATTLEANIM_KEEPSPRITES_F, a + call z, BattleAnim_ClearOAM + + ld a, 1 + ldh [hBGMapMode], a + ret + +RunBattleAnimScript_Target: + ld a, [wNumHits] + ld l, a + ld h, 0 + ld de, ANIM_MISS + add hl, de + ld a, l + ld [wFXAnimID], a + ld a, h + ld [wFXAnimID + 1], a + + xor a + ldh [hBGMapMode], a + call ClearBattleAnims + xor a + ld [wBattleAnimOAMPointerLo + 1], a ; todo + +.playframe + call RunBattleAnimCommand + call _ExecuteBGEffects + call DelayFrame + + ld a, [wBattleAnimFlags] + bit BATTLEANIM_STOP_F, a + jr z, .playframe + + call BattleAnim_SetPals + ret + +BattleAnim_ClearOAM: + ld hl, wShadowOAM + ld c, SPRITEOAMSTRUCT_LENGTH * NUM_SPRITE_OAM_STRUCTS + xor a +.loop + ld [hli], a + dec c + jr nz, .loop + ret + +RunBattleAnimCommand: + call .CheckTimer + ret nc + call .RunScript + ret + +.CheckTimer: + ld a, [wBattleAnimDuration] + and a + jr z, .done + dec a + ld [wBattleAnimDuration], a + and a + ret + +.done + scf + ret + +.RunScript: +.loop + call GetBattleAnimByte + cp $FF ; anim_ret_command + jr nz, .not_done_with_anim + + ld hl, wBattleAnimFlags + bit BATTLEANIM_IN_SUBROUTINE_F, [hl] + jr nz, .do_anim + + set BATTLEANIM_STOP_F, [hl] + ret + +.not_done_with_anim + cp $D0 ; anim_obj_command + jr nc, .do_anim + ld [wBattleAnimDuration], a + ret + +.do_anim + call .DoCommand + jr .loop + +.DoCommand: + ; Execute battle animation command in [wBattleAnimByte]. + ld a, [wBattleAnimByte] + sub $D0 ; anim_obj_command + + ld e, a + ld d, $00 + ld hl, BattleAnimCommands + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +BattleAnimCommands: + dw BattleAnimCmd_Obj + dw BattleAnimCmd_1GFX + dw BattleAnimCmd_2GFX + dw BattleAnimCmd_3GFX + dw BattleAnimCmd_4GFX + dw BattleAnimCmd_5GFX + dw BattleAnimCmd_IncObj + dw BattleAnimCmd_SetObj + dw BattleAnimCmd_IncBGEffect + dw BattleAnimCmd_BattlerGFX_1Row + dw BattleAnimCmd_BattlerGFX_2Row + dw BattleAnimCmd_CheckPokeball + dw BattleAnimCmd_Transform + dw BattleAnimCmd_RaiseSub + dw BattleAnimCmd_DropSub + dw BattleAnimCmd_ResetObp0 + dw BattleAnimCmd_Sound + dw BattleAnimCmd_Cry + dw BattleAnimCmd_MinimizeOpp + dw BattleAnimCmd_OAMOn + dw BattleAnimCmd_OAMOff + dw BattleAnimCmd_E5 + dw BattleAnimCmd_E6 + dw BattleAnimCmd_E7 + dw BattleAnimCmd_E8 + dw BattleAnimCmd_E9 + dw BattleAnimCmd_EA + dw BattleAnimCmd_EB + dw BattleAnimCmd_EC + dw BattleAnimCmd_ED + dw BattleAnimCmd_IfParamAnd + dw BattleAnimCmd_JumpUntil + dw BattleAnimCmd_BGEffect + dw BattleAnimCmd_BGP + dw BattleAnimCmd_OBP0 + dw BattleAnimCmd_OBP1 + dw BattleAnimCmd_KeepSprites + dw BattleAnimCmd_F5 + dw BattleAnimCmd_F6 + dw BattleAnimCmd_F7 + dw BattleAnimCmd_IfParamEqual + dw BattleAnimCmd_SetVar + dw BattleAnimCmd_IncVar + dw BattleAnimCmd_IfVarEqual + dw BattleAnimCmd_Jump + dw BattleAnimCmd_Loop + dw BattleAnimCmd_Call + dw BattleAnimCmd_Ret + +BattleAnimCmd_E5: +BattleAnimCmd_E6: +BattleAnimCmd_E7: +BattleAnimCmd_E8: +BattleAnimCmd_E9: +BattleAnimCmd_EA: +BattleAnimCmd_EB: +BattleAnimCmd_EC: +BattleAnimCmd_ED: + ret + +BattleAnimCmd_Ret: + ld hl, wBattleAnimFlags + res BATTLEANIM_IN_SUBROUTINE_F, [hl] + ld hl, wBattleAnimParent + ld e, [hl] + inc hl + ld d, [hl] + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +BattleAnimCmd_Call: + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + push de + ld hl, wBattleAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + ld hl, wBattleAnimParent + ld [hl], e + inc hl + ld [hl], d + pop de + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ld hl, wBattleAnimFlags + set BATTLEANIM_IN_SUBROUTINE_F, [hl] + ret + +BattleAnimCmd_Jump: + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +BattleAnimCmd_Loop: + call GetBattleAnimByte + ld hl, wBattleAnimFlags + bit BATTLEANIM_IN_LOOP_F, [hl] + jr nz, .continue_loop + and a + jr z, .perpetual + dec a + set BATTLEANIM_IN_LOOP_F, [hl] + ld [wBattleAnimLoops], a +.continue_loop + ld hl, wBattleAnimLoops + ld a, [hl] + and a + jr z, .return_from_loop + dec [hl] +.perpetual + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +.return_from_loop + ld hl, wBattleAnimFlags + res BATTLEANIM_IN_LOOP_F, [hl] + ld hl, wBattleAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + inc de + inc de + ld [hl], d + dec hl + ld [hl], e + ret + +BattleAnimCmd_JumpUntil: + ld hl, wBattleAnimParam + ld a, [hl] + and a + jr z, .dont_jump + + dec [hl] + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +.dont_jump + ld hl, wBattleAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + inc de + inc de + ld [hl], d + dec hl + ld [hl], e + ret + +BattleAnimCmd_SetVar: + call GetBattleAnimByte + ld [wBattleAnimVar], a + ret + +BattleAnimCmd_IncVar: + ld hl, wBattleAnimVar + inc [hl] + ret + +BattleAnimCmd_IfVarEqual: + call GetBattleAnimByte + ld hl, wBattleAnimVar + cp [hl] + jr z, .jump + + ld hl, wBattleAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + inc de + inc de + ld [hl], d + dec hl + ld [hl], e + ret + +.jump + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +BattleAnimCmd_IfParamEqual: + call GetBattleAnimByte + ld hl, wBattleAnimParam + cp [hl] + jr z, .jump + + ld hl, wBattleAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + inc de + inc de + ld [hl], d + dec hl + ld [hl], e + ret + +.jump + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +BattleAnimCmd_IfParamAnd: + call GetBattleAnimByte + ld e, a + ld a, [wBattleAnimParam] + and e + jr nz, .jump + + ld hl, wBattleAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + inc de + inc de + ld [hl], d + dec hl + ld [hl], e + ret + +.jump + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +BattleAnimCmd_Obj: +; index, x, y, param + call GetBattleAnimByte + ld [wBattleObjectTempID], a + call GetBattleAnimByte + ld [wBattleObjectTempXCoord], a + call GetBattleAnimByte + ld [wBattleObjectTempYCoord], a + call GetBattleAnimByte + ld [wBattleObjectTempParam], a + call QueueBattleAnimation + ret + +BattleAnimCmd_BGEffect: + call GetBattleAnimByte + ld [wBattleBGEffectTempID], a + call GetBattleAnimByte + ld [wBattleBGEffectTempJumptableIndex], a + call GetBattleAnimByte + ld [wBattleBGEffectTempTurn], a + call GetBattleAnimByte + ld [wBattleBGEffectTempParam], a + call _QueueBGEffect + ret + +BattleAnimCmd_BGP: + call GetBattleAnimByte + ld [wBGP], a + ret + +BattleAnimCmd_OBP0: + call GetBattleAnimByte + ld [wOBP0], a + ret + +BattleAnimCmd_OBP1: + call GetBattleAnimByte + ld [wOBP1], a + ret + +BattleAnimCmd_ResetObp0: + ld a, [wSGB] + and a + ld a, $e0 + jr z, .not_sgb + ld a, $f0 +.not_sgb + ld [wOBP0], a + ret + +BattleAnimCmd_1GFX: +BattleAnimCmd_2GFX: +BattleAnimCmd_3GFX: +BattleAnimCmd_4GFX: +BattleAnimCmd_5GFX: + ld a, [wBattleAnimByte] + and $f + ld c, a + ld hl, wBattleAnimTileDict + xor a + ld [wBattleAnimGFXTempTileID], a +.loop + ld a, [wBattleAnimGFXTempTileID] + cp (vChars1 - vChars0) / LEN_2BPP_TILE - BATTLEANIM_BASE_TILE + ret nc + call GetBattleAnimByte + ld [hli], a + ld a, [wBattleAnimGFXTempTileID] + ld [hli], a + push bc + push hl + ld l, a + ld h, 0 +rept 4 + add hl, hl +endr + ld de, vChars0 tile BATTLEANIM_BASE_TILE + add hl, de + ld a, [wBattleAnimByte] + call LoadBattleAnimGFX + ld a, [wBattleAnimGFXTempTileID] + add c + ld [wBattleAnimGFXTempTileID], a + pop hl + pop bc + dec c + jr nz, .loop + ret + +BattleAnimCmd_IncObj: + call GetBattleAnimByte + ld e, NUM_BATTLE_ANIM_STRUCTS + ld bc, wActiveAnimObjects +.loop + ld hl, BATTLEANIMSTRUCT_INDEX + add hl, bc + ld d, [hl] + ld a, [wBattleAnimByte] + cp d + jr z, .found + ld hl, BATTLEANIMSTRUCT_LENGTH + add hl, bc + ld c, l + ld b, h + dec e + jr nz, .loop + ret + +.found + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ret + +BattleAnimCmd_IncBGEffect: + call GetBattleAnimByte + ld e, NUM_BG_EFFECTS + ld bc, wBGEffect1Function +.loop + ld hl, $0 + add hl, bc + ld d, [hl] + ld a, [wBattleAnimByte] + cp d + jr z, .found + ld hl, BG_EFFECT_STRUCT_LENGTH + add hl, bc + ld c, l + ld b, h + dec e + jr nz, .loop + ret + +.found + ld hl, BG_EFFECT_STRUCT_JT_INDEX + add hl, bc + inc [hl] + ret + +BattleAnimCmd_SetObj: + call GetBattleAnimByte + ld e, NUM_BATTLE_ANIM_STRUCTS + ld bc, wActiveAnimObjects +.loop + ld hl, BATTLEANIMSTRUCT_INDEX + add hl, bc + ld d, [hl] + ld a, [wBattleAnimByte] + cp d + jr z, .found + ld hl, BATTLEANIMSTRUCT_LENGTH + add hl, bc + ld c, l + ld b, h + dec e + jr nz, .loop + ret + +.found + call GetBattleAnimByte + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], a + ret + +BattleAnimCmd_BattlerGFX_1Row: + ld hl, wBattleAnimTileDict +.loop + ld a, [hl] + and a + jr z, .okay + inc hl + inc hl + jr .loop + +.okay + ld a, BATTLE_ANIM_GFX_PLAYERHEAD + ld [hli], a + ld a, ($80 - 6 - 7) - BATTLEANIM_BASE_TILE + ld [hli], a + ld a, BATTLE_ANIM_GFX_ENEMYFEET + ld [hli], a + ld a, ($80 - 6) - BATTLEANIM_BASE_TILE + ld [hl], a + + ld hl, vChars0 tile ($80 - 6 - 7) + ld de, vChars2 tile $06 ; Enemy feet start tile + ld a, 7 tiles ; Enemy pic height + ld [wBattleAnimGFXTempPicHeight], a + ld a, 7 ; Copy 7x1 tiles + call .LoadFeet + ld de, vChars2 tile $31 ; Player head start tile + ld a, 6 tiles ; Player pic height + ld [wBattleAnimGFXTempPicHeight], a + ld a, 6 ; Copy 6x1 tiles + call .LoadFeet + ret + +.LoadFeet: + push af + push hl + push de + lb bc, BANK(@), 1 + call Request2bpp + pop de + ld a, [wBattleAnimGFXTempPicHeight] + ld l, a + ld h, 0 + add hl, de + ld e, l + ld d, h + pop hl + ld bc, 1 tiles + add hl, bc + pop af + dec a + jr nz, .LoadFeet + ret + +BattleAnimCmd_BattlerGFX_2Row: + ld hl, wBattleAnimTileDict +.loop + ld a, [hl] + and a + jr z, .okay + inc hl + inc hl + jr .loop + +.okay + ld a, BATTLE_ANIM_GFX_PLAYERHEAD + ld [hli], a + ld a, ($80 - 6 * 2 - 7 * 2) - BATTLEANIM_BASE_TILE + ld [hli], a + ld a, BATTLE_ANIM_GFX_ENEMYFEET + ld [hli], a + ld a, ($80 - 6 * 2) - BATTLEANIM_BASE_TILE + ld [hl], a + + ld hl, vChars0 tile ($80 - 6 * 2 - 7 * 2) + ld de, vChars2 tile $05 ; Enemy feet start tile + ld a, 7 tiles ; Enemy pic height + ld [wBattleAnimGFXTempPicHeight], a + ld a, 7 ; Copy 7x2 tiles + call .LoadHead + ld de, vChars2 tile $31 ; Player head start tile + ld a, 6 tiles ; Player pic height + ld [wBattleAnimGFXTempPicHeight], a + ld a, 6 ; Copy 6x2 tiles + call .LoadHead + ret + +.LoadHead: + push af + push hl + push de + lb bc, BANK(@), 2 + call Request2bpp + pop de + ld a, [wBattleAnimGFXTempPicHeight] + ld l, a + ld h, 0 + add hl, de + ld e, l + ld d, h + pop hl + ld bc, 2 tiles + add hl, bc + pop af + dec a + jr nz, .LoadHead + ret + +BattleAnimCmd_CheckPokeball: + callfar GetPokeBallWobble + ld a, c + ld [wBattleAnimVar], a + ret + +BattleAnimCmd_Transform: + ld a, [wCurPartySpecies] + push af + + ldh a, [hBattleTurn] + and a + jr z, .player + + ld a, [wTempBattleMonSpecies] + ld [wCurSpecies], a + ld [wCurPartySpecies], a + call GetBaseData + ld hl, wBattleMonDVs + predef GetUnownLetter + ld de, vChars2 tile $00 + call LoadMonFrontSprite + jr .done + +.player + ld a, [wTempEnemyMonSpecies] + ld [wCurSpecies], a + ld [wCurPartySpecies], a + call GetBaseData + ld hl, wEnemyMonDVs + predef GetUnownLetter + ld hl, wMonHBackSprite - wMonHeader + call UncompressMonSprite + ld hl, vChars2 tile $31 + predef GetMonBackpic +.done + pop af + ld [wCurPartySpecies], a + ret + +BattleAnimCmd_RaiseSub: + xor a ; BANK(sScratch) + call OpenSRAM + +GetSubstitutePic: ; used only for BANK(GetSubstitutePic) + ld hl, sScratch + ld bc, (7 * 7) tiles +.loop + xor a + ld [hli], a + dec bc + ld a, c + or b + jr nz, .loop + + ldh a, [hBattleTurn] + and a + jr z, .player + + ld hl, RhydonSpriteGFX + 0 tiles + ld de, sScratch + (2 * 7 + 5) tiles + call .CopyTile + ld hl, RhydonSpriteGFX + 1 tiles + ld de, sScratch + (3 * 7 + 5) tiles + call .CopyTile + ld hl, RhydonSpriteGFX + 2 tiles + ld de, sScratch + (2 * 7 + 6) tiles + call .CopyTile + ld hl, RhydonSpriteGFX + 3 tiles + ld de, sScratch + (3 * 7 + 6) tiles + call .CopyTile + + ld hl, vChars2 tile $00 + ld de, sScratch + lb bc, BANK(GetSubstitutePic), 7 * 7 + call Request2bpp + jr .done + +.player + ld hl, RhydonSpriteGFX + 4 tiles + ld de, sScratch + (2 * 6 + 4) tiles + call .CopyTile + ld hl, RhydonSpriteGFX + 5 tiles + ld de, sScratch + (3 * 6 + 4) tiles + call .CopyTile + ld hl, RhydonSpriteGFX + 6 tiles + ld de, sScratch + (2 * 6 + 5) tiles + call .CopyTile + ld hl, RhydonSpriteGFX + 7 tiles + ld de, sScratch + (3 * 6 + 5) tiles + call .CopyTile + + ld hl, vChars2 tile $31 + ld de, sScratch + lb bc, BANK(GetSubstitutePic), 6 * 6 + call Request2bpp + +.done + call CloseSRAM + ret + +.CopyTile: + ld bc, 1 tiles + ld a, BANK(RhydonSpriteGFX) + call FarCopyData + ret + +BattleAnimCmd_MinimizeOpp: + xor a + call OpenSRAM + +GetMinimizePic: + ld hl, sScratch + ld bc, (7 * 7) tiles +.loop + xor a + ld [hli], a + dec bc + ld a, c + or b + jr nz, .loop + + ldh a, [hBattleTurn] + and a + jr z, .player + + ld de, sScratch + (3 * 7 + 5) tiles + call CopyMinimizePic + ld hl, vChars2 tile $00 + ld de, sScratch + lb bc, BANK(GetMinimizePic), 7 * 7 + call Request2bpp + jr .done + +.player + ld de, sScratch + (3 * 6 + 4) tiles + call CopyMinimizePic + ld hl, vChars2 tile $31 + ld de, sScratch + lb bc, BANK(GetMinimizePic), 6 * 6 + call Request2bpp + +.done + call CloseSRAM + ret + +CopyMinimizePic: + ld hl, MinimizePic + ld bc, $10 + ld a, BANK(MinimizePic) + call FarCopyData + ret + +MinimizePic: +INCBIN "gfx/battle/minimize.2bpp" + +BattleAnimCmd_DropSub: + ld a, [wCurPartySpecies] + push af + ldh a, [hBattleTurn] + and a + jr z, .player + + callfar DropEnemySub + jr .done + +.player + callfar DropPlayerSub + +.done + pop af + ld [wCurPartySpecies], a + ret + +BattleAnimCmd_OAMOn: + ret + +BattleAnimCmd_OAMOff: + ret + +BattleAnimCmd_KeepSprites: + ld hl, wBattleAnimFlags + set BATTLEANIM_KEEPSPRITES_F, [hl] + ret + +BattleAnimCmd_F5: + ret + +BattleAnimCmd_F6: + ret + +BattleAnimCmd_F7: + ret + +BattleAnimCmd_Sound: + call GetBattleAnimByte + ld e, a + srl a + srl a + ld [wSFXDuration], a + call .GetCryTrack + maskbits NUM_NOISE_CHANS + ld [wCryTracks], a + + ld e, a + ld d, 0 + ld hl, .GetPanning + add hl, de + ld a, [hl] + ld [wStereoPanningMask], a + + call GetBattleAnimByte + ld e, a + ld d, 0 + callfar PlayStereoSFX + + ret + +.GetPanning: + db $f0, $0f, $f0, $0f + +.GetCryTrack: + ldh a, [hBattleTurn] + and a + jr nz, .enemy + + ld a, e + ret + +.enemy + ld a, e + xor 1 + ret + +BattleAnimCmd_Cry: + call GetBattleAnimByte + maskbits NUM_NOISE_CHANS + ld e, a + ld d, 0 + ld hl, .CryData +rept 2 + add hl, de +endr + + ldh a, [hBattleTurn] + and a + jr nz, .enemy + + ld a, $f0 + ld [wCryTracks], a + ld a, [wTempBattleMonSpecies] + jr .done_cry_tracks + +.enemy + ld a, $0f + ld [wCryTracks], a + ld a, [wTempEnemyMonSpecies] +.done_cry_tracks + push hl + call LoadCryHeader + pop hl + + ld b, $00 + push hl + ld c, [hl] + ld hl, wCryPitch + ld a, [hli] + ld h, [hl] + ld l, a + add hl, bc + ld a, l + ld [wCryPitch], a + ld a, h + ld [wCryPitch + 1], a + pop hl + + inc hl + ld c, [hl] + ld hl, wCryLength + ld a, [hli] + ld h, [hl] + ld l, a + add hl, de + + ld a, l + ld [wCryLength], a + ld a, h + ld [wCryLength + 1], a + ld a, 1 + ld [wStereoPanningMask], a + + callfar _PlayCryHeader + ret + +.CryData: +; +pitch, +length + db $00, $c0 + db $00, $40 + db $00, $c0 + db $00, $c0 + +BattleAnimAssignPals: + ld a, [wSGB] + and a + ld a, %11100000 + jr z, .sgb + ld a, %11110000 +.sgb + ld [wOBP0], a + ld a, %11100100 + ld [wBGP], a + ld [wOBP1], a + ; Fallthrough + +; Clear animation block +ClearBattleAnims: + ld hl, wLYOverrides + ld bc, wBattleAnimTempPalette - wLYOverrides ; should be wBattleAnimEnd - wLYOverrides? +.loop + ld [hl], 0 + inc hl + dec bc + ld a, c + or b + jr nz, .loop + + ld hl, wFXAnimID + ld e, [hl] + inc hl + ld d, [hl] + ld hl, BattleAnimations + add hl, de + add hl, de + call GetBattleAnimPointer + ret + +BattleAnim_SetPals: + ld a, 1 + ldh [hBGMapMode], a + ld a, %11100100 + ld [wBGP], a + ld [wOBP0], a + ld [wOBP1], a + ldh [rBGP], a + ldh [rOBP0], a + ldh [rOBP1], a + xor a + ldh [hSCX], a + ldh [hSCY], a + ret + +BattleAnim_UpdateOAM_All: + ld a, $00 + ld [wBattleAnimOAMPointerLo], a + ld hl, wActiveAnimObjects + ld e, NUM_BATTLE_ANIM_STRUCTS + +.loop + ld a, [hl] + and a + jr z, .next + ld c, l + ld b, h + push hl + push de + call DoBattleAnimFrame + call BattleAnimOAMUpdate + pop de + pop hl + jr c, .done + +.next + ld bc, BATTLEANIMSTRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop + ld a, [wBattleAnimOAMPointerLo] + ld l, a + ld h, HIGH(wShadowOAM) + +.loop2 + ld a, l + cp LOW(wShadowOAMEnd) + jr nc, .done + xor a + ld [hli], a + jr .loop2 + +.done + ret diff --git a/engine/battle_anims/bg_effects.asm b/engine/battle_anims/bg_effects.asm index da2cea6..6e97599 100644 --- a/engine/battle_anims/bg_effects.asm +++ b/engine/battle_anims/bg_effects.asm @@ -14,7 +14,7 @@ SECTION "engine/battle_anims/bg_effects.asm", ROMX ExecuteBGEffects: ld hl, wActiveBGEffects - ld e, 5 + ld e, NUM_BG_EFFECTS .loop ld a, [hl] and a @@ -27,7 +27,7 @@ ExecuteBGEffects: pop de pop hl .next - ld bc, 4 + ld bc, BG_EFFECT_STRUCT_LENGTH add hl, bc dec e jr nz, .loop @@ -35,12 +35,12 @@ ExecuteBGEffects: QueueBGEffect: ld hl, wActiveBGEffects - ld e, 5 + ld e, NUM_BG_EFFECTS .loop ld a, [hl] and a jr z, .load - ld bc, 4 + ld bc, BG_EFFECT_STRUCT_LENGTH add hl, bc dec e jr nz, .loop @@ -52,13 +52,13 @@ QueueBGEffect: ld b, h ld hl, BG_EFFECT_STRUCT_FUNCTION add hl, bc - ld a, [wBattleAnimTemp0] + ld a, [wBattleBGEffectTempID] ld [hli], a - ld a, [wBattleAnimTemp1] + ld a, [wBattleBGEffectTempJumptableIndex] ld [hli], a - ld a, [wBattleAnimTemp2] + ld a, [wBattleBGEffectTempTurn] ld [hli], a - ld a, [wBattleAnimTemp3] + ld a, [wBattleBGEffectTempParam] ld [hl], a ret @@ -89,53 +89,46 @@ BattleBGEffects: dw BattleBGEffect_WhiteHues dw BattleBGEffect_BlackHues dw BattleBGEffect_AlternateHues - dw BattleBGEffect_06 - dw BattleBGEffect_07 - dw BattleBGEffect_08 + dw BattleBGEffect_CycleOBPals + dw BattleBGEffect_CycleMidOBPals + dw BattleBGEffect_CycleBGPals_Inverted dw BattleBGEffect_HideMon dw BattleBGEffect_ShowMon dw BattleBGEffect_EnterMon dw BattleBGEffect_ReturnMon dw BattleBGEffect_Surf - ;dw BattleBGEffect_Whirlpool dw BattleBGEffect_Teleport dw BattleBGEffect_NightShade - dw BattleBGEffect_FeetFollow - dw BattleBGEffect_HeadFollow + dw BattleBGEffect_BattlerObj_1Row + dw BattleBGEffect_BattlerObj_2Row dw BattleBGEffect_DoubleTeam dw BattleBGEffect_AcidArmor dw BattleBGEffect_RapidFlash - dw BattleBGEffect_16 - dw BattleBGEffect_17 - dw BattleBGEffect_18 - dw BattleBGEffect_19 - dw BattleBGEffect_1a - dw BattleBGEffect_1b - dw BattleBGEffect_1c - dw BattleBGEffect_1d - dw BattleBGEffect_1e - dw BattleBGEffect_1f - dw BattleBGEffect_20 + dw BattleBGEffect_FadeMonToLight + dw BattleBGEffect_FadeMonToBlack + dw BattleBGEffect_FadeMonToLightRepeating + dw BattleBGEffect_FadeMonToBlackRepeating + dw BattleBGEffect_CycleMonLightDarkRepeating + dw BattleBGEffect_FlashMonRepeating + dw BattleBGEffect_FadeMonsToBlackRepeating + dw BattleBGEffect_FadeMonToWhiteWaitFadeBack + dw BattleBGEffect_FadeMonFromWhite + dw BattleBGEffect_ShakeScreenX + dw BattleBGEffect_ShakeScreenY dw BattleBGEffect_Withdraw dw BattleBGEffect_BounceDown dw BattleBGEffect_Dig dw BattleBGEffect_Tackle - ;dw BattleBGEffect_25 - dw BattleBGEffect_26 - dw BattleBGEffect_27 - dw BattleBGEffect_28 + dw BattleBGEffect_WobbleMon + dw BattleBGEffect_RemoveMon + dw BattleBGEffect_WaveDeformMon dw BattleBGEffect_Psychic - dw BattleBGEffect_2a - dw BattleBGEffect_2b - dw BattleBGEffect_2c - dw BattleBGEffect_2d - dw BattleBGEffect_2e - dw BattleBGEffect_2f - ;dw BattleBGEffect_30 - ;dw BattleBGEffect_31 - ;dw BattleBGEffect_32 - ;dw BattleBGEffect_VibrateMon - ;dw BattleBGEffect_WobbleMon + dw BattleBGEffect_BetaSendOutMon1 + dw BattleBGEffect_BetaSendOutMon2 + dw BattleBGEffect_Flail + dw BattleBGEffect_BetaPursuit + dw BattleBGEffect_Rollout + dw BattleBGEffect_VitalThrow BattleBGEffect_End: @@ -160,7 +153,7 @@ BatttleBGEffects_GetNamedJumptablePointer: ld l, a ret -BattleBGEffects_IncrementJumptable: +BattleBGEffects_IncAnonJumptableIndex: ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc inc [hl] @@ -172,8 +165,8 @@ BattleBGEffect_FlashInverted: ret .inverted - db %11100100 - db %00011011 + dc 3, 2, 1, 0 + dc 0, 1, 2, 3 BattleBGEffect_FlashWhite: ld de, .white @@ -181,13 +174,13 @@ BattleBGEffect_FlashWhite: ret .white - db %11100100 - db %00000000 + dc 3, 2, 1, 0 + dc 0, 0, 0, 0 BattleBGEffect_FlashContinue: ; current timer, flash duration, number of flashes ld a, $1 - ld [wBattleAnimTemp0], a + ld [wBattleBGEffectTempID], a ; unused? ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc ld a, [hl] @@ -203,7 +196,7 @@ BattleBGEffect_FlashContinue: ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc ld [hl], a - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] and a @@ -234,9 +227,9 @@ BattleBGEffect_WhiteHues: ret .Pals: - db %11100100 - db %11100000 - db %11010000 + dc 3, 2, 1, 0 + dc 3, 2, 0, 0 + dc 3, 1, 0, 0 db -1 BattleBGEffect_BlackHues: @@ -251,9 +244,9 @@ BattleBGEffect_BlackHues: ret .Pals: - db %11100100 - db %11110100 - db %11111000 + dc 3, 2, 1, 0 + dc 3, 3, 1, 0 + dc 3, 3, 2, 0 db -1 BattleBGEffect_AlternateHues: @@ -269,20 +262,20 @@ BattleBGEffect_AlternateHues: ret .Pals: - db %11100100 - db %11111000 - db %11111100 - db %11111000 - db %11100100 - db %10010000 - db %01000000 - db %10010000 + dc 3, 2, 1, 0 + dc 3, 3, 2, 0 + dc 3, 3, 3, 0 + dc 3, 3, 2, 0 + dc 3, 2, 1, 0 + dc 2, 1, 0, 0 + dc 1, 0, 0, 0 + dc 2, 1, 0, 0 db -2 -BattleBGEffect_06: +BattleBGEffect_CycleOBPals: call BattleBGEffects_CheckSGB jr nz, .sgb - ld de, .PalsCGB + ld de, .PalsGB jr .okay .sgb @@ -292,20 +285,20 @@ BattleBGEffect_06: ld [wOBP0], a ret -.PalsCGB: - db %11100100 - db %10010000 +.PalsGB: + dc 3, 2, 1, 0 + dc 2, 1, 0, 0 db -2 .PalsSGB: - db %11110000 - db %11000000 + dc 3, 3, 0, 0 + dc 3, 0, 0, 0 db -2 -BattleBGEffect_07: +BattleBGEffect_CycleMidOBPals: call BattleBGEffects_CheckSGB jr nz, .sgb - ld de, .PalsCGB + ld de, .PalsGB jr .okay .sgb @@ -315,26 +308,26 @@ BattleBGEffect_07: ld [wOBP0], a ret -.PalsCGB: - db %11100100 - db %11011000 +.PalsGB: + dc 3, 2, 1, 0 + dc 3, 1, 2, 0 db -2 .PalsSGB: - db %11110000 - db %11001100 + dc 3, 3, 0, 0 + dc 3, 0, 3, 0 db -2 -BattleBGEffect_08: +BattleBGEffect_CycleBGPals_Inverted: ld de, .Pals call BattleBGEffect_GetNthDMGPal ld [wBGP], a ret .Pals: - db %00011011 - db %01100011 - db %10000111 + dc 0, 1, 2, 3 + dc 1, 2, 0, 3 + dc 2, 0, 1, 3 db -2 BattleBGEffect_HideMon: @@ -342,14 +335,14 @@ BattleBGEffect_HideMon: jp hl .anon_dw dw .zero - dw BattleBGEffects_IncrementJumptable - dw BattleBGEffects_IncrementJumptable - dw BattleBGEffects_IncrementJumptable + dw BattleBGEffects_IncAnonJumptableIndex + dw BattleBGEffects_IncAnonJumptableIndex + dw BattleBGEffects_IncAnonJumptableIndex dw .four .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex push bc call BGEffect_CheckBattleTurn jr nz, .player_side @@ -389,9 +382,9 @@ BattleBGEffect_ShowMon: ld de, .PlayerData .got_pointer ld a, e - ld [wBattleAnimTemp1], a + ld [wBattlePicResizeTempPointer], a ld a, d - ld [wBattleAnimTemp2], a + ld [wBattlePicResizeTempPointer + 1], a call BattleBGEffect_RunPicResizeScript ret @@ -402,15 +395,15 @@ BattleBGEffect_ShowMon: db 3, $00, 3 db -1 -BattleBGEffect_FeetFollow: +BattleBGEffect_BattlerObj_1Row: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one - dw BattleBGEffects_IncrementJumptable - dw BattleBGEffects_IncrementJumptable - dw BattleBGEffects_IncrementJumptable + dw BattleBGEffects_IncAnonJumptableIndex + dw BattleBGEffects_IncAnonJumptableIndex + dw BattleBGEffects_IncAnonJumptableIndex dw .five @@ -421,39 +414,39 @@ BattleBGEffect_FeetFollow: ret .not_flying_digging - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex push bc call BGEffect_CheckBattleTurn - jr nz, .player_turn - ld a, ANIM_OBJ_PLAYERFEETFOLLOW - ld [wBattleAnimTemp0], a - ld a, 16 * 8 + 4 + jr nz, .player_side + ld a, BATTLE_ANIM_OBJ_ENEMYFEET_1ROW + ld [wBattleBGEffectTempID], a + ld a, 16 * TILE_WIDTH + 4 jr .okay -.player_turn - ld a, ANIM_OBJ_ENEMYFEETFOLLOW - ld [wBattleAnimTemp0], a - ld a, 6 * 8 +.player_side + ld a, BATTLE_ANIM_OBJ_PLAYERHEAD_1ROW + ld [wBattleBGEffectTempID], a + ld a, 6 * TILE_WIDTH .okay - ld [wBattleAnimTemp1], a - ld a, 8 * 8 - ld [wBattleAnimTemp2], a + ld [wBattleObjectTempXCoord], a + ld a, 8 * TILE_WIDTH + ld [wBattleObjectTempYCoord], a xor a - ld [wBattleAnimTemp3], a + ld [wBattleObjectTempParam], a call _QueueBattleAnimation pop bc ret .one - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex push bc call BGEffect_CheckBattleTurn - jr nz, .player_turn_2 + jr nz, .player_side_2 hlcoord 12, 6 lb bc, 1, 7 jr .okay2 -.player_turn_2 +.player_side_2 hlcoord 2, 6 lb bc, 1, 6 .okay2 @@ -469,15 +462,15 @@ BattleBGEffect_FeetFollow: call EndBattleBGEffect ret -BattleBGEffect_HeadFollow: +BattleBGEffect_BattlerObj_2Row: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one - dw BattleBGEffects_IncrementJumptable - dw BattleBGEffects_IncrementJumptable - dw BattleBGEffects_IncrementJumptable + dw BattleBGEffects_IncAnonJumptableIndex + dw BattleBGEffects_IncAnonJumptableIndex + dw BattleBGEffects_IncAnonJumptableIndex dw .five @@ -488,39 +481,39 @@ BattleBGEffect_HeadFollow: ret .not_flying_digging - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex push bc call BGEffect_CheckBattleTurn - jr nz, .player_turn - ld a, ANIM_OBJ_PLAYERHEADFOLLOW - ld [wBattleAnimTemp0], a - ld a, 16 * 8 + 4 + jr nz, .player_side + ld a, BATTLE_ANIM_OBJ_ENEMYFEET_2ROW + ld [wBattleBGEffectTempID], a + ld a, 16 * TILE_WIDTH + 4 jr .okay -.player_turn - ld a, ANIM_OBJ_ENEMYHEADFOLLOW - ld [wBattleAnimTemp0], a - ld a, 6 * 8 +.player_side + ld a, BATTLE_ANIM_OBJ_PLAYERHEAD_2ROW + ld [wBattleBGEffectTempID], a + ld a, 6 * TILE_WIDTH .okay - ld [wBattleAnimTemp1], a - ld a, 8 * 8 - ld [wBattleAnimTemp2], a + ld [wBattleObjectTempXCoord], a + ld a, 8 * TILE_WIDTH + ld [wBattleObjectTempYCoord], a xor a - ld [wBattleAnimTemp3], a + ld [wBattleObjectTempParam], a call _QueueBattleAnimation pop bc ret .one - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex push bc call BGEffect_CheckBattleTurn - jr nz, .player_turn_2 + jr nz, .player_side_2 hlcoord 12, 5 lb bc, 2, 7 jr .okay2 -.player_turn_2 +.player_side_2 hlcoord 2, 6 lb bc, 2, 6 .okay2 @@ -540,22 +533,22 @@ _QueueBattleAnimation: callfar QueueBattleAnimation ret -BattleBGEffect_27: +; Slides mon out of screen. +BattleBGEffect_RemoveMon: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one - dw BattleBGEffects_IncrementJumptable - dw BattleBGEffects_IncrementJumptable + dw BattleBGEffects_IncAnonJumptableIndex + dw BattleBGEffects_IncAnonJumptableIndex dw .four - .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BGEffect_CheckBattleTurn ld [hl], a - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld [hl], $8 ret @@ -606,8 +599,8 @@ BattleBGEffect_27: .okay2 ld a, $1 ldh [hBGMapMode], a - call BattleBGEffects_IncrementJumptable - ld hl, BG_EFFECT_STRUCT_03 + call BattleBGEffects_IncAnonJumptableIndex + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc dec [hl] ret @@ -615,7 +608,7 @@ BattleBGEffect_27: .four xor a ldh [hBGMapMode], a - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] and a @@ -639,9 +632,9 @@ BattleBGEffect_EnterMon: ld de, .PlayerData .okay ld a, e - ld [wBattleAnimTemp1], a + ld [wBattlePicResizeTempPointer], a ld a, d - ld [wBattleAnimTemp2], a + ld [wBattlePicResizeTempPointer + 1], a call BattleBGEffect_RunPicResizeScript ret @@ -666,9 +659,9 @@ BattleBGEffect_ReturnMon: ld de, .PlayerData .okay ld a, e - ld [wBattleAnimTemp1], a + ld [wBattlePicResizeTempPointer], a ld a, d - ld [wBattleAnimTemp2], a + ld [wBattlePicResizeTempPointer + 1], a call BattleBGEffect_RunPicResizeScript ret @@ -696,22 +689,22 @@ BattleBGEffect_RunPicResizeScript: jp hl .anon_dw dw .zero - dw BattleBGEffects_IncrementJumptable - dw BattleBGEffects_IncrementJumptable - dw BattleBGEffects_IncrementJumptable + dw BattleBGEffects_IncAnonJumptableIndex + dw BattleBGEffects_IncAnonJumptableIndex + dw BattleBGEffects_IncAnonJumptableIndex dw .restart dw .end .zero - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld e, [hl] ld d, $0 inc [hl] - ld a, [wBattleAnimTemp1] + ld a, [wBattlePicResizeTempPointer] ld l, a - ld a, [wBattleAnimTemp2] + ld a, [wBattlePicResizeTempPointer + 1] ld h, a add hl, de add hl, de @@ -725,7 +718,7 @@ BattleBGEffect_RunPicResizeScript: jr z, .skip call .PlaceGraphic .skip - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex ld a, $1 ldh [hBGMapMode], a ret @@ -799,7 +792,7 @@ BattleBGEffect_RunPicResizeScript: pop hl inc hl ld a, [hli] - ld [wBattleAnimTemp0], a + ld [wBattleAnimGFXTempTileID], a ; get coord push de ld e, [hl] @@ -815,7 +808,7 @@ BattleBGEffect_RunPicResizeScript: .row push bc push hl - ld a, [wBattleAnimTemp0] + ld a, [wBattleAnimGFXTempTileID] ld b, a .col ld a, [de] @@ -902,7 +895,7 @@ BattleBGEffect_Surf: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex lb de, 4, 1 call InitSurfWaves @@ -918,38 +911,37 @@ BattleBGEffect_Surf: .RotatewSurfWaveBGEffect: ld hl, wLYOverrides ld de, wLYOverrides2 + 1 -.asm_c853e: ld bc, wLYOverrides2 ld a, [bc] push af ld a, $7f -.asm_c8545: +.loop: push af ld a, [de] -.asm_c8547: ld [bc], a ldh a, [hLYOverrideStart] cp l - jr nc, .asm_c8555 + jr nc, .load_zero ldh a, [hLYOverrideEnd] cp l - jr c, .asm_c8555 + jr c, .load_zero ld a, [de] - jr .asm_c8556 + jr .okay -.asm_c8555: +.load_zero xor a -.asm_c8556: +.okay ld [hli], a inc de inc bc pop af dec a - jr nz, .asm_c8545 + jr nz, .loop pop af ld [bc], a ret +; Hardcoded to always affect opponent. BattleBGEffect_Psychic: call BattleBGEffects_AnonJumptable jp hl @@ -960,7 +952,7 @@ BattleBGEffect_Psychic: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) ldh [hLCDCPointer], a @@ -969,14 +961,14 @@ BattleBGEffect_Psychic: ld a, $5f ldh [hLYOverrideEnd], a lb de, 6, 5 - call Functionc8f2e - ld hl, BG_EFFECT_STRUCT_03 + call DeformScreen + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld [hl], $0 ret .one - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] inc [hl] @@ -999,12 +991,12 @@ BattleBGEffect_Teleport: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms lb de, 6, 5 - call Functionc8f2e + call DeformScreen ret .one @@ -1025,15 +1017,15 @@ BattleBGEffect_NightShade: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCY) call BattleBGEffect_SetLCDStatCustoms - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld e, [hl] ld d, 3 - call Functionc8f2e + call DeformScreen ret .one @@ -1057,7 +1049,7 @@ BattleBGEffect_DoubleTeam: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms @@ -1067,7 +1059,7 @@ BattleBGEffect_DoubleTeam: ret .one - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] cp $10 @@ -1077,7 +1069,7 @@ BattleBGEffect_DoubleTeam: ret .three - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] cp $ff @@ -1087,7 +1079,7 @@ BattleBGEffect_DoubleTeam: ret .next - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex ret .two @@ -1096,7 +1088,7 @@ BattleBGEffect_DoubleTeam: ld a, [hl] ld d, $2 call BattleBGEffects_Sine - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc add [hl] call .UpdateLYOverrides @@ -1144,15 +1136,15 @@ BattleBGEffect_AcidArmor: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCY) call BattleBGEffect_SetLCDStatCustoms - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld e, [hl] ld d, 3 - call Functionc8f2e + call DeformScreen ret .one @@ -1186,7 +1178,7 @@ BattleBGEffect_Withdraw: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCY) call BattleBGEffect_SetLCDStatCustoms @@ -1199,7 +1191,7 @@ BattleBGEffect_Withdraw: ret .one - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] and $3f @@ -1209,8 +1201,8 @@ BattleBGEffect_Withdraw: ld a, [hl] cp d ret nc - call BGEffect_DisplaceLYOverridesBackup - ld hl, BG_EFFECT_STRUCT_03 + call BGEffect_DisplaceLYOverrides + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] rlca @@ -1237,7 +1229,7 @@ BattleBGEffect_Dig: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCY) call BattleBGEffect_SetLCDStatCustoms @@ -1247,13 +1239,13 @@ BattleBGEffect_Dig: ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld [hl], $2 - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld [hl], $0 ret .one - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] and a @@ -1263,7 +1255,7 @@ BattleBGEffect_Dig: .next ld [hl], $10 - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex .two ldh a, [hLYOverrideStart] ld l, a @@ -1283,7 +1275,7 @@ BattleBGEffect_Dig: dec [hl] .skip pop af - call BGEffect_DisplaceLYOverridesBackup + call BGEffect_DisplaceLYOverrides ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc inc [hl] @@ -1299,20 +1291,23 @@ BattleBGEffect_Tackle: jp hl .anon_dw dw .zero - dw Tackle_BGEffect25_2d_one - dw Tackle_BGEffect25_2d_two + dw Tackle_MoveForward + dw Tackle_ReturnMove dw .three .zero - call BattleBGEffects_IncrementJumptable +; Prepares mon to move forward (player moves right, enemy moves left). +; BG_EFFECT_STRUCT_PARAM will keep track of distance moved, so it's reset to 0 here. +; BG_EFFECT_STRUCT_BATTLE_TURN is set to 2 or -2 depending on target. + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld [hl], $0 call BGEffect_CheckBattleTurn @@ -1330,80 +1325,88 @@ BattleBGEffect_Tackle: call BattleAnim_ResetLCDStatCustom ret -Tackle_BGEffect25_2d_one: - ld hl, BG_EFFECT_STRUCT_03 +; Moves user horizontally in a direction that can be positive or negative. When the limit is reached (8 pixels) we move to the next function in the jumptable (Tackle_ReturnMove). +; BG_EFFECT_STRUCT_BATTLE_TURN: speed and direction. +; BG_EFFECT_STRUCT_PARAM: keeps track of distance moved. +Tackle_MoveForward: + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] cp -8 jr z, .reached_limit - cp 8 + cp 8 jr nz, .finish .reached_limit - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex .finish - call Functionc88a5 + call Tackle_FillLYOverrides ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc add [hl] ld [hl], a ret -Tackle_BGEffect25_2d_two: - ld hl, BG_EFFECT_STRUCT_03 +; Move user horizontally back to initial position. When we back to position 0, we move to the next function in the jumptable. +; BG_EFFECT_STRUCT_BATTLE_TURN: is turned into a negative number (this number is not saved to preserve the initial number). +; BG_EFFECT_STRUCT_PARAM: keeps track of distance moved. +Tackle_ReturnMove: + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] and a - jr nz, .asm_c8893 - call BattleBGEffects_IncrementJumptable -.asm_c8893 - call Functionc88a5 + jr nz, .move_back + call BattleBGEffects_IncAnonJumptableIndex +.move_back + call Tackle_FillLYOverrides ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] xor $ff inc a - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc add [hl] ld [hl], a ret -Functionc88a5: +Tackle_FillLYOverrides: push af -.asm_c87ab: +.wait ldh a, [rLY] cp $60 - jr c, .asm_c87ab + jr c, .wait pop af - call BGEffect_FillLYOverridesBackup + call BGEffect_FillLYOverrides ret -BattleBGEffect_2d: +BattleBGEffect_BetaPursuit: ; unused call BattleBGEffects_AnonJumptable jp hl .anon_dw - dw BGEffect2d_2f_zero - dw Tackle_BGEffect25_2d_one - dw Tackle_BGEffect25_2d_two + dw VitalThrow_MoveBackwards + dw Tackle_MoveForward + dw Tackle_ReturnMove dw .three - + .three call BattleAnim_ResetLCDStatCustom ret -BGEffect2d_2f_zero: - call BattleBGEffects_IncrementJumptable +; Prepares mon to move back back (player moves left, enemy moves right). +; BG_EFFECT_STRUCT_PARAM: keeps track of distance moved, so it's reset to 0 here. +VitalThrow_MoveBackwards: + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld [hl], $0 call BGEffect_CheckBattleTurn @@ -1417,14 +1420,14 @@ BGEffect2d_2f_zero: ld [hl], a ret -BattleBGEffect_2f: +BattleBGEffect_VitalThrow: call BattleBGEffects_AnonJumptable jp hl .anon_dw - dw BGEffect2d_2f_zero - dw Tackle_BGEffect25_2d_one + dw VitalThrow_MoveBackwards + dw Tackle_MoveForward dw .two - dw Tackle_BGEffect25_2d_two + dw Tackle_ReturnMove dw .four .four @@ -1432,7 +1435,7 @@ BattleBGEffect_2f: .two ret -BattleBGEffect_26: +BattleBGEffect_WobbleMon: call BattleBGEffects_AnonJumptable jp hl .anon_dw @@ -1442,26 +1445,26 @@ BattleBGEffect_26: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld [hl], $0 ret .one - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] ld d, $8 call BattleBGEffects_Sine - call .Functionc8836 - ld hl, BG_EFFECT_STRUCT_03 + call .FillLYOverrides + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] add $4 @@ -1472,17 +1475,17 @@ BattleBGEffect_26: call BattleAnim_ResetLCDStatCustom ret -.Functionc8836: +.FillLYOverrides: push af .loop ldh a, [rLY] cp $60 jr c, .loop pop af - call BGEffect_FillLYOverridesBackup + call BGEffect_FillLYOverrides ret -BattleBGEffect_2c: +BattleBGEffect_Flail: call BattleBGEffects_AnonJumptable jp hl .anon_dw @@ -1492,7 +1495,7 @@ BattleBGEffect_2c: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms @@ -1507,7 +1510,7 @@ BattleBGEffect_2c: ret .one - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] ld d, $6 @@ -1521,13 +1524,13 @@ BattleBGEffect_2c: ld e, a pop af add e - call .Functionc8894 + call .FillOverridesBackup ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] add $8 ld [hl], a - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] add $2 @@ -1538,17 +1541,17 @@ BattleBGEffect_2c: call BattleAnim_ResetLCDStatCustom ret -.Functionc8894: +.FillOverridesBackup: push af -.asm_c8895: +.loop ldh a, [rLY] cp $60 - jr c, .asm_c8895 + jr c, .loop pop af - call BGEffect_FillLYOverridesBackup + call BGEffect_FillLYOverrides ret -BattleBGEffect_28: +BattleBGEffect_WaveDeformMon: call BattleBGEffects_AnonJumptable jp hl .anon_dw @@ -1558,14 +1561,14 @@ BattleBGEffect_28: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms ret .one - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] cp $20 @@ -1573,11 +1576,11 @@ BattleBGEffect_28: inc [hl] ld d, a ld e, 4 - call Functionc8f2e + call DeformScreen ret .two - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] and a @@ -1585,7 +1588,7 @@ BattleBGEffect_28: dec [hl] ld d, a ld e, 4 - call Functionc8f2e + call DeformScreen ret .reset @@ -1602,7 +1605,7 @@ BattleBGEffect_BounceDown: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCY) call BattleBGEffect_SetLCDStatCustoms @@ -1612,7 +1615,7 @@ BattleBGEffect_BounceDown: ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld [hl], $1 - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld [hl], $20 ret @@ -1624,7 +1627,7 @@ BattleBGEffect_BounceDown: cp $38 ret nc push af - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] ld d, $10 @@ -1633,8 +1636,8 @@ BattleBGEffect_BounceDown: ld d, a pop af add d - call BGEffect_DisplaceLYOverridesBackup - ld hl, BG_EFFECT_STRUCT_03 + call BGEffect_DisplaceLYOverrides + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc inc [hl] inc [hl] @@ -1644,7 +1647,7 @@ BattleBGEffect_BounceDown: call BattleAnim_ResetLCDStatCustom ret -BattleBGEffect_2a: +BattleBGEffect_BetaSendOutMon1: call BattleBGEffects_AnonJumptable jp hl .anon_dw @@ -1656,10 +1659,10 @@ BattleBGEffect_2a: dw .five .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex ld a, $e4 call BattleBGEffects_SetLYOverrides - ld a, $47 + ld a, LOW(rBGP) call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a @@ -1676,7 +1679,7 @@ BattleBGEffect_2a: jr .loop .done - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld [hl], $0 .one @@ -1686,23 +1689,23 @@ BattleBGEffect_2a: .two call .GetLYOverride jr nc, .next - call .SetLYOverridesBackup + call .SetLYOverrides ret .next - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld [hl], $0 ldh a, [hLYOverrideStart] inc a ldh [hLYOverrideStart], a - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex ret .three call .GetLYOverride jr nc, .finish - call .SetLYOverridesBackup + call .SetLYOverrides ldh a, [hLYOverrideEnd] dec a ld l, a @@ -1710,10 +1713,10 @@ BattleBGEffect_2a: ret .finish - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex ret -.SetLYOverridesBackup: +.SetLYOverrides: ld e, a ldh a, [hLYOverrideStart] ld l, a @@ -1734,7 +1737,7 @@ BattleBGEffect_2a: ret .GetLYOverride: - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] inc [hl] @@ -1750,10 +1753,13 @@ BattleBGEffect_2a: ret .data - db $00, $40, $90, $e4 + dc 0, 0, 0, 0 + dc 1, 0, 0, 0 + dc 2, 1, 0, 0 + dc 3, 2, 1, 0 db -1 -BattleBGEffect_2b: +BattleBGEffect_BetaSendOutMon2: call BattleBGEffects_AnonJumptable jp hl .anon_dw @@ -1762,7 +1768,7 @@ BattleBGEffect_2b: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms @@ -1784,14 +1790,14 @@ BattleBGEffect_2b: and $f ld d, a ld e, a - call Functionc8f2e + call DeformScreen ret .done call BattleAnim_ResetLCDStatCustom ret -BattleBGEffect_1c: +BattleBGEffect_FadeMonsToBlackRepeating: call BattleBGEffects_AnonJumptable jp hl .anon_dw @@ -1801,7 +1807,7 @@ BattleBGEffect_1c: .zero - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex ld a, $e4 call BattleBGEffects_SetLYOverrides ld a, LOW(rBGP) @@ -1813,7 +1819,7 @@ BattleBGEffect_1c: ret .one - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] inc [hl] @@ -1825,7 +1831,7 @@ BattleBGEffect_1c: push bc call BGEffect_CheckBattleTurn jr nz, .player - ld hl, .CGB_DMGEnemyData + ld hl, .DMG_EnemyData add hl, de ld a, [hli] ld [wOBP1], a @@ -1869,16 +1875,31 @@ BattleBGEffect_1c: jr nz, .loop2 ret -.CGB_DMGEnemyData: - db $e4, $e4 - db $f8, $90 - db $fc, $40 - db $f8, $90 +.DMG_EnemyData: + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + + dc 3, 3, 2, 0 + dc 2, 1, 0, 0 + + dc 3, 3, 3, 0 + dc 1, 0, 0, 0 + + dc 3, 3, 2, 0 + dc 2, 1, 0, 0 + .DMG_PlayerData: - db $e4, $e4 - db $90, $f8 - db $40, $fc - db $90, $f8 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + + dc 2, 1, 0, 0 + dc 3, 3, 2, 0 + + dc 1, 0, 0, 0 + dc 3, 3, 3, 0 + + dc 2, 1, 0, 0 + dc 3, 3, 2, 0 BattleBGEffect_RapidFlash: ld de, .FlashPals @@ -1886,74 +1907,115 @@ BattleBGEffect_RapidFlash: ret .FlashPals: - db $e4, $6c, $fe + dc 3, 2, 1, 0 + dc 1, 2, 3, 0 + db -2 -BattleBGEffect_16: +BattleBGEffect_FadeMonToLight: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: - db $e4, $90, $40, $ff + dc 3, 2, 1, 0 + dc 2, 1, 0, 0 + dc 1, 0, 0, 0 + db -1 -BattleBGEffect_17: +BattleBGEffect_FadeMonToBlack: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: - db $e4, $f8, $fc, $ff + dc 3, 2, 1, 0 + dc 3, 3, 2, 0 + dc 3, 3, 3, 0 + db -1 -BattleBGEffect_18: +BattleBGEffect_FadeMonToLightRepeating: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: - db $e4, $90, $40, $90, $fe + dc 3, 2, 1, 0 + dc 2, 1, 0, 0 + dc 1, 0, 0, 0 + dc 2, 1, 0, 0 + db -2 -BattleBGEffect_19: +BattleBGEffect_FadeMonToBlackRepeating: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: - db $e4, $f8, $fc, $f8, $fe + dc 3, 2, 1, 0 + dc 3, 3, 2, 0 + dc 3, 3, 3, 0 + dc 3, 3, 2, 0 + db -2 -BattleBGEffect_1a: +BattleBGEffect_CycleMonLightDarkRepeating: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: - db $e4, $f8, $fc, $f8, $e4, $90, $40, $90, $fe + dc 3, 2, 1, 0 + dc 3, 3, 2, 0 + dc 3, 3, 3, 0 + dc 3, 3, 2, 0 + dc 3, 2, 1, 0 + dc 2, 1, 0, 0 + dc 1, 0, 0, 0 + dc 2, 1, 0, 0 + db -2 -BattleBGEffect_1b: +BattleBGEffect_FlashMonRepeating: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: - db $e4, $fc, $e4, $00, $fe + dc 3, 2, 1, 0 + dc 3, 3, 3, 0 + dc 3, 2, 1, 0 + dc 0, 0, 0, 0 + db -2 -BattleBGEffect_1d: +BattleBGEffect_FadeMonToWhiteWaitFadeBack: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: - db $e4, $90, $40, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $40, $90, $e4, $ff + dc 3, 2, 1, 0 + dc 2, 1, 0, 0 + dc 1, 0, 0, 0 +rept 11 + dc 0, 0, 0, 0 +endr + dc 1, 0, 0, 0 + dc 2, 1, 0, 0 + dc 3, 2, 1, 0 + db -1 -BattleBGEffect_1e: +BattleBGEffect_FadeMonFromWhite: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: - db $00, $40, $90, $e4, $ff + dc 0, 0, 0, 0 + dc 1, 0, 0, 0 + dc 2, 1, 0, 0 + dc 3, 2, 1, 0 + db -1 -BattleBGEffect_2e: - call Functionc8d0b +BattleBGEffect_Rollout: + call BattleBGEffects_GetShakeAmount jr c, .xor_a bit 7, a jr z, .okay @@ -1963,26 +2025,26 @@ BattleBGEffect_2e: ldh [hSCY], a xor $ff inc a - ld [$c753], a ; wAnimObject01YOffset + ld [wAnimObject1YOffset], a ret -BattleBGEffect_1f: - call Functionc8d0b +BattleBGEffect_ShakeScreenX: + call BattleBGEffects_GetShakeAmount jr nc, .skip xor a .skip ldh [hSCX], a ret -BattleBGEffect_20: - call Functionc8d0b +BattleBGEffect_ShakeScreenY: + call BattleBGEffects_GetShakeAmount jr nc, .skip xor a .skip ldh [hSCY], a ret -Functionc8d0b: +BattleBGEffects_GetShakeAmount: ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc ld a, [hl] @@ -1994,7 +2056,7 @@ Functionc8d0b: .okay dec [hl] - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] and $f @@ -2027,7 +2089,7 @@ BattleBGEffect_GetNthDMGPal: and a jr z, .zero dec [hl] - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] call BattleBGEffect_GetNextDMGPal @@ -2043,6 +2105,7 @@ BattleBGEffect_GetNthDMGPal: call BattleBGEffect_GetFirstDMGPal ret +; Last index in DE: $fe signals a loop, $ff signals end. BGEffect_RapidCyclePals: push de ld de, .Jumptable_DMG @@ -2057,15 +2120,15 @@ BGEffect_RapidCyclePals: .zero_dmg - call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncAnonJumptableIndex ld a, $e4 call BattleBGEffects_SetLYOverrides - ld a, $47 + ld a, LOW(rBGP) call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] ld [hl], $0 @@ -2090,11 +2153,11 @@ BGEffect_RapidCyclePals: ld [hl], a call BattleBGEffect_GetFirstDMGPal jr c, .okay_2_dmg - call BGEffect_FillLYOverridesBackup + call BGEffect_FillLYOverrides ret .okay_2_dmg - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc dec [hl] ret @@ -2107,7 +2170,7 @@ BGEffect_RapidCyclePals: ret BattleBGEffect_GetFirstDMGPal: - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld a, [hl] inc [hl] @@ -2121,7 +2184,7 @@ BattleBGEffect_GetNextDMGPal: cp -2 jr nz, .repeat ld a, [de] - ld hl, BG_EFFECT_STRUCT_03 + ld hl, BG_EFFECT_STRUCT_PARAM add hl, bc ld [hl], $0 .repeat @@ -2136,7 +2199,7 @@ BattleBGEffects_ClearLYOverrides: xor a BattleBGEffects_SetLYOverrides: ld hl, wLYOverrides - ld e, $91 + ld e, LY_VBLANK + 1 .loop ld [hli], a dec e @@ -2177,16 +2240,16 @@ BattleBGEffects_ResetVideoHRAM: call BattleBGEffects_ClearLYOverrides ret -Functionc8f2e: +DeformScreen: push bc xor a - ld [wBattleAnimTemp0], a + ld [wBattleSineWaveTempProgress], a ld a, e - ld [wBattleAnimTemp1], a + ld [wBattleSineWaveTempOffset], a ld a, d - ld [wBattleAnimTemp2], a + ld [wBattleSineWaveTempAmplitude], a ld a, $80 - ld [wBattleAnimTemp3], a + ld [wBattleSineWaveTempTimer], a ld bc, wLYOverrides .loop ldh a, [hLYOverrideStart] @@ -2195,18 +2258,18 @@ Functionc8f2e: ldh a, [hLYOverrideEnd] cp c jr c, .next - ld a, [wBattleAnimTemp2] + ld a, [wBattleSineWaveTempAmplitude] ld d, a - ld a, [wBattleAnimTemp0] + ld a, [wBattleSineWaveTempProgress] call BattleBGEffects_Sine ld [bc], a .next inc bc - ld a, [wBattleAnimTemp1] - ld hl, wBattleAnimTemp0 + ld a, [wBattleSineWaveTempOffset] + ld hl, wBattleSineWaveTempProgress add [hl] ld [hl], a - ld hl, wBattleAnimTemp3 + ld hl, wBattleSineWaveTempTimer dec [hl] jr nz, .loop pop bc @@ -2215,26 +2278,26 @@ Functionc8f2e: InitSurfWaves: push bc xor a - ld [wBattleAnimTemp0], a + ld [wBattleSineWaveTempProgress], a ld a, e - ld [wBattleAnimTemp1], a + ld [wBattleSineWaveTempOffset], a ld a, d - ld [wBattleAnimTemp2], a + ld [wBattleSineWaveTempAmplitude], a ld a, $80 - ld [wBattleAnimTemp3], a + ld [wBattleSineWaveTempTimer], a ld bc, wLYOverrides2 .loop - ld a, [wBattleAnimTemp2] + ld a, [wBattleSineWaveTempAmplitude] ld d, a - ld a, [wBattleAnimTemp0] + ld a, [wBattleSineWaveTempProgress] call BattleBGEffects_Sine ld [bc], a inc bc - ld a, [wBattleAnimTemp1] - ld hl, wBattleAnimTemp0 + ld a, [wBattleSineWaveTempOffset] + ld hl, wBattleSineWaveTempProgress add [hl] ld [hl], a - ld hl, wBattleAnimTemp3 + ld hl, wBattleSineWaveTempTimer dec [hl] jr nz, .loop pop bc @@ -2267,7 +2330,7 @@ BattleBGEffect_WavyScreenFX: pop bc ret -BGEffect_FillLYOverridesBackup: +BGEffect_FillLYOverrides: push af ld h, HIGH(wLYOverrides) ldh a, [hLYOverrideStart] @@ -2282,8 +2345,9 @@ BGEffect_FillLYOverridesBackup: jr nz, .loop ret -BGEffect_DisplaceLYOverridesBackup: - ; e = a; d = [hLYOverrideEnd] - [hLYOverrideStart] - a +; e = a. +; d = [hLYOverrideEnd] - [hLYOverrideStart] - a. +BGEffect_DisplaceLYOverrides: push af ld e, a ldh a, [hLYOverrideStart] @@ -2324,13 +2388,13 @@ BGEffect_CheckFlyDigStatus: and $1 xor [hl] jr nz, .player - ld a, [wEnemySubStatus3] ; EnemySubStatus3 - bit 6, a + ld a, [wEnemySubStatus3] + bit SUBSTATUS_INVULNERABLE, a ret .player - ld a, [wPlayerSubStatus3] ; PlayerSubStatus3 - bit 6, a + ld a, [wPlayerSubStatus3] + bit SUBSTATUS_INVULNERABLE, a ret BattleBGEffects_CheckSGB: diff --git a/engine/battle_anims/core.asm b/engine/battle_anims/core.asm new file mode 100644 index 0000000..8f0fee1 --- /dev/null +++ b/engine/battle_anims/core.asm @@ -0,0 +1,308 @@ +INCLUDE "constants.asm" + +SECTION "engine/dumps/bank33.asm", ROMX + +QueueBattleAnimation: + ld hl, wActiveAnimObjects + ld e, NUM_BATTLE_ANIM_STRUCTS +.loop + ld a, [hl] + and a + jr z, .done + ld bc, BATTLEANIMSTRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop + scf + ret + +.done + ld c, l + ld b, h + ld hl, wLastAnimObjectIndex + inc [hl] + call InitBattleAnimation + ret + +DeinitBattleAnimation: + ld hl, BATTLEANIMSTRUCT_INDEX + add hl, bc + ld [hl], $0 + ret + +InitBattleAnimation: + ld a, [wBattleObjectTempID] + ld e, a + ld d, 0 + ld hl, BattleAnimObjects +rept BATTLEANIMOBJ_LENGTH + add hl, de +endr + ld e, l + ld d, h + ld hl, BATTLEANIMSTRUCT_INDEX + add hl, bc + ld a, [wLastAnimObjectIndex] + ld [hli], a ; BATTLEANIMSTRUCT_INDEX + ld a, [de] + inc de + ld [hli], a ; BATTLEANIMSTRUCT_OAMFLAGS + ld a, [de] + inc de + ld [hli], a ; BATTLEANIMSTRUCT_FIX_Y + ld a, [de] + inc de + ld [hli], a ; BATTLEANIMSTRUCT_FRAMESET_ID + ld a, [de] + inc de + ld [hli], a ; BATTLEANIMSTRUCT_FUNCTION + ld a, [de] + call GetBattleAnimTileOffset + ld [hli], a ; BATTLEANIMSTRUCT_TILEID + ld a, [wBattleObjectTempXCoord] + ld [hli], a ; BATTLEANIMSTRUCT_XCOORD + ld a, [wBattleObjectTempYCoord] + ld [hli], a ; BATTLEANIMSTRUCT_YCOORD + xor a + ld [hli], a ; BATTLEANIMSTRUCT_XOFFSET + ld [hli], a ; BATTLEANIMSTRUCT_YOFFSET + ld a, [wBattleObjectTempParam] + ld [hli], a ; BATTLEANIMSTRUCT_PARAM + xor a + ld [hli], a ; BATTLEANIMSTRUCT_DURATION + dec a + ld [hli], a ; BATTLEANIMSTRUCT_FRAME + xor a + ld [hli], a ; BATTLEANIMSTRUCT_JUMPTABLE_INDEX + ld [hli], a ; BATTLEANIMSTRUCT_VAR1 + ld [hl], a ; BATTLEANIMSTRUCT_VAR2 + ret + +BattleAnimOAMUpdate: + call InitBattleAnimBuffer + call GetBattleAnimFrame + cp oamwait_command + jr z, .done + cp oamdelete_command + jr z, .delete + + push af + ld hl, wBattleAnimTempOAMFlags + ld a, [wBattleAnimTempFrameOAMFlags] + xor [hl] + and PRIORITY | Y_FLIP | X_FLIP + ld [hl], a + pop af + + push bc + call GetBattleAnimOAMPointer + ld a, [wBattleAnimTempTileID] + add [hl] ; tile offset + ld [wBattleAnimTempTileID], a + inc hl + ld a, [hli] ; oam data length + ld c, a + ld a, [hli] ; oam data pointer + ld h, [hl] + ld l, a + ld a, [wBattleAnimOAMPointerLo] + ld e, a + ld d, HIGH(wShadowOAM) + +.loop + ; Y Coord + ld a, [wBattleAnimTempYCoord] + ld b, a + ld a, [wBattleAnimTempYOffset] + add b + ld b, a + call .XFlip + add b + ld [de], a + + ; X Coord + inc hl + inc de + ld a, [wBattleAnimTempXCoord] + ld b, a + ld a, [wBattleAnimTempXOffset] + add b + ld b, a + call .YFlip + add b + ld [de], a + + ; Tile ID + inc hl + inc de + ld a, [wBattleAnimTempTileID] + add BATTLEANIM_BASE_TILE + add [hl] + ld [de], a + + ; Attributes + inc hl + inc de + call .UpdateAttributes + ld [de], a + + inc hl + inc de + ld a, e + ld [wBattleAnimOAMPointerLo], a + cp LOW(wShadowOAMEnd) + jr nc, .exit_set_carry + dec c + jr nz, .loop + pop bc + jr .done + +.delete + call DeinitBattleAnimation + +.done + and a + ret + +.exit_set_carry + pop bc + scf + ret + +; This and the other two subroutines below it are kind of pointless to have as subroutines, +; as they only get run once... which is likely why they were merged into the main function in the final game. +.XFlip: + push hl + ld a, [hl] + ld hl, wBattleAnimTempOAMFlags + bit OAM_Y_FLIP, [hl] + jr z, .no_yflip + add $8 + xor $ff + inc a +.no_yflip + pop hl + ret + +.YFlip: + push hl + ld a, [hl] + ld hl, wBattleAnimTempOAMFlags + bit OAM_X_FLIP, [hl] + jr z, .no_xflip + add $8 + xor $ff + inc a +.no_xflip + pop hl + ret + +.UpdateAttributes: + ld a, [wBattleAnimTempOAMFlags] + ld b, a + ld a, [hl] + xor b + and PRIORITY | Y_FLIP | X_FLIP + ld b, a + ld a, [hl] + and OBP_NUM + or b + ret + +InitBattleAnimBuffer: + ld hl, BATTLEANIMSTRUCT_OAMFLAGS + add hl, bc + ld a, [hl] + + and PRIORITY + ld [wBattleAnimTempOAMFlags], a + xor a + ld [wBattleAnimTempFrameOAMFlags], a + ld hl, BATTLEANIMSTRUCT_FIX_Y + add hl, bc + ld a, [hl] + ld [wBattleAnimTempFixY], a + ld hl, BATTLEANIMSTRUCT_TILEID + add hl, bc + ld a, [hli] + ld [wBattleAnimTempTileID], a + ld a, [hli] + ld [wBattleAnimTempXCoord], a + ld a, [hli] + ld [wBattleAnimTempYCoord], a + ld a, [hli] + ld [wBattleAnimTempXOffset], a + ld a, [hli] + ld [wBattleAnimTempYOffset], a + + ldh a, [hBattleTurn] + and a + ret z + + ld hl, BATTLEANIMSTRUCT_OAMFLAGS + add hl, bc + ld a, [hl] + ld [wBattleAnimTempOAMFlags], a + bit BATTLEANIMSTRUCT_OAMFLAGS_FIX_COORDS_F, [hl] + ret z + + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hli] + ld d, a + ld a, (-10 * TILE_WIDTH) + 4 + sub d + ld [wBattleAnimTempXCoord], a + ld a, [hli] + ld d, a + ld a, [wBattleAnimTempFixY] + cp $ff + jr nz, .check_kinesis_softboiled_milkdrink + + ld a, 5 * TILE_WIDTH + add d + jr .done + +; The changes for these animations were seemingly expanded upon for the final game +.check_kinesis_softboiled_milkdrink + sub d +.done + ld [wBattleAnimTempYCoord], a + ld a, [hli] + xor $ff + inc a + ld [wBattleAnimTempXOffset], a + ret + +GetBattleAnimTileOffset: + push hl + push bc + ld hl, wBattleAnimTileDict + ld b, a + ld c, NUM_BATTLEANIMTILEDICT_ENTRIES +.loop + ld a, [hli] + cp b + jr z, .load + inc hl + dec c + jr nz, .loop + xor a + jr .done + +.load + ld a, [hl] +.done + pop bc + pop hl + ret + +_ExecuteBGEffects: + callfar ExecuteBGEffects + ret + +_QueueBGEffect: + callfar QueueBGEffect + ret + +INCLUDE "data/battle_anims/objects.inc" diff --git a/engine/battle_anims/functions.asm b/engine/battle_anims/functions.asm new file mode 100644 index 0000000..cce59eb --- /dev/null +++ b/engine/battle_anims/functions.asm @@ -0,0 +1,4208 @@ +INCLUDE "constants.asm" + + +SECTION "engine/battle_anims/functions.asm", ROMX +; TODO: Uncomment the asserts once we have all the framesets labelled + +DoBattleAnimFrame: + ld hl, BATTLEANIMSTRUCT_FUNCTION + add hl, bc + ld e, [hl] + ld d, $00 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: + ; entries correspond to BATTLE_ANIM_FUNC_* constants + table_width 2, DoBattleAnimFrame.Jumptable + dw BattleAnimFunction_Null + dw BattleAnimFunction_MoveFromUserToTarget + dw BattleAnimFunction_MoveFromUserToTargetAndDisappear + dw BattleAnimFunction_MoveInCircle + dw BattleAnimFunction_MoveWaveToTarget + dw BattleAnimFunction_ThrowFromUserToTarget + dw BattleAnimFunction_ThrowFromUserToTargetAndDisappear + dw BattleAnimFunction_Drop + dw BattleAnimFunction_MoveFromUserToTargetSpinAround + dw BattleAnimFunction_Shake + dw BattleAnimFunction_FireBlast + dw BattleAnimFunction_RazorLeaf + dw BattleAnimFunction_Bubble + dw BattleAnimFunction_Surf + dw BattleAnimFunction_Sing + dw BattleAnimFunction_WaterGun + dw BattleAnimFunction_Ember + dw BattleAnimFunction_Powder + dw BattleAnimFunction_PokeBall + dw BattleAnimFunction_PokeBallBlocked + dw BattleAnimFunction_Recover + dw BattleAnimFunction_ThunderWave + dw BattleAnimFunction_Clamp_Encore + dw BattleAnimFunction_Bite + dw BattleAnimFunction_SolarBeam + dw BattleAnimFunction_Gust + dw BattleAnimFunction_RazorWind + dw BattleAnimFunction_Kick + dw BattleAnimFunction_Absorb + dw BattleAnimFunction_Egg + dw BattleAnimFunction_MoveUp + dw BattleAnimFunction_Wrap + dw BattleAnimFunction_LeechSeed + dw BattleAnimFunction_Sound + dw BattleAnimFunction_ConfuseRay + dw BattleAnimFunction_Dizzy + dw BattleAnimFunction_Amnesia + dw BattleAnimFunction_FloatUp + dw BattleAnimFunction_Dig + dw BattleAnimFunction_String + dw BattleAnimFunction_Paralyzed + dw BattleAnimFunction_SpiralDescent + dw BattleAnimFunction_PoisonGas + dw BattleAnimFunction_Horn + dw BattleAnimFunction_Needle + dw BattleAnimFunction_PetalDance + dw BattleAnimFunction_ThiefPayday + dw BattleAnimFunction_AbsorbCircle + dw BattleAnimFunction_Bonemerang + dw BattleAnimFunction_Shiny + dw BattleAnimFunction_SkyAttack + dw BattleAnimFunction_GrowthSwordsDance + dw BattleAnimFunction_SmokeFlameWheel + dw BattleAnimFunction_PresentSmokescreen + dw BattleAnimFunction_StrengthSeismicToss + dw BattleAnimFunction_SpeedLine + dw BattleAnimFunction_Sludge + dw BattleAnimFunction_MetronomeHand + dw BattleAnimFunction_MetronomeSparkleSketch + dw BattleAnimFunction_Agility + dw BattleAnimFunction_SacredFire + dw BattleAnimFunction_SafeguardProtect + dw BattleAnimFunction_LockOnMindReader + dw BattleAnimFunction_Spikes + dw BattleAnimFunction_BellChimeNotes + dw BattleAnimFunction_BatonPass + dw BattleAnimFunction_Conversion + dw BattleAnimFunction_EncoreBellyDrum + dw BattleAnimFunction_SwaggerMorningSun + dw BattleAnimFunction_HiddenPower + dw BattleAnimFunction_Curse + dw BattleAnimFunction_PerishSong + dw BattleAnimFunction_RapidSpin + dw BattleAnimFunction_BetaPursuit + dw BattleAnimFunction_RainSandstorm + assert_table_length NUM_BATTLE_ANIM_FUNCS + +BattleAnimFunction_Null: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one +.one + call DeinitBattleAnimation +.zero + ret + +BattleAnimFunction_ThrowFromUserToTargetAndDisappear: + call BattleAnimFunction_ThrowFromUserToTarget + ret c + call DeinitBattleAnimation + ret + +BattleAnimFunction_ThrowFromUserToTarget: + ; If x coord at $88 or beyond, abort. + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $88 + ret nc + ; Move right 2 pixels + add $2 + ld [hl], a + ; Move down 1 pixel + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + ; Decrease var1 and hold onto its previous value (argument of the sine function) + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + dec [hl] + ; Get param (amplitude of the sine function) + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld d, [hl] + call BattleAnim_Sine + ; Store the sine result in the Y offset + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ; Carry flag denotes success + scf + ret + +; Wave motion from one mon to another. Obj is cleared when it reaches x coord $88. Examples: Shadow Ball, Dragon Rage +BattleAnimFunction_MoveWaveToTarget: + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $88 + jr c, .move + call DeinitBattleAnimation + ret + +.move + add $2 + ld [hl], a + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + inc [hl] + inc [hl] + ld d, $10 + push af + push de + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + sra a + sra a + sra a + sra a + ld [hl], a + ret + +; Slow circular motion. Examples: Thundershock, Flamethrower. +; Obj Param: Distance from center (masked with $7F). Bit 7 causes object to start on other side of the circle. +BattleAnimFunction_MoveInCircle: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + bit 7, [hl] + ld a, $00 + jr z, .got_starting_position + ld a, $20 +.got_starting_position + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $7f + ld [hl], a +.one + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld d, [hl] + push af + push de + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + inc [hl] + ret + +; Moves object diagonally at a ~30° angle towards opponent and stops when it reaches x coord $84. Obj Param changes the speed. +BattleAnimFunction_MoveFromUserToTarget: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one +.one + call DeinitBattleAnimation + ret + +.zero + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $84 + ret nc + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + call BattleAnim_StepToTarget + ret + +BattleAnimFunction_MoveFromUserToTargetAndDisappear: +; Same as BattleAnimFunction_01 but objs are cleared when they reach x coord $84 + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $84 + jr nc, .done + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + call BattleAnim_StepToTarget + ret + +.done + call DeinitBattleAnimation + ret + +BattleAnimFunction_PokeBall: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + dw .four + dw .five + dw .six + dw .seven + dw .eight + dw .nine + dw .ten + +.zero + call BattleAnimFunction_ThrowFromUserToTarget + ret c + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + add [hl] + ld [hl], a + ld a, BATTLE_ANIM_FRAMESET_POKE_BALL_3 + call ReinitBattleAnimFrameset + call BattleAnim_IncAnonJumptableIndex + ret + +.two + call BattleAnim_IncAnonJumptableIndex + ld a, BATTLE_ANIM_FRAMESET_POKE_BALL_1 + call ReinitBattleAnimFrameset + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $0 + inc hl + ld [hl], $10 +.three + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hli] + ld d, [hl] + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + dec a + ld [hl], a + and $1f + ret nz + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + sub $4 + ld [hl], a + ret nz + ld a, BATTLE_ANIM_FRAMESET_POKE_BALL_4 + call ReinitBattleAnimFrameset + call BattleAnim_IncAnonJumptableIndex + ret + +.five + ld a, BATTLE_ANIM_FRAMESET_POKE_BALL_5 + call ReinitBattleAnimFrameset + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + dec [hl] +.one +.four +.eight + ret + +.six + ld a, BATTLE_ANIM_FRAMESET_POKE_BALL_2 + call ReinitBattleAnimFrameset + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], $20 +.seven +.nine + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hli] + ld d, [hl] + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + dec a + ld [hl], a + and $1f + jr z, .ten + and $f + ret nz + call BattleAnim_IncAnonJumptableIndex + ret + +.ten + call DeinitBattleAnimation + ret + +BattleAnimFunction_PokeBallBlocked: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $70 + jr nc, .next + call BattleAnimFunction_ThrowFromUserToTarget + ret + +.next + call BattleAnim_IncAnonJumptableIndex +.one + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp $80 + jr nc, .done + add $4 + ld [hl], a + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + dec [hl] + dec [hl] + ret + +.done + call DeinitBattleAnimation + ret + +BattleAnimFunction_Ember: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + dw .four +.zero + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + swap a + and $f + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], a + ret + +.one + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $88 + ret nc + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + call BattleAnim_StepToTarget + ret + +.two + call DeinitBattleAnimation + ret + +.three + call BattleAnim_IncAnonJumptableIndex + ld a, BATTLE_ANIM_FRAMESET_FLAMETHROWER + call ReinitBattleAnimFrameset +.four + ret + +; Drops obj. The Obj Param dictates how fast it is (lower value is faster) and how long it stays bouncing (lower value is longer). Example: Rock Slide +BattleAnimFunction_Drop: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $30 + inc hl + ld [hl], $48 +.one + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hli] + ld d, [hl] + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + inc [hl] + ld a, [hl] + and $3f + ret nz + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $20 + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + sub [hl] + jr z, .done + jr c, .done + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], a + ret + +; Zeroes Y offset instead of actually despawning the object like in the final game. +.done + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], 0 +.two + ret + +; Object moves from user to target target and spins around it once. Example: Fire Spin, Swift +BattleAnimFunction_MoveFromUserToTargetSpinAround: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three +.zero + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $80 + jr nc, .next + call .SetCoords + ret + +.next + call BattleAnim_IncAnonJumptableIndex +.one + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $0 +.two + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + cp $40 + jr nc, .loop_back + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld d, $18 + call BattleAnim_Cosine + sub $18 + sra a + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld d, $18 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $f + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + add [hl] + ld [hl], a + ret + +.loop_back + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $f0 + jr z, .finish + sub $10 + ld d, a + ld a, [hl] + and $f + or d + ld [hl], a + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + dec [hl] + ret + +.finish + call BattleAnim_IncAnonJumptableIndex +.three + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $b0 + jr c, .retain + call DeinitBattleAnimation + ret + +.retain + call .SetCoords + ret + +.SetCoords: + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $f + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + add [hl] + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $f + ld e, a + srl e + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc +.loop + dec [hl] + dec e + jr nz, .loop + ret + +; Object switches position side to side. Obj Param defines how far to move it. Example: Dynamic Punch +; Some objects use this function with a Param of 0 +BattleAnimFunction_Shake: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $0 + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $f + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a +.one + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + and a + jr z, .done_one + dec [hl] + ret + +.done_one + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + swap a + and $f + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + xor $ff + inc a + ld [hl], a + ret + +.two + call DeinitBattleAnimation + ret + +BattleAnimFunction_FireBlast: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + dw .four + dw .five + dw .six + dw .seven + dw .eight + dw .nine +.zero + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], a + cp $7 + jr z, .seven + ld a, BATTLE_ANIM_FRAMESET_BURNED + call ReinitBattleAnimFrameset + ret + +.seven + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $88 + jr nc, .set_up_eight + add $2 + ld [hl], a + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + ret + +.set_up_eight + call BattleAnim_IncAnonJumptableIndex + ld a, BATTLE_ANIM_FRAMESET_EMBER + call ReinitBattleAnimFrameset +.eight + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld d, $10 + push af + push de + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + inc [hl] + ret + +.nine + call DeinitBattleAnimation + ret + +.one + ; Flame that moves upward + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + dec [hl] + ret + +.four + ; Flame that moves down and left + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + inc [hl] +.two + ; Flame that moves left + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + dec [hl] + ret + +.five + ; Flame that moves down and right + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + inc [hl] +.three + ; Flame that moves right + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + inc [hl] +.six + ret + +; Object moves at an arc +; Obj Param: Bit 6 defines offset from base frameset BATTLE_ANIM_FRAMESET_RAZOR_LEAF_2 +; Rest defines arc radius +BattleAnimFunction_RazorLeaf: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + dw .four + dw .five + dw .six + dw .seven + dw .eight +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $40 +.one + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + cp $30 + jr nc, .sine_cosine + call BattleAnim_IncAnonJumptableIndex + xor a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hli], a + ld [hl], a + ld a, BATTLE_ANIM_FRAMESET_RAZOR_LEAF_2 + call ReinitBattleAnimFrameset + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + bit 6, [hl] + ret z + ld hl, BATTLEANIMSTRUCT_FRAME + add hl, bc + ld [hl], $5 + ret + +.sine_cosine + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $3f + ld d, a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + dec [hl] + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + call .BattleAnim_ScatterHorizontal + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld h, [hl] + ld l, a + add hl, de + ld e, l + ld d, h + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], d + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], e + ret + +; Affects horizontal sine movement based on bit 7 of Obj Param. +; Split into its own function in final game so that it could be reused by Rock Smash. +.BattleAnim_ScatterHorizontal: + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + bit 7, a + jr nz, .negative + cp $20 + jr nc, .plus_256 + cp $18 + jr nc, .plus_384 + ld de, $200 + ret + +.plus_384 + ld de, $180 + ret + +.plus_256 + ld de, $100 + ret + +.negative + and %00111111 + cp $20 + jr nc, .minus_256 + cp $18 + jr nc, .minus_384 + ld de, -$200 + ret + +.minus_384 + ld de, -$180 + ret + +.minus_256 + ld de, -$100 + ret + +.two + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + cp $20 + jr nz, .sine_cosine_2 + call DeinitBattleAnimation + ret + +.sine_cosine_2 + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld d, $10 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + bit 6, [hl] + jr nz, .decrease + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + inc [hl] + jr .finish + +.decrease + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + dec [hl] +.finish + ld de, $80 + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld h, [hl] + ld l, a + add hl, de + ld e, l + ld d, h + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], d + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], e + ret + +.three + ld a, BATTLE_ANIM_FRAMESET_RAZOR_LEAF_1 + call ReinitBattleAnimFrameset + ld hl, BATTLEANIMSTRUCT_OAMFLAGS + add hl, bc + res OAM_X_FLIP, [hl] +.four +.five +.six +.seven + call BattleAnim_IncAnonJumptableIndex + ret + +.eight + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $c0 + ret nc + ld a, $8 + call BattleAnim_StepToTarget + ret + +BattleAnimFunction_Bubble: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $c +.one + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + and a + jr z, .next + dec [hl] + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + call BattleAnim_StepToTarget + ret + +.next + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $0 + ld a, BATTLE_ANIM_FRAMESET_PULSING_BUBBLE + call ReinitBattleAnimFrameset +.two + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $98 + jr nc, .okay + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld h, [hl] + ld l, a + ld de, $60 + add hl, de + ld e, l + ld d, h + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], e + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], d +.okay + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp $20 + ret c + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $f0 + ld e, a + ld d, $ff + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld h, [hl] + ld l, a + add hl, de + ld e, l + ld d, h + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], e + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld [hl], d + ret + +BattleAnimFunction_Surf: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + ;dw .four +.zero + call BattleAnim_IncAnonJumptableIndex + ld a, LOW(rSCY) + ldh [hLCDCPointer], a + ld a, $58 + ldh [hLYOverrideStart], a + ld a, $5e + ldh [hLYOverrideEnd], a + ret + +.one + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld e, [hl] + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp e + jr nc, .move + call BattleAnim_IncAnonJumptableIndex + xor a + ldh [hLYOverrideStart], a + ret + +.move + dec a + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld d, $10 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + add [hl] + sub $10 + ret c + ldh [hLYOverrideStart], a + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + inc a + and $7 + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + inc [hl] + inc [hl] +.two + ret + +.three + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp $70 + jr c, .move_down + xor a + ldh [hLCDCPointer], a + ldh [hLYOverrideStart], a + ldh [hLYOverrideEnd], a +; This is index 4 in the final game's anon jump table. The proto's table lacks this entry. + call DeinitBattleAnimation + ret + +.move_down + inc a + inc a + ld [hl], a + sub $10 + ret c + ldh [hLYOverrideStart], a + ret + +BattleAnimFunction_Sing: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1 + assert BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1 + 1 == BATTLE_ANIM_FRAMESET_MUSIC_NOTE_2 \ + && BATTLE_ANIM_FRAMESET_MUSIC_NOTE_2 + 1 == BATTLE_ANIM_FRAMESET_MUSIC_NOTE_3 + add [hl] + call ReinitBattleAnimFrameset + +.one + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $b8 + jr c, .move + call DeinitBattleAnimation + ret + +.move + ld a, $2 + call BattleAnim_StepToTarget + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + dec [hl] + ld d, $8 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +BattleAnimFunction_WaterGun: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + +.zero + call BattleAnim_IncAnonJumptableIndex +.one + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp $30 + jr c, .run_down + ld a, $2 + call BattleAnim_StepToTarget + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + dec [hl] + ld d, $8 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.run_down + call BattleAnim_IncAnonJumptableIndex + ld a, BATTLE_ANIM_FRAMESET_WATER_GUN_2 + call ReinitBattleAnimFrameset + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], $0 + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld [hl], $30 + ld hl, BATTLEANIMSTRUCT_OAMFLAGS + add hl, bc + ld a, [hl] + and 1 << BATTLEANIMSTRUCT_OAMFLAGS_FIX_COORDS_F + ld [hl], a +.two + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + cp $18 + jr nc, .splash + inc [hl] + ret + +.splash + call BattleAnim_IncAnonJumptableIndex + ld a, BATTLE_ANIM_FRAMESET_WATER_GUN_3 + call ReinitBattleAnimFrameset +.three + ret + +; Obj moves down and disappears at y coord $38 +BattleAnimFunction_Powder: + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + cp $38 + jr c, .move + call DeinitBattleAnimation + ret + +.move + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld l, [hl] + ld h, a + ld de, $80 + add hl, de + ld e, l + ld d, h + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], e + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], d + ; Shakes object back and forth 16 pixels + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + xor $10 + ld [hl], a + ret + +; Obj moves in an ever shrinking circle. Obj Param defines initial position in the circle +BattleAnimFunction_Recover: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $f0 + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $f + sla a + sla a + sla a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld [hl], $1 +.one + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + and a + jr nz, .move + call DeinitBattleAnimation + ret + +.move + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + inc [hl] + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld d, [hl] + push af + push de + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + xor $1 + ld [hl], a + ret z + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + dec [hl] + ret + +BattleAnimFunction_ThunderWave: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + +.one + call BattleAnim_IncAnonJumptableIndex + ld a, BATTLE_ANIM_FRAMESET_THUNDER_WAVE_EXTRA + call ReinitBattleAnimFrameset +.zero +.two + ret + +.three + call DeinitBattleAnimation + ret + +; Claps two objects together, twice. Also used by Encore. +; Second object's frameset and position relative to first are both defined via this function. +; Obj Param: Distance from center (masked with $7F). Bit 7 flips object horizontally by switching to a different frameset. +BattleAnimFunction_Clamp_Encore: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + dw .four + dw .five + dw .six + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + bit 7, [hl] + jr nz, .flipped + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $10 + jr .got_sine_start + +.flipped + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $30 +.got_sine_start + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $7f + ld [hl], a +.one + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld d, [hl] + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + bit 7, a + jr nz, .load_no_inc + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + assert BATTLE_ANIM_FRAMESET_CLAMP + 1 == BATTLE_ANIM_FRAMESET_CLAMP_FLIPPED + assert BATTLE_ANIM_FRAMESET_ENCORE_HAND + 1 == BATTLE_ANIM_FRAMESET_ENCORE_HAND_FLIPPED + inc a + jr .reinit + +.load_no_inc + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] ; BATTLE_ANIM_FRAMESET_CLAMP or BATTLE_ANIM_FRAMESET_ENCORE_HAND +.reinit + call ReinitBattleAnimFrameset + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + inc [hl] + ld a, [hl] + and $1f + ret nz +.two +.three +.four +.five + call BattleAnim_IncAnonJumptableIndex + ret + +.six + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], $1 + ret + +; Claps two objects together (vertically), twice. +; Second object's frameset and position relative to first are both defined via this function. +; Obj Param: Distance from center (masked with $7F). Bit 7 flips object vertically by switching to a different frameset. +BattleAnimFunction_Bite: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + dw .four + dw .five + dw .six + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + bit 7, [hl] + jr nz, .flipped + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $10 + jr .got_sine_start + +.flipped + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $30 +.got_sine_start + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $7f + ld [hl], a + +.one + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld d, [hl] + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + bit 7, a + jr nz, .flipped2 + ld a, BATTLE_ANIM_FRAMESET_BITE_2 + jr .got_frameset + +.flipped2 + ld a, BATTLE_ANIM_FRAMESET_BITE_1 +.got_frameset + call ReinitBattleAnimFrameset + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + inc [hl] + inc [hl] + ld a, [hl] + and $1f + ret nz + +.two +.three +.four +.five + call BattleAnim_IncAnonJumptableIndex + ret + +.six + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], $1 + ret + +; Solar Beam charge up animation. +BattleAnimFunction_SolarBeam: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $28 + inc hl + ld [hl], $0 +.one + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld d, [hl] + push af + push de + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + and a + jr z, .zero_radius + ld d, a + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld e, [hl] + ld hl, -$80 + add hl, de + ld e, l + ld d, h + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], e + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], d + ret + +.zero_radius + call DeinitBattleAnimation + ret + +BattleAnimFunction_Gust: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + dw .four + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld [hl], 0 +.one +.three + call .GustWobble + ret + +.two + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $88 + jr c, .move + call BattleAnim_IncAnonJumptableIndex + ret + +.four + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $b8 + jr c, .move + call DeinitBattleAnimation + ret + +.move + call .GustWobble + ; Move horizontally every frame + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + inc [hl] + ld a, [hl] + ; Move in the vertically every other frame + and $1 + ret nz + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + ret + +.GustWobble: + ; Circular movement where width is retrieved from a list, and height is 1/16 of that + call .GetGustRadius + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + push af + push de + call BattleAnim_Sine + sra a + sra a + sra a + sra a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + add [hl] + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + sub $8 + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and a + jr z, .start_wobble + cp $c2 + jr c, .finish_wobble +.start_wobble + dec a + ld [hl], a + and $7 + ret nz + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + inc [hl] + ret + +.finish_wobble + xor a + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hli], a + ld [hl], a + ret + +.GetGustRadius: + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .GustOffsets + add hl, de + ld d, [hl] + ret + +.GustOffsets: + db 8, 6, 5, 4, 5, 6, 8, 12, 16 + +; Moves object from target to user and disappears when reaches x coord $30. Example: Absorb, Mega Drain, Leech Seed status. +; Obj Param: Speed in the X axis +BattleAnimFunction_Absorb: + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $30 + jr nc, .move + call DeinitBattleAnimation + ret + +.move + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $f + ld e, a + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + sub e + ld [hl], a + srl e + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc +.loop + inc [hl] + dec e + jr nz, .loop + ret + +; Plays out object frameset. Use anim_incobj to move to next frameset. +BattleAnimFunction_Wrap: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + +.one + ld hl, BATTLEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld a, [hl] + assert BATTLE_ANIM_FRAMESET_BIND_1 + 1 == BATTLE_ANIM_FRAMESET_BIND_2 \ + && BATTLE_ANIM_FRAMESET_BIND_2 + 1 == BATTLE_ANIM_FRAMESET_BIND_3 \ + && BATTLE_ANIM_FRAMESET_BIND_3 + 1 == BATTLE_ANIM_FRAMESET_BIND_4 + inc a + call ReinitBattleAnimFrameset + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 ; Unused? + add hl, bc + ld [hl], $8 +.zero +.two + ret + +BattleAnimFunction_LeechSeed: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], $40 + ret + +.one + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + cp $20 + jr c, .sprout + call BattleAnim_StepThrownToTarget + ret + +.sprout + ld [hl], $40 + ld a, BATTLE_ANIM_FRAMESET_LEECH_SEED_2 + call ReinitBattleAnimFrameset + call BattleAnim_IncAnonJumptableIndex + ret + +.two + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + and a + jr z, .flutter + dec [hl] + ret + +.flutter + call BattleAnim_IncAnonJumptableIndex + ld a, BATTLE_ANIM_FRAMESET_LEECH_SEED_3 + call ReinitBattleAnimFrameset +.three + ret + +; Inches object towards the opponent's side in a parabola arc defined by the lower and upper nybble of Obj Param. +BattleAnim_StepThrownToTarget: + dec [hl] + ld d, $20 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_FIX_Y + add hl, bc + ld a, [hl] + add $2 + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld e, [hl] + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld d, [hl] + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld h, [hl] + ld a, h + and $f + swap a + ld l, a + ld a, h + and $f0 + swap a + ld h, a + add hl, de + ld e, l + ld d, h + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], e + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], d + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + and $1 + ret nz + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + ret + +; Object is thrown at target. After $20 frames it stops and waits another $20 frames then disappears. +BattleAnimFunction_Spikes: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], $40 + ret + +.one + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + cp $20 + jr c, .wait + call BattleAnim_StepThrownToTarget + ret + +.wait + call BattleAnim_IncAnonJumptableIndex +.two + ret + +BattleAnimFunction_RazorWind: + call BattleAnimFunction_MoveInCircle + ; Causes object to skip ahead the circular motion every frame + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + add $f + ld [hl], a + ret + +; Uses anim_setobj for different kick types +BattleAnimFunction_Kick: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one ; Unused? + dw .two ; Jump Kick, Hi Jump Kick + dw .three ; Rolling Kick + dw .four ; Rolling Kick (continued) + +.zero + ret + +.one + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp $30 + jr c, .move_down + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], $0 + ret + +.move_down + add $4 + ld [hl], a + ret + +.two + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $98 + ret nc + inc [hl] + inc [hl] + ld hl, BATTLEANIMSTRUCT_OAMFLAGS + add hl, bc + set BATTLEANIMSTRUCT_OAMFLAGS_FIX_COORDS_F, [hl] + ld hl, BATTLEANIMSTRUCT_FIX_Y + add hl, bc + ld [hl], $90 + ld hl, BATTLEANIMSTRUCT_FRAME + add hl, bc + ld [hl], $0 + ld hl, BATTLEANIMSTRUCT_DURATION + add hl, bc + ld [hl], $2 + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + ret + +.three + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $2c + ld hl, BATTLEANIMSTRUCT_FRAME + add hl, bc + ld [hl], $0 + ld hl, BATTLEANIMSTRUCT_DURATION + add hl, bc + ld [hl], $80 +.four + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $98 + ret nc + inc [hl] + inc [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + inc [hl] + ld d, $8 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +; Used by Egg Bomb and Softboiled. +; Obj Param: Defines jumptable starting index. +BattleAnimFunction_Egg: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one ; Egg Bomb start + dw .two + dw .three + dw .four ; ret + dw .five + dw .six ; Softboiled obj 1 start + dw .seven + dw .eight + dw .nine + dw .ten ; ret + dw .eleven ; Softboiled obj 2 start + dw .twelve + dw .thirteen ; ret + +.zero + ; Object starts here then jumps to the jumptable index defined by the Obj Param + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $28 + inc hl ; BATTLEANIMSTRUCT_VAR2 + ld [hl], $10 + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], a + ret + +.one + ; Initial Egg Bomb arc movement to x coord $40 + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $40 + jr nc, .egg_bomb_vertical_wave + inc [hl] +.egg_bomb_vertical_wave + call .EggVerticalWaveMotion + ret + +.six + ; Initial Softboiled arc movement to x coord $4b + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $4b + jr nc, .softboiled_vertical_wave + inc [hl] +.softboiled_vertical_wave + call .EggVerticalWaveMotion + ret + +.two + ; Compares the egg's x coord to determine whether to move, wait or end animation + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $88 + jr nc, .egg_bomb_done + and $f + jr nz, .egg_bomb_step + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], $10 + call BattleAnim_IncAnonJumptableIndex ; jumps to three + ret + +.egg_bomb_done + ; Increases jumptable index twice to four + call BattleAnim_IncAnonJumptableIndex + inc [hl] + ret + +.three + ; Waits in place + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + and a + jr z, .done_waiting + dec [hl] + ret + +.done_waiting + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + dec [hl] +.egg_bomb_step + ; Moves towards the target + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + inc [hl] + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld d, [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld e, [hl] + ld hl, -$80 + add hl, de + ld e, l + ld d, h + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld [hl], d + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], e + ret + +.five + ; Clears Egg Bomb object via anim_incobj + call DeinitBattleAnimation + ret + +.seven + ; Switches Softboiled frameset to egg wobbling + ld a, BATTLE_ANIM_FRAMESET_EGG_WOBBLE ; Egg wobbling + call ReinitBattleAnimFrameset + call BattleAnim_IncAnonJumptableIndex + ret + +.eight + ; Softboiled object waves slightly side to side + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + ld d, $2 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.nine + ; First Softboiled BATTLE_ANIM_OBJ_EGG turns into the bottom half frameset + ld a, BATTLE_ANIM_FRAMESET_EGG_CRACKED_BOTTOM ; Cracked egg bottom + call ReinitBattleAnimFrameset + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], $4 + call BattleAnim_IncAnonJumptableIndex + ret + +.eleven + ; Second Softboiled BATTLE_ANIM_OBJ_EGG + ld a, BATTLE_ANIM_FRAMESET_EGG_CRACKED_TOP ; Cracked egg top + call ReinitBattleAnimFrameset + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $40 + ret + +.twelve + ; Top half of egg moves upward for $30 frames + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld d, $20 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + cp $30 + jr c, .done_top_shell + dec [hl] + ret + +.done_top_shell + call BattleAnim_IncAnonJumptableIndex +.four +.ten +.thirteen + ret + +.EggVerticalWaveMotion: + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hli] + ld d, [hl] ; BATTLEANIMSTRUCT_VAR2 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + inc [hl] + ld a, [hl] + and $3f ; cp 64 + ret nz + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $20 + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + sub $8 + ld [hl], a + ret nz + xor a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hli], a + ld [hl], a + call BattleAnim_IncAnonJumptableIndex + ret + +; Moves object up for 41 frames. +; Obj Param: Movement speed. +BattleAnimFunction_MoveUp: + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + and a + jr z, .move + cp $d8 + jr nc, .move + call DeinitBattleAnimation + ret + +.move + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld d, [hl] + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + sub d + ld [hl], a + ret + +; Moves object back and forth in one of three angles using a sine behavior and disappear after 8 frames. Used in Growl, Snore and Kinesis. +; Obj Param: Used to define object angle. How much to increase from base frameset, which is hardcoded as BATTLE_ANIM_FRAMESET_SOUND_1. +BattleAnimFunction_Sound: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + ldh a, [hBattleTurn] + and a + jr z, .got_turn + ; enemy + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + xor $ff + add $3 + ld [hl], a +.got_turn + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $8 ; duration + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, BATTLE_ANIM_FRAMESET_SOUND_1 + assert BATTLE_ANIM_FRAMESET_SOUND_1 + 1 == BATTLE_ANIM_FRAMESET_SOUND_2 \ + && BATTLE_ANIM_FRAMESET_SOUND_2 + 1 == BATTLE_ANIM_FRAMESET_SOUND_3 + add [hl] + call ReinitBattleAnimFrameset + ret + +.one + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + and a + jr z, .done_anim + dec [hl] + call .SoundWaveMotion + ret + +.done_anim + call DeinitBattleAnimation + ret + +.SoundWaveMotion: + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + ld d, $10 + call BattleAnim_Sine + ld d, a + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and a + jr z, .negative + dec a + ret z + ; Obj Param 2 + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], d + ret + +.negative + ; Obj Param 0 + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, d + xor $ff + inc a + ld [hl], a + ret + +; Creates the Confuse Ray object and moves it across the screen until x coord equals $80. +; Moves horizontally every frame and vertically every 3 frames. +BattleAnimFunction_ConfuseRay: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $3f + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $80 + rlca + ld [hl], a + assert BATTLE_ANIM_FRAMESET_CONFUSE_RAY_1 + 1 == BATTLE_ANIM_FRAMESET_CONFUSE_RAY_2 + add BATTLE_ANIM_FRAMESET_CONFUSE_RAY_1 + call ReinitBattleAnimFrameset + ret + +.one + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + swap a + ld d, a + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + inc [hl] + push af + push de + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $80 + ret nc + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + and $3 + jr nz, .skip_vertical_movement + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] +.skip_vertical_movement + and $1 + ret nz + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + inc [hl] + ret + +; Moves object in a circle where the height is 1/4 the width, with the next frameset from base whether moving left or right. Also used for Nightmare. +; Obj Param: Defines starting position in the circle (masked with $80). Bit 7 flips it at the start. +BattleAnimFunction_Dizzy: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $80 + rlca + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + assert BATTLE_ANIM_FRAMESET_CHICK_1 + 1 == BATTLE_ANIM_FRAMESET_CHICK_2 + assert BATTLE_ANIM_FRAMESET_IMP + 1 == BATTLE_ANIM_FRAMESET_IMP_FLIPPED + add [hl] + call ReinitBattleAnimFrameset + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $7f + ld [hl], a +.one + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld d, $10 + push af + push de + call BattleAnim_Sine + sra a + sra a + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + inc [hl] + and $3f + jr z, .not_flipped + and $1f + ret nz + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + assert BATTLE_ANIM_FRAMESET_CHICK_1 + 1 == BATTLE_ANIM_FRAMESET_CHICK_2 + assert BATTLE_ANIM_FRAMESET_IMP + 1 == BATTLE_ANIM_FRAMESET_IMP_FLIPPED + inc a + jr .got_frameset + +.not_flipped + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] ; BATTLE_ANIM_FRAMESET_CHICK_1 or BATTLE_ANIM_FRAMESET_IMP +.got_frameset + call ReinitBattleAnimFrameset + ret + +; Creates 3 objects based on Obj Param. +; Obj Param: How much to increase from base frameset, which is hardcoded as BATTLE_ANIM_FRAMESET_AMNESIA_1. +; anim_incobj is used to DeInit object (used by Present). +BattleAnimFunction_Amnesia: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + assert BATTLE_ANIM_FRAMESET_AMNESIA_1 + 1 == BATTLE_ANIM_FRAMESET_AMNESIA_2 \ + && BATTLE_ANIM_FRAMESET_AMNESIA_2 + 1 == BATTLE_ANIM_FRAMESET_AMNESIA_3 + add BATTLE_ANIM_FRAMESET_AMNESIA_1 + call ReinitBattleAnimFrameset + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .AmnesiaOffsets + add hl, de + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a +.one + ret + +.two + ; anim_incobj forces obj to deinit + call DeinitBattleAnimation + ret + +.AmnesiaOffsets: ; Hardcoded Y Offsets for each Obj Param + db $ec, $f8, $00 + +; Object moves horizontally in a sine wave, while also moving up. Also used by Charm and the Nightmare status. +BattleAnimFunction_FloatUp: + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + ld d, $4 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld d, [hl] + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld e, [hl] + lb hl, -1, $a0 + add hl, de + ld e, l + ld d, h + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], d + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], e + ret + +; Object moves up then down with a wave motion, while also moving away from the user 1 pixel per frame. +BattleAnimFunction_Dig: + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + dec [hl] + dec [hl] + ld d, $10 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + inc [hl] + ret + +BattleAnimFunction_String: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and a + jr nz, .not_param_zero + ; Obj Param 0 flips when used by enemy + ld hl, BATTLEANIMSTRUCT_OAMFLAGS + add hl, bc + set OAM_Y_FLIP, [hl] +.not_param_zero + assert BATTLE_ANIM_FRAMESET_STRING_SHOT_1 + 1 == BATTLE_ANIM_FRAMESET_STRING_SHOT_2 \ + && BATTLE_ANIM_FRAMESET_STRING_SHOT_2 + 1 == BATTLE_ANIM_FRAMESET_STRING_SHOT_3 + add BATTLE_ANIM_FRAMESET_STRING_SHOT_1 + call ReinitBattleAnimFrameset +.one + ret + +; Also used by Disable. +; Obj Param: When bit 7 is set, frameset is replaced with flipped version. This bit is discarded and object then moves back and forth between position in lower nybble and upper nybble of Param every other frame. +BattleAnimFunction_Paralyzed: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $0 + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld e, [hl] + ld a, e + and $70 + swap a + ld [hl], a + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld a, e + and $80 + jr nz, .right + ld a, e + and $f + ld [hl], a + ret + +.right + ld a, e + and $f + xor $ff + inc a + ld [hl], a + ld a, BATTLE_ANIM_FRAMESET_PARALYZED_FLIPPED + call ReinitBattleAnimFrameset + ret + +.one + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + and a + jr z, .var1_zero + dec [hl] + ret + +.var1_zero + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + xor $ff + inc a + ld [hl], a + ret + +BattleAnimFunction_SpiralDescent: + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld d, $18 + push af + push de + call BattleAnim_Sine + sra a + sra a + sra a + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + add [hl] + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + inc [hl] + ld a, [hl] + and $7 + ret nz + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + cp $28 + jr nc, .delete + inc [hl] + ret + +.delete + call DeinitBattleAnimation + ret + +BattleAnimFunction_PetalDance: +; Object moves downwards in a spiral around the user. Object disappears at y coord $28 + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld d, $18 + push af + push de + call BattleAnim_Sine + sra a + sra a + sra a + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + add [hl] + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + inc [hl] + ld a, [hl] + and $3 + ret nz + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + cp $28 + jr nc, .end + inc [hl] + ret + +.end + call DeinitBattleAnimation + ret + +BattleAnimFunction_PoisonGas: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw BattleAnimFunction_SpiralDescent + +.zero + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $84 + jr nc, .next + inc [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + inc [hl] + ld d, $18 + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + and $1 + ret nz + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + ret + +.next + call BattleAnim_IncAnonJumptableIndex + ret + +; Object spins around target while also moving upward until it disappears at x coord $e8. +; Obj Param: Defines where the object starts in the circle. +BattleAnimFunction_SmokeFlameWheel: + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld d, $18 + push af + push de + call BattleAnim_Sine + sra a + sra a + sra a + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + add [hl] + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + inc [hl] + inc [hl] + ld a, [hl] + and $7 + ret nz + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + cp $e8 + jr z, .done + dec [hl] + ret + +.done + call DeinitBattleAnimation + ret + +; Moves object in a circle where the height is 1/8 the width, while also moving upward 2 pixels per frame for 24 frames after which it disappears. +; Obj Param: Is used internally only. +BattleAnimFunction_SacredFire: + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld d, $18 + push af + push de + call BattleAnim_Sine + sra a + sra a + sra a + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + add [hl] + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + inc [hl] + inc [hl] + ld a, [hl] + and $3 + ret nz + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + cp $d0 + jr z, .done + dec [hl] + dec [hl] + ret + +.done + call DeinitBattleAnimation + ret + +; Object bounces from user to target and stops at x coord $6c. Uses anim_incobj to clear object. +; Obj Param: Defined but not used. +BattleAnimFunction_PresentSmokescreen: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $34 + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], $10 +.one + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $6c + jr c, .do_move + ret + +.do_move + ld a, $2 + call BattleAnim_StepToTarget + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld d, [hl] + call BattleAnim_Sine + bit 7, a + jr nz, .negative + xor $ff + inc a +.negative + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + sub $4 + ld [hl], a + and $1f + cp $20 + ret nz + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + srl [hl] + ret + +.two + call DeinitBattleAnimation + ret + +BattleAnimFunction_Horn: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + +.zero + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], a + ret + +.one + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $58 + ret nc + ld a, $2 + call BattleAnim_StepToTarget + ret + +.two + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + cp $20 + jr c, .three + call DeinitBattleAnimation + ret + +.three + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + ld d, $8 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + sra a + xor $ff + inc a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + add [hl] + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + add $8 + ld [hl], a + ret + +; Moves object towards target, either in a straight line or arc. Stops at x coord $84. +; Obj Param: Upper nybble defines the index of the jumptable. Lower nybble defines the speed. +BattleAnimFunction_Needle: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + +.zero + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $f0 + swap a + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], a + ret + +.two + ; Pin Missile needle (arc) + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld d, $10 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + bit 7, a + jr z, .negative + ld [hl], a +.negative + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + sub $4 + ld [hl], a +.one + ; Normal needle (line) + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $84 + jr c, .move_to_target + call DeinitBattleAnimation + ret + +.move_to_target + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + call BattleAnim_StepToTarget + ret + +; Object drops off target and bounces once on the floor. +; Obj Param: Defines every how many frames the object moves horizontally. +BattleAnimFunction_ThiefPayday: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $28 + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + sub $28 + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], a +.one + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hli] + ld d, [hl] + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + and [hl] + jr nz, .var_doesnt_equal_param + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + dec [hl] +.var_doesnt_equal_param + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + inc [hl] + ld a, [hl] + and $3f + ret nz + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $20 + inc hl + srl [hl] + ret + +; A circle of objects that starts at the target and moves to the user. It expands until x coord $5a and then shrinks. Once radius reaches 0, the object disappears. Also used by Mimic and Conversion2. +; Obj Param: Defines the position in the circle the object starts at. +BattleAnimFunction_AbsorbCircle: + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld d, [hl] + push af + push de + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + inc [hl] + ld a, [hl] + and $1 + jr nz, .dont_move_x + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + dec [hl] +.dont_move_x + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $3 + jr nz, .dont_move_y + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + inc [hl] +.dont_move_y + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + cp $5a + jr nc, .increase_radius + ld a, [hl] + and a + jr z, .end + dec [hl] ; decreases radius + ret + +.increase_radius + inc [hl] + ret + +.end + call DeinitBattleAnimation + ret + +; A rotating circle of objects centered at a position. It expands for $40 frames and then shrinks. Once radius reaches 0, the object disappears. +; Obj Param: Defines starting point in the circle. +BattleAnimFunction_Conversion: + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + inc [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld d, [hl] + push af + push de + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + inc [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + cp $40 + jr nc, .shrink + inc [hl] + ret + +.shrink + ld a, [hl] + dec [hl] + and a + ret nz + call DeinitBattleAnimation + ret + +; Boomerang-like movement from user to target. +; Obj Param: Defines position to start at in the circle. +BattleAnimFunction_Bonemerang: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero: + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld [hl], a +.one + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld d, $30 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + add [hl] + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + add $8 + ld d, $30 + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + inc [hl] + ret + +; Puts object in a circle formation of radius $10. Also used by Flash and Light Screen. +; Obj Param: Defines where the object starts in the circle. +BattleAnimFunction_Shiny: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld d, $10 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld d, $10 + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR2 ; unused? + add hl, bc + ld [hl], $f +.one + ret + +; Uses anim_incobj to move to next step. +BattleAnimFunction_SkyAttack: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + +.zero + call BattleAnim_IncAnonJumptableIndex + ldh a, [hBattleTurn] + and a + jr nz, .enemy_turn + ld a, $f0 + jr .got_var1 + +.enemy_turn + ld a, $cc +.got_var1 + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], a + ret + +.one + call .SkyAttack_CyclePalette + ret + +.two +; Moves towards target and stops at x coord $84 + call .SkyAttack_CyclePalette + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $84 + ret nc + ld a, $4 + call BattleAnim_StepToTarget + ret + +.three +; Moves towards target and disappears at x coord $d0 + call .SkyAttack_CyclePalette + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $d0 + jr nc, .done + ld a, $4 + call BattleAnim_StepToTarget + ret + +.done + call DeinitBattleAnimation + ret + +.SkyAttack_CyclePalette: +; Cycles wOBP0 pallete + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + and $7 + inc [hl] + srl a + ld e, a + ld d, 0 + ld a, [wSGB] + and a + jr nz, .sgb + ld hl, .GBPals + jr .got_pals + +.sgb + ld hl, .SGBPals +.got_pals + add hl, de + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + and [hl] + ld [wOBP0], a + ret + +.GBPals: + db $ff, $aa, $55, $aa +.SGBPals: + db $ff, $ff, $00, $00 + +; Moves object in a circle where the height is 1/8 the width, while also moving upward 2 pixels per frame. +; Obj Param: Defines where the object starts in the circle. +BattleAnimFunction_GrowthSwordsDance: + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld d, $18 + call BattleAnim_Sine + sra a + sra a + sra a + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + add [hl] + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + inc [hl] + ld d, $18 + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + dec [hl] + dec [hl] + ret + +; Moves object up for $e0 frames, then shakes it vertically and throws it at the target. Uses anim_incobj to move to final phase. +; Obj Param: Defined but not used. +BattleAnimFunction_StrengthSeismicToss: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + +.zero + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + cp $e0 + jr nz, .move_up + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $2 + ret + +.move_up + ld d, a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld e, [hl] + ld hl, -$80 + add hl, de + ld e, l + ld d, h + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], d + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], e + ret + +.one + ld hl, BATTLEANIMSTRUCT_VAR2 + add hl, bc + ld a, [hl] + and a + jr z, .switch_position + dec [hl] + ret + +.switch_position + ld [hl], $4 + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + xor $ff + inc a + ld [hl], a + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + add [hl] + ld [hl], a + ret + +.two + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $84 + jr nc, .done + ld a, $4 + call BattleAnim_StepToTarget + ret + +.done + call DeinitBattleAnimation + ret + +; Used in moves where the user disappears for a speed-based attack such as Quick Attack, Mach Punch and Extremespeed. +BattleAnimFunction_SpeedLine: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $7f + assert BATTLE_ANIM_FRAMESET_SPEED_LINE_1 + 1 == BATTLE_ANIM_FRAMESET_SPEED_LINE_2 \ + && BATTLE_ANIM_FRAMESET_SPEED_LINE_2 + 1 == BATTLE_ANIM_FRAMESET_SPEED_LINE_3 + add BATTLE_ANIM_FRAMESET_SPEED_LINE_1 + call ReinitBattleAnimFrameset +.one + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + bit 7, [hl] + jr nz, .inverted + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + inc [hl] + ret + +.inverted + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + dec [hl] + ret + +; Object moves upward for $c frames and switches to BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE_BURST. +BattleAnimFunction_Sludge: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $c + ret + +.one + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + and a + jr z, .done + dec [hl] + ret + +.done + call BattleAnim_IncAnonJumptableIndex + ld a, BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE_BURST + call ReinitBattleAnimFrameset +.two + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + dec [hl] + ret + +; Fast circular motion with an x radius of $8 and y radius of $2. +BattleAnimFunction_MetronomeHand: + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + push af + ld d, $2 + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop af + ld d, $8 + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +; Sideways wave motion while also moving downward until it disappears at y coord $20. +; Obj Param: Only used internally. +BattleAnimFunction_MetronomeSparkleSketch: + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + cp $20 + jr c, .do_move + call DeinitBattleAnimation + ret + +.do_move + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld d, $8 + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + add $2 + ld [hl], a + and $7 + ret nz + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + inc [hl] + ret + +; Object moves sideways at a speed determined by Obj Param. Can use anim_incobj to make it disappear. +BattleAnimFunction_Agility: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + add [hl] + ld [hl], a + ret + +.one + call DeinitBattleAnimation + ret + +; Moves object in a circle where the width is 1/2 the height. +; Obj Param: Defines starting point in circle. +BattleAnimFunction_SafeguardProtect: + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld d, $18 + push af + push de + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + sra a + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + inc [hl] + ret + +; Moves objects towards a center position. +; Obj Param: Used to define object angle from 0 to 3. Lower nybble defines how much to increase from base frameset while upper nybble defines angle of movement. The object moves for $28 frames, then waits for $10 frames and disappears. +BattleAnimFunction_LockOnMindReader: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $28 + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $f + ld hl, BATTLEANIMSTRUCT_FRAMESET_ID + add hl, bc + assert BATTLE_ANIM_FRAMESET_LOCK_ON_1 + 1 == BATTLE_ANIM_FRAMESET_LOCK_ON_2 \ + && BATTLE_ANIM_FRAMESET_LOCK_ON_2 + 1 == BATTLE_ANIM_FRAMESET_LOCK_ON_3 \ + && BATTLE_ANIM_FRAMESET_LOCK_ON_3 + 1 == BATTLE_ANIM_FRAMESET_LOCK_ON_4 + assert BATTLE_ANIM_FRAMESET_MIND_READER_1 + 1 == BATTLE_ANIM_FRAMESET_MIND_READER_2 \ + && BATTLE_ANIM_FRAMESET_MIND_READER_2 + 1 == BATTLE_ANIM_FRAMESET_MIND_READER_3 \ + && BATTLE_ANIM_FRAMESET_MIND_READER_3 + 1 == BATTLE_ANIM_FRAMESET_MIND_READER_4 + add [hl] + call ReinitBattleAnimFrameset + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and $f0 + or $8 + ld [hl], a +.one + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + and a + jr z, .done + dec [hl] + add $8 + ld d, a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + push af + push de + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.done + ld [hl], $10 + call BattleAnim_IncAnonJumptableIndex +.two + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + dec [hl] + and a + ret nz + call DeinitBattleAnimation + ret + +; Object moves horizontally in a sine wave, while also moving left every other frame and downwards for $38 frames after which it disappears. +; Obj Param: Defines a frameset offset from BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1. +BattleAnimFunction_BellChimeNotes: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.zero + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1 + assert BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1 + 1 == BATTLE_ANIM_FRAMESET_MUSIC_NOTE_2 \ + && BATTLE_ANIM_FRAMESET_MUSIC_NOTE_2 + 1 == BATTLE_ANIM_FRAMESET_MUSIC_NOTE_3 + add [hl] + call ReinitBattleAnimFrameset +.one + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + cp $38 + jr nc, .done + inc [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + inc [hl] + ld d, $18 + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + and $1 + ret nz + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + dec [hl] + ret + +.done + call DeinitBattleAnimation + ret + +; Object falls vertically and bounces on the ground. +; Obj Param: Defines speed and duration. +BattleAnimFunction_BatonPass: + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and a + ret z + ld d, a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + inc [hl] + call BattleAnim_Sine + bit 7, a + jr nz, .negative + xor $ff + inc a +.negative + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + and $1f + ret nz + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + srl [hl] + ret + +; Object moves at an arc for 8 frames and disappears. +; Obj Param: Defines starting position in the arc. +BattleAnimFunction_EncoreBellyDrum: + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + cp $10 + jr nc, .done + inc [hl] + inc [hl] + ld d, a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + push af + push de + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.done + call DeinitBattleAnimation + ret + +; Moves object at an angle. +; Obj Param: Lower 6 bits define angle of movement and upper 2 bits define speed. +BattleAnimFunction_SwaggerMorningSun: + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld e, [hl] + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld d, [hl] + ld a, e + and $c0 + rlca + rlca + add [hl] + ld [hl], a + ld a, e + and $3f + push af + push de + call BattleAnim_Sine + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +BattleAnimFunction_HiddenPower: +; Moves object in a ring around position. Uses anim_incobj to move to second phase, where it expands the radius 8 pixels at a time for 13 frames and then disappears +; Obj Param: Defines starting position in circle + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + +.zero + ld d, $18 + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + inc [hl] + jr .BattleAnim_StepCircle + +.one + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $18 +.two + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + ld a, [hl] + cp $80 + jr nc, .done + ld d, a + add $8 + ld [hl], a + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + jr .BattleAnim_StepCircle + +.done + call DeinitBattleAnimation + ret + +; Inches object in a circular movement where its height is 1/4 the width. +; Split into its own function in the final game. +.BattleAnim_StepCircle: + push af + push de + call BattleAnim_Sine + sra a + sra a + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +; Object moves down and to the left 2 pixels at a time until it reaches x coord $30 and disappears. +BattleAnimFunction_Curse: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + +.one + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $30 + jr c, .done + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + dec [hl] + dec [hl] + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc + inc [hl] + inc [hl] + ret + +.done + call DeinitBattleAnimation +.zero + ret + +; Moves object in a large circle with a x radius of $50 and a y radius 1/4 or that, while also moving downwards. +; Obj Param: Defines starting position in the circle. +BattleAnimFunction_PerishSong: + ld d, $50 + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + push af + push de + call BattleAnim_Sine + sra a + sra a + ld hl, BATTLEANIMSTRUCT_VAR1 + add hl, bc + add [hl] + inc [hl] + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call BattleAnim_Cosine + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +; Object moves upwards 4 pixels per frame until it disappears at y coord $d0. +BattleAnimFunction_RapidSpin: + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + cp $d0 + jr z, .done + dec [hl] + dec [hl] + dec [hl] + dec [hl] + ret + +.done + call DeinitBattleAnimation + ret + +; Working but unused animation. +; Object moves either down or up 4 pixels per frame, depending on Obj Param. Object disappears after 23 frames when going down, or at y coord $d8 when going up. +; Obj Param: 0 moves downwards, 1 moves upwards. +BattleAnimFunction_BetaPursuit: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + +.zero + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + and a + jr nz, .move_up + call BattleAnim_IncAnonJumptableIndex + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], $ec +.one + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + cp $4 + jr z, .three + inc [hl] + inc [hl] + inc [hl] + inc [hl] + ret + +.three + call DeinitBattleAnimation + ret + +.move_up + call BattleAnim_IncAnonJumptableIndex + call BattleAnim_IncAnonJumptableIndex +.two + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + cp $d8 + ret z + dec [hl] + dec [hl] + dec [hl] + dec [hl] + ret + +; Object moves down 4 pixels at a time and right a variable distance. +; Obj Param: Defines variation in the movement. +; $0: 2 pixels horizontal movement. +; $1: 8 pixels horizontal movement. +; $2: 4 pixels horizontal movement. +BattleAnimFunction_RainSandstorm: + call BattleAnim_AnonJumptable + jp hl +.anon_dw + dw .zero + dw .one + dw .two + dw .three + +.zero + ld hl, BATTLEANIMSTRUCT_PARAM + add hl, bc + ld a, [hl] + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], a +; Seems to make some kind of assert-worthy assumption... investigate after decompiling the framesets. + ld hl, BATTLEANIMSTRUCT_FRAMESET_ID + add hl, bc + inc [hl] + inc [hl] + call BattleAnim_IncAnonJumptableIndex + ret + +.one ; Obj Param 0 + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + add $4 + cp $70 + jr c, .dont_reset_y_offset_one + xor a +.dont_reset_y_offset_one + ld [hl], a + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + inc [hl] + inc [hl] + ret + +.two ; Obj Param 1 + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + add $4 + cp $70 + jr c, .dont_reset_y_offset_two + xor a +.dont_reset_y_offset_two + ld [hl], a + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + add $8 + ld [hl], a + ret + +.three ; Obj Param 2 + ld hl, BATTLEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + add $4 + cp $70 + jr c, .dont_reset_y_offset_three + xor a +.dont_reset_y_offset_three + ld [hl], a + ld hl, BATTLEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + add $4 + ld [hl], a + ret + +BattleAnim_StepToTarget: +; Inches object towards the opponent's side, moving half as much in the Y axis as it did in the X axis. Uses lower nybble of A + and $f + ld e, a + ld hl, BATTLEANIMSTRUCT_XCOORD + add hl, bc + add [hl] + ld [hl], a + srl e + ld hl, BATTLEANIMSTRUCT_YCOORD + add hl, bc +.loop + dec [hl] + dec e + jr nz, .loop + ret + +; Changed in the final version to pop the return address instead of directly accessing it, +; and also to make it so that they didn't have to put "jp hl" after EVERY call to this function. +BattleAnim_AnonJumptable: + ld hl, sp+0 + ld e, [hl] + inc hl + ld d, [hl] + inc de + + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld l, [hl] + ld h, $0 + add hl, hl + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +BattleAnim_IncAnonJumptableIndex: + ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ret + +BattleAnim_Cosine: +; a = d * cos(a * pi/32) + add %010000 ; cos(x) = sin(x + pi/2) + ; fallthrough +BattleAnim_Sine: +; a = d * sin(a * pi/32) + calc_sine_wave BattleAnimSineWave + +BattleAnim_Sine_e: + ld a, e + call BattleAnim_Sine + ld e, a + ret + +BattleAnim_Cosine_e: + ld a, e + call BattleAnim_Cosine + ld e, a + ret + +BattleAnimSineWave: + sine_table 32 diff --git a/engine/debug/field/mon_following.inc b/engine/debug/field/mon_following.inc index fa867e5..cb38319 100644 --- a/engine/debug/field/mon_following.inc +++ b/engine/debug/field/mon_following.inc @@ -19,7 +19,7 @@ FieldDebug_PokemonFollowing: and a jr nz, .ShowUnableText callfar SpawnFollower - ld de, SFX_24 + ld de, SFX_BALL_POOF call PlaySFX call CloseWindow call UpdateSprites @@ -28,7 +28,7 @@ FieldDebug_PokemonFollowing: .remove callfar DeleteFollower - ld de, SFX_25 + ld de, SFX_FAINT call PlaySFX jr .done diff --git a/engine/debug/field/npc_movement_test.inc b/engine/debug/field/npc_movement_test.inc index aeb77b0..ea54cb0 100644 --- a/engine/debug/field/npc_movement_test.inc +++ b/engine/debug/field/npc_movement_test.inc @@ -17,7 +17,7 @@ FieldDebug_NPCMovementTest: ld a, 2 ld hl, .MovementData call LoadMovementDataPointer - ld de, SFX_22 + ld de, SFX_SAFARI_ZONE_PA call PlaySFX scf ret @@ -42,7 +42,7 @@ FieldDebug_NPCMovementTest: db MOVEMENT_32 .not_here - ld de, SFX_1E + ld de, SFX_COLLISION call PlaySFX ld hl, .NotHereText call FieldDebug_ShowTextboxAndExit diff --git a/engine/debug/field/warp.inc b/engine/debug/field/warp.inc index 9b2e9b6..b84ba2b 100644 --- a/engine/debug/field/warp.inc +++ b/engine/debug/field/warp.inc @@ -12,7 +12,7 @@ FieldDebug_Warp: ldh a, [hROMBank] ld hl, FieldDebug_ShowWarpToText call QueueScript - ld de, SFX_22 + ld de, SFX_SAFARI_ZONE_PA call PlaySFX call DelayFrame ld a, FIELDDEBUG_RETURN_EXIT diff --git a/engine/dumps/bank03.asm b/engine/dumps/bank03.asm index c302ad6..7cd92f0 100755 --- a/engine/dumps/bank03.asm +++ b/engine/dumps/bank03.asm @@ -3006,7 +3006,7 @@ PokeBallEffect: .room_in_party xor a - ld [wce35], a + ld [wWildMon], a call ReturnToBattle_UseBall ld hl, ItemUsedText @@ -3138,7 +3138,7 @@ PokeBallEffect: .sub_e9d6 ld a, [wEnemyMonSpecies] .sub_e9d9 - ld [wce35], a + ld [wWildMon], a ld c, $14 call DelayFrames ld a, [wCurItem] @@ -3153,7 +3153,7 @@ PokeBallEffect: ld [wMapBlocksAddress], a ld [wNumHits], a predef PlayBattleAnim - ld a, [wce35] + ld a, [wWildMon] and a jr nz, .sub_ea29 ld a, [wMapBlocksAddress] @@ -3216,7 +3216,7 @@ PokeBallEffect: pop af ld [hl], a ld a, [wEnemyMonSpecies] - ld [wce35], a + ld [wWildMon], a ld [wCurPartySpecies], a ld [wce37], a ld a, [wce03] @@ -5444,66 +5444,74 @@ Breeder_EggLaidText: Functionfd45: ret -Functionfd46: - ld a, [wMapBlocksAddress] +GetPokeBallWobble: +; Returns whether a Poke Ball will wobble in the catch animation. +; Whether a Pokemon is caught is determined beforehand. + + ld a, [wThrownBallWobbleCount] inc a - ld [wMapBlocksAddress], a - cp $04 - jr z, .sub_fd71 - ld a, [wce35] + ld [wThrownBallWobbleCount], a + +; Wobble up to 3 times. + cp 3 + 1 + jr z, .finished + ld a, [wWildMon] and a - ld c, $00 + ld c, 0 ; next ret nz - ld hl, Datafd7b - ld a, [wFieldMoveScriptID] + ld hl, WobbleProbabilities + ld a, [wFinalCatchRate] ld b, a -.sub_fd5f +.loop ld a, [hli] cp b - jr nc, .sub_fd66 + jr nc, .checkwobble inc hl - jr .sub_fd5f -.sub_fd66 + jr .loop +.checkwobble ld b, [hl] call Random cp b - ld c, $00 + ld c, 0 ; next ret c - ld c, $02 - ret -.sub_fd71 - ld a, [wce35] - and a - ld c, $01 - ret nz - ld c, $02 + ld c, 2 ; escaped ret -Datafd7b: - db $01, $3f - db $02, $4b - db $03, $54 - db $04, $5a - db $05, $5f - db $07, $67 - db $0a, $71 - db $0f, $7e - db $14, $86 - db $1e, $95 - db $28, $a0 - db $32, $a9 - db $3c, $b1 - db $50, $bf - db $64, $c9 - db $78, $d3 - db $8c, $dc - db $a0, $e3 - db $b4, $ea - db $c8, $f0 - db $dc, $f6 - db $f0, $fb - db $fe, $fd - db $ff, $ff +.finished + ld a, [wWildMon] + and a + ld c, 1 ; caught + ret nz + ld c, 2 ; escaped + ret + +WobbleProbabilities: +; catch rate, chance of wobbling / 255 +; nLeft/255 = (nRight/255) ** 4 + db 1, 63 + db 2, 75 + db 3, 84 + db 4, 90 + db 5, 95 + db 7, 103 + db 10, 113 + db 15, 126 + db 20, 134 + db 30, 149 + db 40, 160 + db 50, 169 + db 60, 177 + db 80, 191 + db 100, 201 + db 120, 211 + db 140, 220 + db 160, 227 + db 180, 234 + db 200, 240 + db 220, 246 + db 240, 251 + db 254, 253 + db 255, 255 Functionfdab: ld a, $02 diff --git a/engine/dumps/bank0d.asm b/engine/dumps/bank0d.asm index 7e8762c..d98c1d4 100644 --- a/engine/dumps/bank0d.asm +++ b/engine/dumps/bank0d.asm @@ -2261,6 +2261,7 @@ BattleCommand_MoveAnim: and a jp nz, BattleCommand_MoveDelay + assert BATTLEANIM_NONE + 1 == BATTLEANIM_DAMAGE inc a ld [wNumHits], a ldh a, [hBattleTurn] @@ -7435,9 +7436,11 @@ BattleCommand_Selfdestruct: ld de, wEnemySubStatus4 .ok +; BUG: hl is increased one too many times, causing only the lower byte of the user's current HP to be zeroed out, +; and incorrectly zeroing the high byte of the user's max HP. xor a ld [hli], a - ld [hli], a + ld [hli], a ; Without this line, the bug wouldn't happen. This byte isn't even used in normal gameplay (wPartyMon#Unused) inc hl ld [hli], a ld [hl], a diff --git a/engine/dumps/bank0f.asm b/engine/dumps/bank0f.asm index 1a82c80..e06a2be 100644 --- a/engine/dumps/bank0f.asm +++ b/engine/dumps/bank0f.asm @@ -158,7 +158,7 @@ asm_3c132: asm_3c14a: call PrintText - ld de, $26 + ld de, SFX_RUN call PlaySFX xor a ldh [hBattleTurn], a @@ -571,11 +571,11 @@ asm_3c4a3: and $18 jr z, asm_3c4eb ld hl, HurtByPoisonText - ld de, $0106 + ld de, ANIM_PSN and $10 jr z, asm_3c4b8 ld hl, HurtByBurnText - ld de, $0105 + ld de, ANIM_BRN asm_3c4b8: push de @@ -627,7 +627,7 @@ asm_3c4f6: ldh [hBattleTurn], a xor a ld [wNumHits], a - ld de, $0107 + ld de, ANIM_SAP call PlayMoveAnimation pop af ldh [hBattleTurn], a @@ -649,7 +649,7 @@ asm_3c528: jr z, asm_3c542 xor a ld [wNumHits], a - ld de, $010c + ld de, ANIM_IN_NIGHTMARE call PlayMoveAnimation call GetQuarterMaxHP call SubtractHPFromUser @@ -668,7 +668,7 @@ asm_3c54d: jr z, asm_3c567 xor a ld [wNumHits], a - ld de, $010c + ld de, ANIM_IN_NIGHTMARE call PlayMoveAnimation call GetQuarterMaxHP call SubtractHPFromUser @@ -691,7 +691,7 @@ asm_3c572: ldh [hBattleTurn], a xor a ld [wNumHits], a - ld de, $010b + ld de, ANIM_IN_SANDSTORM call PlayMoveAnimation pop af ldh [hBattleTurn], a @@ -1212,12 +1212,12 @@ asm_3c8e2: dec a jr z, asm_3c935 push de - ld de, $33 + ld de, SFX_KINESIS call PlaySFX call WaitSFX pop de push de - ld de, $25 + ld de, SFX_FAINT call PlaySFX call WaitSFX pop de @@ -2356,7 +2356,7 @@ TryRunningFromBattle: .play_sound ld [wcd5d], a push de - ld de, $26 + ld de, SFX_RUN call WaitPlaySFX pop de call WaitSFX @@ -3175,7 +3175,7 @@ BattleMenu_Pack: ld a, 1 ld [wMenuCursorY], a call sub_3d832 - ld a, [wce35] + ld a, [wWildMon] and a jr nz, .asm_3d7eb call CloseWindow @@ -3189,7 +3189,7 @@ BattleMenu_Pack: .asm_3d7eb xor a - ld [wce35], a + ld [wWildMon], a ld a, 2 ld [wcd5d], a call ClearWindowData @@ -5653,15 +5653,17 @@ CalcAndPlaceExpBar: .finish ret -Function3e91e: +GetBattleMonBackpic: ld a, [wPlayerSubStatus4] bit SUBSTATUS_SUBSTITUTE, a - ld hl, Functioncc44f - jr nz, asm_3e954 + ld hl, BattleAnimCmd_RaiseSub + jr nz, GetBattleMonBackpic_DoAnim + +DropPlayerSub: ld a, [wPlayerMinimized] and a - ld hl, Functioncc4d4 - jr nz, asm_3e954 + ld hl, BattleAnimCmd_MinimizeOpp + jr nz, GetBattleMonBackpic_DoAnim ld a, [wCurPartySpecies] push af ld a, [wBattleMonSpecies] @@ -5670,32 +5672,34 @@ Function3e91e: call GetBaseData ld hl, wMonHBackSprite - wMonHeader call UncompressMonSprite - ld hl, $9310 - predef Function50bcd + ld hl, vBackPic + predef GetMonBackpic pop af ld [wCurPartySpecies], a ret -asm_3e954: +GetBattleMonBackpic_DoAnim: ldh a, [hBattleTurn] push af xor a ldh [hBattleTurn], a - ld a, BANK(Functioncc44f) + ld a, BANK(BattleAnimCmd_RaiseSub) call FarCall_hl pop af ldh [hBattleTurn], a ret -Function3e963: +GetEnemyMonFrontpic: ld a, [wEnemySubStatus4] - bit 4, a - ld hl, Functioncc44f - jr nz, asm_3e999 + bit SUBSTATUS_SUBSTITUTE, a + ld hl, BattleAnimCmd_RaiseSub + jr nz, GetEnemyMonFrontpic_DoAnim + +DropEnemySub: ld a, [wEnemyMinimized] and a - ld hl, Functioncc4d4 - jr nz, asm_3e999 + ld hl, BattleAnimCmd_MinimizeOpp + jr nz, GetEnemyMonFrontpic_DoAnim ld a, [wCurPartySpecies] push af ld a, [wEnemyMonSpecies] @@ -5710,12 +5714,12 @@ Function3e963: ld [wCurPartySpecies], a ret -asm_3e999: +GetEnemyMonFrontpic_DoAnim: ldh a, [hBattleTurn] push af ld a, 1 ldh [hBattleTurn], a - ld a, BANK(Functioncc44f) + ld a, BANK(BattleAnimCmd_RaiseSub) call FarCall_hl pop af ldh [hBattleTurn], a @@ -6178,7 +6182,7 @@ LoadMonBackPic: ld hl, wMonHBackSprite - wMonHeader call UncompressMonSprite ld hl, vBackPic - predef_jump Function50bcd + predef_jump GetMonBackpic Function3f068: ld de, $a203 @@ -6412,7 +6416,7 @@ AddBattleMoneyToAccount: call PrintText ret - BattleText_PlayerPickedUpPayDayMoney: +BattleText_PlayerPickedUpPayDayMoney: text "は @" deciram wPayDayMoney, 3, 6 text "円" @@ -6580,7 +6584,7 @@ InitBackPic: ld a, BANK(PlayerBacksprite) call UncompressSpriteFromDE ld hl, vTitleLogo2 - predef Function50bcd + predef GetMonBackpic ld a, 0 call OpenSRAM ld hl, vSprites @@ -6644,7 +6648,7 @@ BattleStartMessage: ld a, [wBattleMode] dec a jr z, .wild - ld de, $62 ; SFX_SHINE + ld de, SFX_SHINE call PlaySFX call WaitSFX ld c, 20 diff --git a/engine/dumps/bank14.asm b/engine/dumps/bank14.asm index b696c2a..0f40e77 100644 --- a/engine/dumps/bank14.asm +++ b/engine/dumps/bank14.asm @@ -1620,7 +1620,7 @@ PlaceNonFaintStatus:: ld [hl], "ひ" ret -Function50bcd:: +GetMonBackpic:: ld a, $00 call OpenSRAM push hl diff --git a/engine/dumps/bank33.asm b/engine/dumps/bank33.asm new file mode 100644 index 0000000..56f5eda --- /dev/null +++ b/engine/dumps/bank33.asm @@ -0,0 +1,135 @@ +INCLUDE "constants.asm" + +SECTION "engine/battle_anims/helper.asm", ROMX + +ReinitBattleAnimFrameset: + ld hl, BATTLEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], a + ld hl, BATTLEANIMSTRUCT_DURATION + add hl, bc + ld [hl], 0 + ld hl, BATTLEANIMSTRUCT_FRAME + add hl, bc + ld [hl], -1 + ret + +GetBattleAnimFrame: +.loop + ld hl, BATTLEANIMSTRUCT_DURATION + add hl, bc + ld a, [hl] + and a + jr z, .next_frame + dec [hl] + call .GetPointer + ld a, [hli] + push af + jr .okay + +.next_frame + ld hl, BATTLEANIMSTRUCT_FRAME + add hl, bc + inc [hl] + call .GetPointer + ld a, [hli] + cp oamrestart_command + jr z, .restart + cp oamend_command + jr z, .repeat_last + + push af + ld a, [hl] + push hl + and ~(Y_FLIP << 1 | X_FLIP << 1) + ld hl, BATTLEANIMSTRUCT_DURATION + add hl, bc + ld [hl], a + pop hl +.okay + ld a, [hl] + and Y_FLIP << 1 | X_FLIP << 1 ; The << 1 is compensated in the "oamframe" macro + srl a + ld [wBattleAnimTempFrameOAMFlags], a + pop af + ret + +.repeat_last + xor a + ld hl, BATTLEANIMSTRUCT_DURATION + add hl, bc + ld [hl], a + + ld hl, BATTLEANIMSTRUCT_FRAME + add hl, bc + dec [hl] + dec [hl] + jr .loop + +.restart + xor a + ld hl, BATTLEANIMSTRUCT_DURATION + add hl, bc + ld [hl], a + + dec a + ld hl, BATTLEANIMSTRUCT_FRAME + add hl, bc + ld [hl], a + jr .loop + +.GetPointer: + ld hl, BATTLEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, BattleAnimFrameData + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, BATTLEANIMSTRUCT_FRAME + add hl, bc + ld l, [hl] + ld h, 0 + add hl, hl + add hl, de + ret + +GetBattleAnimOAMPointer: + ld l, a + ld h, 0 + ld de, BattleAnimOAMData + add hl, hl + add hl, hl + add hl, de + ret + +LoadBattleAnimGFX: + push hl + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld de, AnimObjGFX + add hl, de + ld c, [hl] + inc hl + ld b, [hl] + inc hl + ld e, [hl] + inc hl + ld d, [hl] + pop hl + push bc + call Request2bpp + pop bc + ret + + +INCLUDE "data/battle_anims/framesets.inc" + +INCLUDE "data/battle_anims/oam.inc" + +INCLUDE "data/battle_anims/object_gfx.inc" diff --git a/engine/events/pokecenter_pc.asm b/engine/events/pokecenter_pc.asm index 2314214..f6d8348 100644 --- a/engine/events/pokecenter_pc.asm +++ b/engine/events/pokecenter_pc.asm @@ -100,7 +100,7 @@ PC_PlayBootSound: ; Don't play the bootup sound if player has at least one mon ret nz - ld de, SFX_BOOT_PC + ld de, SFX_CHOOSE_PC_OPTION call PlaySFX ld hl, .NoPokemonText call OpenTextbox @@ -117,7 +117,7 @@ PC_PlayBootSound: text_end PC_Demo: - ld de, SFX_BOOT_PC + ld de, SFX_CHOOSE_PC_OPTION call PlaySFX ld hl, .SkarmoryText call PrintText diff --git a/engine/gfx/screen_effects.asm b/engine/gfx/screen_effects.asm new file mode 100644 index 0000000..72bb953 --- /dev/null +++ b/engine/gfx/screen_effects.asm @@ -0,0 +1,72 @@ +INCLUDE "constants.asm" + +SECTION "engine/gfx/screen_effects.asm", ROMX + +; b = new color for BG color 0 (usually white) for 4 frames +ChangeBGPalColor0_4Frames: + ldh a, [rBGP] + or b + ldh [rBGP], a + ld c, 4 + call DelayFrames + ldh a, [rBGP] + and %11111100 + ldh [rBGP], a + ret + +; Moves the window down and then back in a sequence of progressively smaller +; numbers of pixels, starting at b. +PredefShakeScreenVertically: + ld a, 1 + ld [wDisableVBlankWYUpdate], a + xor a +.loop + ldh [hMutateWY], a + call .MutateWY + call .MutateWY + dec b + ld a, b + jr nz, .loop + xor a + ld [wDisableVBlankWYUpdate], a + ret + +.MutateWY + ldh a, [hMutateWY] + xor b + ldh [hMutateWY], a + ldh [rWY], a + ld c, 3 + jp DelayFrames + +; Moves the window right and then back in a sequence of progressively smaller +; numbers of pixels, starting at b. +PredefShakeScreenHorizontally: + ld a, 1 + ld [wDisableVBlankWYUpdate], a + xor a +.loop + ldh [hMutateWX], a + call .MutateWX + ld c, 1 + call DelayFrames + call .MutateWX + dec b + ld a, b + jr nz, .loop + xor a + ld [wDisableVBlankWYUpdate], a + ret + +.MutateWX + ldh a, [hMutateWX] + xor b + ldh [hMutateWX], a + bit 7, a ; negative? + jr z, .skipZeroing + xor a ; zero a if it's negative +.skipZeroing + add 7 + ldh [rWX], a + ld c, 4 + jp DelayFrames diff --git a/engine/movie/opening_cutscene.asm b/engine/movie/opening_cutscene.asm index 5bc1c97..88b3d45 100644 --- a/engine/movie/opening_cutscene.asm +++ b/engine/movie/opening_cutscene.asm @@ -470,7 +470,7 @@ Intro_UpdateTilemapAndBGMap: ld e, a ld a, [wIntroBGMapPointer + 1] ld d, a - ld hl, hCurSpriteYCoord + ld hl, -2 * BG_MAP_WIDTH add hl, de ld a, l ld [wIntroBGMapPointer + 0], a diff --git a/engine/movie/title.asm b/engine/movie/title.asm index 62239d8..2cadbf3 100644 --- a/engine/movie/title.asm +++ b/engine/movie/title.asm @@ -273,7 +273,7 @@ TitleSeq_Start:: ld a, $80 ld [wJumptableIndex + 2], a call SetLYOverrides - ld a, $43 + ld a, LOW(rSCX) ldh [hLCDCPointer], a ret diff --git a/gfx/battle/minimize.png b/gfx/battle/minimize.png new file mode 100644 index 0000000..a8851a5 Binary files /dev/null and b/gfx/battle/minimize.png differ diff --git a/gfx/battle_anims/angels.png b/gfx/battle_anims/angels.png new file mode 100644 index 0000000..becf1d2 Binary files /dev/null and b/gfx/battle_anims/angels.png differ diff --git a/gfx/battle_anims/attack_animations_1.png b/gfx/battle_anims/attack_animations_1.png deleted file mode 100755 index c432ff2..0000000 Binary files a/gfx/battle_anims/attack_animations_1.png and /dev/null differ diff --git a/gfx/battle_anims/attack_animations_2.png b/gfx/battle_anims/attack_animations_2.png deleted file mode 100755 index 2e04011..0000000 Binary files a/gfx/battle_anims/attack_animations_2.png and /dev/null differ diff --git a/gfx/battle_anims/beam.png b/gfx/battle_anims/beam.png new file mode 100644 index 0000000..e6f3e35 Binary files /dev/null and b/gfx/battle_anims/beam.png differ diff --git a/gfx/battle_anims/bubble.png b/gfx/battle_anims/bubble.png new file mode 100644 index 0000000..c4e8525 Binary files /dev/null and b/gfx/battle_anims/bubble.png differ diff --git a/gfx/battle_anims/charge.png b/gfx/battle_anims/charge.png new file mode 100644 index 0000000..af452b5 Binary files /dev/null and b/gfx/battle_anims/charge.png differ diff --git a/gfx/battle_anims/cut.png b/gfx/battle_anims/cut.png new file mode 100644 index 0000000..30cce00 Binary files /dev/null and b/gfx/battle_anims/cut.png differ diff --git a/gfx/battle_anims/egg.png b/gfx/battle_anims/egg.png new file mode 100644 index 0000000..a3586b3 Binary files /dev/null and b/gfx/battle_anims/egg.png differ diff --git a/gfx/battle_anims/explosion.png b/gfx/battle_anims/explosion.png new file mode 100644 index 0000000..b064bf4 Binary files /dev/null and b/gfx/battle_anims/explosion.png differ diff --git a/gfx/battle_anims/fire.png b/gfx/battle_anims/fire.png new file mode 100644 index 0000000..16208a1 Binary files /dev/null and b/gfx/battle_anims/fire.png differ diff --git a/gfx/battle_anims/flower.png b/gfx/battle_anims/flower.png new file mode 100644 index 0000000..cac3c4b Binary files /dev/null and b/gfx/battle_anims/flower.png differ diff --git a/gfx/battle_anims/globe.png b/gfx/battle_anims/globe.png new file mode 100644 index 0000000..e010a5e Binary files /dev/null and b/gfx/battle_anims/globe.png differ diff --git a/gfx/battle_anims/haze.png b/gfx/battle_anims/haze.png new file mode 100644 index 0000000..cd18659 Binary files /dev/null and b/gfx/battle_anims/haze.png differ diff --git a/gfx/battle_anims/hit.png b/gfx/battle_anims/hit.png new file mode 100644 index 0000000..87af418 Binary files /dev/null and b/gfx/battle_anims/hit.png differ diff --git a/gfx/battle_anims/horn.png b/gfx/battle_anims/horn.png new file mode 100644 index 0000000..6204c66 Binary files /dev/null and b/gfx/battle_anims/horn.png differ diff --git a/gfx/battle_anims/ice.png b/gfx/battle_anims/ice.png new file mode 100644 index 0000000..f651866 Binary files /dev/null and b/gfx/battle_anims/ice.png differ diff --git a/gfx/battle_anims/lightning.png b/gfx/battle_anims/lightning.png new file mode 100644 index 0000000..da230a5 Binary files /dev/null and b/gfx/battle_anims/lightning.png differ diff --git a/gfx/battle_anims/misc.png b/gfx/battle_anims/misc.png new file mode 100644 index 0000000..6b6d58d Binary files /dev/null and b/gfx/battle_anims/misc.png differ diff --git a/gfx/battle_anims/noise.png b/gfx/battle_anims/noise.png new file mode 100644 index 0000000..21ef92f Binary files /dev/null and b/gfx/battle_anims/noise.png differ diff --git a/gfx/battle_anims/objects.png b/gfx/battle_anims/objects.png new file mode 100644 index 0000000..fefef11 Binary files /dev/null and b/gfx/battle_anims/objects.png differ diff --git a/gfx/battle_anims/plant.png b/gfx/battle_anims/plant.png new file mode 100644 index 0000000..63cfb6f Binary files /dev/null and b/gfx/battle_anims/plant.png differ diff --git a/gfx/battle_anims/poison.png b/gfx/battle_anims/poison.png new file mode 100644 index 0000000..49444e8 Binary files /dev/null and b/gfx/battle_anims/poison.png differ diff --git a/gfx/battle_anims/pokeball.png b/gfx/battle_anims/pokeball.png new file mode 100644 index 0000000..7b9e741 Binary files /dev/null and b/gfx/battle_anims/pokeball.png differ diff --git a/gfx/battle_anims/powder.png b/gfx/battle_anims/powder.png new file mode 100644 index 0000000..ed64f8b Binary files /dev/null and b/gfx/battle_anims/powder.png differ diff --git a/gfx/battle_anims/psychic.png b/gfx/battle_anims/psychic.png new file mode 100644 index 0000000..5db4817 Binary files /dev/null and b/gfx/battle_anims/psychic.png differ diff --git a/gfx/battle_anims/reflect.png b/gfx/battle_anims/reflect.png new file mode 100644 index 0000000..9196ba6 Binary files /dev/null and b/gfx/battle_anims/reflect.png differ diff --git a/gfx/battle_anims/rocks.png b/gfx/battle_anims/rocks.png new file mode 100644 index 0000000..ff6771e Binary files /dev/null and b/gfx/battle_anims/rocks.png differ diff --git a/gfx/battle_anims/rope.png b/gfx/battle_anims/rope.png new file mode 100644 index 0000000..7c72da4 Binary files /dev/null and b/gfx/battle_anims/rope.png differ diff --git a/gfx/battle_anims/sand.png b/gfx/battle_anims/sand.png new file mode 100644 index 0000000..64a2384 Binary files /dev/null and b/gfx/battle_anims/sand.png differ diff --git a/gfx/battle_anims/shapes.png b/gfx/battle_anims/shapes.png new file mode 100644 index 0000000..b1d52e3 Binary files /dev/null and b/gfx/battle_anims/shapes.png differ diff --git a/gfx/battle_anims/shine.png b/gfx/battle_anims/shine.png new file mode 100644 index 0000000..8b39db0 Binary files /dev/null and b/gfx/battle_anims/shine.png differ diff --git a/gfx/battle_anims/skyattack.png b/gfx/battle_anims/skyattack.png new file mode 100644 index 0000000..0df0321 Binary files /dev/null and b/gfx/battle_anims/skyattack.png differ diff --git a/gfx/battle_anims/smoke.png b/gfx/battle_anims/smoke.png new file mode 100644 index 0000000..00570a9 Binary files /dev/null and b/gfx/battle_anims/smoke.png differ diff --git a/gfx/battle_anims/speed.png b/gfx/battle_anims/speed.png new file mode 100644 index 0000000..97e6abc Binary files /dev/null and b/gfx/battle_anims/speed.png differ diff --git a/gfx/battle_anims/status.png b/gfx/battle_anims/status.png new file mode 100644 index 0000000..26a0806 Binary files /dev/null and b/gfx/battle_anims/status.png differ diff --git a/gfx/battle_anims/water.png b/gfx/battle_anims/water.png new file mode 100644 index 0000000..10bc69a Binary files /dev/null and b/gfx/battle_anims/water.png differ diff --git a/gfx/battle_anims/web.png b/gfx/battle_anims/web.png new file mode 100644 index 0000000..5a6ff29 Binary files /dev/null and b/gfx/battle_anims/web.png differ diff --git a/gfx/battle_anims/whip.png b/gfx/battle_anims/whip.png new file mode 100644 index 0000000..b1bb2c1 Binary files /dev/null and b/gfx/battle_anims/whip.png differ diff --git a/gfx/battle_anims/wind.png b/gfx/battle_anims/wind.png new file mode 100644 index 0000000..34a36c5 Binary files /dev/null and b/gfx/battle_anims/wind.png differ diff --git a/gfx/gfx.asm b/gfx/gfx.asm index 3af0072..d9d91db 100644 --- a/gfx/gfx.asm +++ b/gfx/gfx.asm @@ -373,10 +373,47 @@ INCLUDE "gfx/pokemon/egg.inc" SECTION "gfx.asm@Attack Animation GFX", ROMX -INCBIN "gfx/battle_anims/attack_animations_1.2bpp" -PointerGFX:: -INCBIN "gfx/battle_anims/pointer.2bpp" -INCBIN "gfx/battle_anims/attack_animations_2.2bpp" +AnimObj00GFX: +AnimObjHitGFX: INCBIN "gfx/battle_anims/hit.2bpp" +AnimObjCutGFX: INCBIN "gfx/battle_anims/cut.2bpp" +AnimObjFireGFX: INCBIN "gfx/battle_anims/fire.2bpp" +AnimObjWaterGFX: INCBIN "gfx/battle_anims/water.2bpp" +AnimObjLightningGFX: INCBIN "gfx/battle_anims/lightning.2bpp" +AnimObjSmokeGFX: INCBIN "gfx/battle_anims/smoke.2bpp" +AnimObjExplosionGFX: INCBIN "gfx/battle_anims/explosion.2bpp" +AnimObjIceGFX: INCBIN "gfx/battle_anims/ice.2bpp" +AnimObjRocksGFX: INCBIN "gfx/battle_anims/rocks.2bpp" +AnimObjPoisonGFX: INCBIN "gfx/battle_anims/poison.2bpp" +AnimObjPlantGFX: INCBIN "gfx/battle_anims/plant.2bpp" +AnimObjPokeBallGFX: INCBIN "gfx/battle_anims/pokeball.2bpp" +AnimObjBubbleGFX: INCBIN "gfx/battle_anims/bubble.2bpp" +AnimObjNoiseGFX: INCBIN "gfx/battle_anims/noise.2bpp" +AnimObjReflectGFX: INCBIN "gfx/battle_anims/reflect.2bpp" +AnimObjPowderGFX: INCBIN "gfx/battle_anims/powder.2bpp" +AnimObjBeamGFX: INCBIN "gfx/battle_anims/beam.2bpp" +AnimObjSpeedGFX: INCBIN "gfx/battle_anims/speed.2bpp" +AnimObjChargeGFX: INCBIN "gfx/battle_anims/charge.2bpp" +AnimObjWindGFX: INCBIN "gfx/battle_anims/wind.2bpp" +AnimObjWhipGFX: INCBIN "gfx/battle_anims/whip.2bpp" +AnimObjRopeGFX: INCBIN "gfx/battle_anims/rope.2bpp" +AnimObjEggGFX: INCBIN "gfx/battle_anims/egg.2bpp" +AnimObjPsychicGFX: INCBIN "gfx/battle_anims/psychic.2bpp" +AnimObjSandGFX: INCBIN "gfx/battle_anims/sand.2bpp" +AnimObjWebGFX: INCBIN "gfx/battle_anims/web.2bpp" +AnimObjHazeGFX: INCBIN "gfx/battle_anims/haze.2bpp" +AnimObjHornGFX: INCBIN "gfx/battle_anims/horn.2bpp" +AnimObjFlowerGFX: INCBIN "gfx/battle_anims/flower.2bpp" +AnimObjMiscGFX: +PointerGFX: INCBIN "gfx/battle_anims/pointer.2bpp" + INCBIN "gfx/battle_anims/misc.2bpp" +AnimObjSkyAttackGFX: INCBIN "gfx/battle_anims/skyattack.2bpp" +AnimObjGlobeGFX: INCBIN "gfx/battle_anims/globe.2bpp" +AnimObjShapesGFX: INCBIN "gfx/battle_anims/shapes.2bpp" +AnimObjStatusGFX: INCBIN "gfx/battle_anims/status.2bpp" +AnimObjObjectsGFX: INCBIN "gfx/battle_anims/objects.2bpp" +AnimObjShineGFX: INCBIN "gfx/battle_anims/shine.2bpp" +AnimObjAngelsGFX: INCBIN "gfx/battle_anims/angels.2bpp" + ;INCBIN "gfx/battle_anims/destinybond.2bpp" SECTION "gfx.asm@Pokemon Party Sprites", ROMX MenuMonIconGFX:: diff --git a/gfx/gfx.mk b/gfx/gfx.mk index 3b1665c..01ebd4f 100644 --- a/gfx/gfx.mk +++ b/gfx/gfx.mk @@ -31,3 +31,21 @@ $(BUILD)/gfx/battle_anims/attack_animations_1.2bpp: tools/gfx += --trim-whitespa $(BUILD)/gfx/battle_anims/attack_animations_2.2bpp: tools/gfx += --trim-whitespace $(BUILD)/gfx/title/title_logo.2bpp: tools/gfx += --trim-whitespace + +$(BUILD)/gfx/battle_anims/angels.2bpp: tools/gfx += --trim-whitespace +$(BUILD)/gfx/battle_anims/beam.2bpp: tools/gfx += --remove-xflip --remove-yflip --remove-whitespace +$(BUILD)/gfx/battle_anims/bubble.2bpp: tools/gfx += --trim-whitespace +$(BUILD)/gfx/battle_anims/charge.2bpp: tools/gfx += --trim-whitespace +$(BUILD)/gfx/battle_anims/egg.2bpp: tools/gfx += --remove-whitespace +$(BUILD)/gfx/battle_anims/explosion.2bpp: tools/gfx += --remove-whitespace +$(BUILD)/gfx/battle_anims/hit.2bpp: tools/gfx += --remove-whitespace +$(BUILD)/gfx/battle_anims/horn.2bpp: tools/gfx += --remove-whitespace +$(BUILD)/gfx/battle_anims/lightning.2bpp: tools/gfx += --remove-whitespace +$(BUILD)/gfx/battle_anims/misc.2bpp: tools/gfx += --remove-duplicates --remove-xflip +$(BUILD)/gfx/battle_anims/noise.2bpp: tools/gfx += --remove-whitespace +$(BUILD)/gfx/battle_anims/objects.2bpp: tools/gfx += --remove-whitespace --remove-xflip +$(BUILD)/gfx/battle_anims/pokeball.2bpp: tools/gfx += --remove-xflip --keep-whitespace +$(BUILD)/gfx/battle_anims/reflect.2bpp: tools/gfx += --remove-whitespace +$(BUILD)/gfx/battle_anims/rocks.2bpp: tools/gfx += --remove-whitespace +$(BUILD)/gfx/battle_anims/skyattack.2bpp: tools/gfx += --remove-whitespace +$(BUILD)/gfx/battle_anims/status.2bpp: tools/gfx += --remove-whitespace diff --git a/home/misc_3c43.asm b/home/misc_3c43.asm index 28ccb23..dfdcce0 100644 --- a/home/misc_3c43.asm +++ b/home/misc_3c43.asm @@ -29,7 +29,7 @@ CheckTossableItem:: ret GetBattleAnimPointer:: - ld a, BANK(BattleAnimationsBankRef) + ld a, BANK(BattleAnimations) ld [MBC3RomBank], a ldh [hROMBank], a @@ -53,7 +53,7 @@ GetBattleAnimByte:: inc hl ld d, [hl] - ld a, BANK(BattleAnimationsBankRef) + ld a, BANK(BattleAnimations) ld [MBC3RomBank], a ldh [hROMBank], a diff --git a/layout.link b/layout.link index 01ed8a8..08cec77 100644 --- a/layout.link +++ b/layout.link @@ -772,9 +772,16 @@ ROMX $31 ROMX $32 org $4000 "engine/battle_anims/bg_effects.asm" + "data/moves/animations.asm" + "engine/gfx/screen_effects.asm" ROMX $33 org $4000 + "engine/battle_anims/anim_commands.asm" + "engine/dumps/bank33.asm" + "engine/battle_anims/functions.asm" + "engine/battle_anims/helper.asm" + ROMX $34 org $4000 diff --git a/macros/battle_anims.asm b/macros/battle_anims.asm new file mode 100644 index 0000000..a491cb3 --- /dev/null +++ b/macros/battle_anims.asm @@ -0,0 +1,301 @@ +; BattleAnimCommands indexes (see engine/battle_anims/anim_commands.asm) +const_def $d0 +DEF FIRST_BATTLE_ANIM_CMD EQU const_value + +MACRO anim_wait + assert (\1) < FIRST_BATTLE_ANIM_CMD, "anim_wait argument must be less than {FIRST_BATTLE_ANIM_CMD}" + db \1 +ENDM + + const anim_obj_command ; $d0 +MACRO anim_obj + db anim_obj_command + if _NARG <= 4 + db \1 ; object + db \2 ; x + db \3 ; y + db \4 ; param + else + ; LEGACY: Support the tile+offset format + db \1 ; object + db (\2) * TILE_WIDTH + (\3) ; x_tile, x + db (\4) * TILE_WIDTH + (\5) ; y_tile, y + db \6 ; param + endc +ENDM + + const anim_1gfx_command ; $d1 +MACRO anim_1gfx + db anim_1gfx_command + db \1 ; gfx1 +ENDM + + const anim_2gfx_command ; $d2 +MACRO anim_2gfx + db anim_2gfx_command + db \1 ; gfx1 + db \2 ; gfx2 +ENDM + + const anim_3gfx_command ; $d3 +MACRO anim_3gfx + db anim_3gfx_command + db \1 ; gfx1 + db \2 ; gfx2 + db \3 ; gfx3 +ENDM + + const anim_4gfx_command ; $d4 +MACRO anim_4gfx + db anim_4gfx_command + db \1 ; gfx1 + db \2 ; gfx2 + db \3 ; gfx3 + db \4 ; gfx4 +ENDM + + const anim_5gfx_command ; $d5 +MACRO anim_5gfx + db anim_5gfx_command + db \1 ; gfx1 + db \2 ; gfx2 + db \3 ; gfx3 + db \4 ; gfx4 + db \5 ; gfx5 +ENDM + + const anim_incobj_command ; $d6 +MACRO anim_incobj + db anim_incobj_command + db \1 ; object_id +ENDM + + const anim_setobj_command ; $d7 +MACRO anim_setobj + db anim_setobj_command + db \1 ; object_id + db \2 ; value +ENDM + + const anim_incbgeffect_command ; $d8 +MACRO anim_incbgeffect + db anim_incbgeffect_command + db \1 ; effect +ENDM + + const anim_battlergfx_2row_command ; $d9 +MACRO anim_battlergfx_2row + db anim_battlergfx_2row_command +ENDM + + const anim_battlergfx_1row_command ; $da +MACRO anim_battlergfx_1row + db anim_battlergfx_1row_command +ENDM + + const anim_checkpokeball_command ; $db +MACRO anim_checkpokeball + db anim_checkpokeball_command +ENDM + + const anim_transform_command ; $dc +MACRO anim_transform + db anim_transform_command +ENDM + + const anim_raisesub_command ; $dd +MACRO anim_raisesub + db anim_raisesub_command +ENDM + + const anim_dropsub_command ; $de +MACRO anim_dropsub + db anim_dropsub_command +ENDM + + const anim_resetobp0_command ; $df +MACRO anim_resetobp0 + db anim_resetobp0_command +ENDM + + const anim_sound_command ; $e0 +MACRO anim_sound + db anim_sound_command + db (\1 << 2) | \2 ; duration, tracks + db \3 ; sound_id +ENDM + + const anim_cry_command ; $e1 +MACRO anim_cry + db anim_cry_command + db \1 ; pitch +ENDM + + const anim_minimizeopp_command ; $e2 +MACRO anim_minimizeopp + db anim_minimizeopp_command +ENDM + + const anim_oamon_command ; $e3 +MACRO anim_oamon + db anim_oamon_command +ENDM + + const anim_oamoff_command ; $e4 +MACRO anim_oamoff + db anim_oamoff_command +ENDM + + const anim_0xe5_command ; $e5 +MACRO anim_0xe5 + db anim_0xe5_command +ENDM + + const anim_0xe6_command ; $e6 +MACRO anim_0xe6 + db anim_0xe6_command +ENDM + + const anim_0xe7_command ; $e7 +MACRO anim_0xe7 + db anim_0xe7_command +ENDM + + const anim_updateactorpic_command ; $e8 +MACRO anim_updateactorpic + db anim_updateactorpic_command +ENDM + + const anim_minimize_command ; $e9 +MACRO anim_minimize + db anim_minimize_command +ENDM + + const anim_0xea_command ; $ea +MACRO anim_0xea + db anim_0xea_command +ENDM + + const anim_0xeb_command ; $eb +MACRO anim_0xeb + db anim_0xeb_command +ENDM + + const anim_0xec_command ; $ec +MACRO anim_0xec + db anim_0xec_command +ENDM + + const anim_0xed_command ; $ed +MACRO anim_0xed + db anim_0xed_command +ENDM + + const anim_if_param_and_command ; $ee +MACRO anim_if_param_and + db anim_if_param_and_command + db \1 ; value + dw \2 ; address +ENDM + + const anim_jumpuntil_command ; $ef +MACRO anim_jumpuntil + db anim_jumpuntil_command + dw \1 ; address +ENDM + + const anim_bgeffect_command ; $f0 +MACRO anim_bgeffect + db anim_bgeffect_command + db \1 ; effect + db \2 ; jumptable index + db \3 ; battle turn + db \4 ; unknown +ENDM + + const anim_bgp_command ; $f1 +MACRO anim_bgp + db anim_bgp_command + db \1 ; colors +ENDM + + const anim_obp0_command ; $f2 +MACRO anim_obp0 + db anim_obp0_command + db \1 ; colors +ENDM + + const anim_obp1_command ; $f3 +MACRO anim_obp1 + db anim_obp1_command + db \1 ; colors +ENDM + + const anim_keepsprites_command ; $f4 +MACRO anim_keepsprites + db anim_keepsprites_command +ENDM + + const anim_0xf5_command ; $f5 +MACRO anim_0xf5 + db anim_0xf5_command +ENDM + + const anim_0xf6_command ; $f6 +MACRO anim_0xf6 + db anim_0xf6_command +ENDM + + const anim_0xf7_command ; $f7 +MACRO anim_0xf7 + db anim_0xf7_command +ENDM + + const anim_if_param_equal_command ; $f8 +MACRO anim_if_param_equal + db anim_if_param_equal_command + db \1 ; value + dw \2 ; address +ENDM + + const anim_setvar_command ; $f9 +MACRO anim_setvar + db anim_setvar_command + db \1 ; value +ENDM + + const anim_incvar_command ; $fa +MACRO anim_incvar + db anim_incvar_command +ENDM + + const anim_if_var_equal_command ; $fb +MACRO anim_if_var_equal + db anim_if_var_equal_command + db \1 ; value + dw \2 ; address +ENDM + + const anim_jump_command ; $fc +MACRO anim_jump + db anim_jump_command + dw \1 ; address +ENDM + + const anim_loop_command ; $fd +MACRO anim_loop + db anim_loop_command + db \1 ; count + dw \2 ; address +ENDM + + const anim_call_command ; $fe +MACRO anim_call + db anim_call_command + dw \1 ; address +ENDM + + const anim_ret_command ; $ff +MACRO anim_ret + db anim_ret_command +ENDM diff --git a/macros/wram.asm b/macros/wram.asm index 6dd6ffc..fd0e780 100644 --- a/macros/wram.asm +++ b/macros/wram.asm @@ -332,38 +332,29 @@ MACRO sprite_anim_struct ENDM MACRO battle_anim_struct -; Placeholder until we can figure out what it all means -\1_Index:: ds 1 -\1_Anim01:: ds 1 -\1_Anim02:: ds 1 -\1_FramesetIndex:: ds 1 -\1_FunctionIndex:: ds 1 -\1_Anim05:: ds 1 -\1_TileID:: ds 1 -\1_XCoord:: ds 1 -\1_YCoord:: ds 1 -\1_XOffset:: ds 1 -\1_YOffset:: ds 1 -\1_Anim0b:: ds 1 -\1_Anim0c:: ds 1 -\1_Anim0d:: ds 1 -\1_AnonJumptableIndex:: ds 1 -\1_Anim0f:: ds 1 -\1_Anim10:: ds 1 -\1_Anim11:: ds 1 -\1_Anim12:: ds 1 -\1_Anim13:: ds 1 -\1_Anim14:: ds 1 -\1_Anim15:: ds 1 -\1_Anim16:: ds 1 -\1_Anim17:: ds 1 +\1Index:: db +\1OAMFlags:: db +\1FixY:: db +\1FramesetID:: db +\1Function:: db +\1TileID:: db +\1XCoord:: db +\1YCoord:: db +\1XOffset:: db +\1YOffset:: db +\1Param:: db +\1Duration:: db +\1Frame:: db +\1JumptableIndex:: db +\1Var1:: db +\1Var2:: db ENDM MACRO battle_bg_effect -\1_Function:: ds 1 -\1_01:: ds 1 -\1_02:: ds 1 -\1_03:: ds 1 +\1Function:: db +\1JumptableIndex:: db +\1BattleTurn:: db +\1Param:: db ENDM MACRO sprite_oam_struct diff --git a/ram/hram.asm b/ram/hram.asm index bd8ba70..1e267bc 100644 --- a/ram/hram.asm +++ b/ram/hram.asm @@ -150,6 +150,11 @@ hPrintNumDividend:: ds 3 ; big-endian hPrintNumDivisor:: ds 3 ; big-endian hPrintNumTemp:: ds 3 ; big-endian +NEXTU + ds 1 +hMutateWY:: db +hMutateWX:: db + ENDU ds 3 ; TODO diff --git a/ram/wram.asm b/ram/wram.asm index 5c12f79..24a777a 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -385,7 +385,19 @@ wPicrossErrorCheck:: ds 1 ds 1 NEXTU ; Battle-related - ds $1ea + ds $140 + +wBattleAnimTileDict:: +; wBattleAnimTileDict pairs keys with values +; keys: BATTLE_ANIM_GFX_* indexes (taken from anim_*gfx arguments) +; values: vTiles0 offsets + ds NUM_BATTLEANIMTILEDICT_ENTRIES * 2 + +wActiveAnimObjects:: +; wAnimObject1 - wAnimObject10 +for n, 1, NUM_BATTLE_ANIM_STRUCTS + 1 +wAnimObject{d:n}:: battle_anim_struct wAnimObject{d:n} +endr wActiveBGEffects:: wBGEffect1:: battle_bg_effect wBGEffect1 @@ -395,7 +407,7 @@ wBGEffect4:: battle_bg_effect wBGEffect4 wBGEffect5:: battle_bg_effect wBGEffect5 wActiveBGEffectsEnd:: -wNumActiveBattleAnims:: db +wLastAnimObjectIndex:: db wBattleAnimFlags:: db wBattleAnimAddress:: dw @@ -408,22 +420,39 @@ wBattleAnimOAMPointerLo:: db db UNION -; unidentified -wBattleAnimTemp0:: db -wBattleAnimTemp1:: db -wBattleAnimTemp2:: db -wBattleAnimTemp3:: db +wBattleObjectTempID:: db +wBattleObjectTempXCoord:: db +wBattleObjectTempYCoord:: db +wBattleObjectTempParam:: db + +NEXTU +wBattleBGEffectTempID:: db +wBattleBGEffectTempJumptableIndex:: db +wBattleBGEffectTempTurn:: db +wBattleBGEffectTempParam:: db + +NEXTU +wBattleSineWaveTempProgress:: db +wBattleSineWaveTempOffset:: db +wBattleSineWaveTempAmplitude:: db +wBattleSineWaveTempTimer:: db NEXTU wBattleAnimTempOAMFlags:: db -wBattleAnimTempField02:: db +wBattleAnimTempFixY:: db wBattleAnimTempTileID:: db wBattleAnimTempXCoord:: db wBattleAnimTempYCoord:: db wBattleAnimTempXOffset:: db wBattleAnimTempYOffset:: db -wBattleAnimTempAddSubFlags:: db +wBattleAnimTempFrameOAMFlags:: db wBattleAnimTempPalette:: db + +NEXTU +wBattleAnimGFXTempTileID:: +wBattleAnimGFXTempPicHeight:: db +wBattlePicResizeTempPointer:: dw + ENDU ds $32 @@ -1139,6 +1168,11 @@ NEXTU ; battle HUD wBattleHUDTiles:: ds PARTY_LENGTH +NEXTU +; thrown ball data +wFinalCatchRate:: db +wThrownBallWobbleCount:: db + ENDU wLinkBattleRNs:: ds 10 @@ -1240,7 +1274,7 @@ wListMoves_MoveIndicesBuffer:: ds NUM_MOVES wce32:: ds 1 wce33:: ds 1 wce34:: ds 1 -wce35:: ds 1 +wWildMon:: db wBattleHasJustStarted:: db wNamedObjectIndexBuffer:: diff --git a/shim.sym b/shim.sym index a557dc7..3836271 100644 --- a/shim.sym +++ b/shim.sym @@ -61,19 +61,48 @@ 23:4940 Function8c940 23:49C6 Function8c9c6 -32:76FF Functioncb6ff -32:7710 Functioncb710 -32:7733 Functioncb733 32:7FFF BattleAnimationsBankRef -33:4000 Functioncc000 -33:4000 Functioncc000_2 -33:4001 PlayBattleAnim -33:444F Functioncc44f -33:44D4 Functioncc4d4 -33:467B QueueBattleAnimation -33:625D BattleAnim_Sine_e -33:6263 BattleAnim_Cosine_e +;32:4cfe BattleAnimations +;32:5b8d BattleAnim_FocusEnergy +;32:7511 BattleAnimSub_Drain +;32:753d BattleAnimSub_EyeBeams +;32:7573 BattleAnimSub_WarpAway +;32:759a BattleAnimSub_Beam +;32:75c3 BattleAnimSub_Explosion1 +;32:75f0 BattleAnimSub_Explosion2 +;32:761d BattleAnimSub_Sound +;32:762d BattleAnimSub_Fire +;32:7640 BattleAnimSub_Ice +;32:7676 BattleAnimSub_Sludge +;32:7696 BattleAnimSub_Acid +;32:76a4 BattleAnimSub_Metallic +;32:76bc BattleAnimSub_SandOrMud +;32:76cb BattleAnim_TargetObj_1Row +;32:76d3 BattleAnim_TargetObj_2Row +;32:76db BattleAnim_ShowMon_0 +;32:76e5 BattleAnim_UserObj_1Row +;32:76ed BattleAnim_UserObj_2Row +;32:76f5 BattleAnim_ShowMon_1 +;33:480f BattleAnimObjects +;33:4b98 DoBattleAnimFrame + +;33:5081 BattleAnim_ScatterHorizontal +;33:61fd BattleAnim_StepToTarget +;33:6211 BattleAnim_AnonJumptable +;33:6224 BattleAnim_IncAnonJumptableIndex +;33:622a BattleAnim_Cosine +;33:622c BattleAnim_Sine +;33:62a9 ReinitBattleAnimFrameset +;33:62bb GetBattleAnimFrame +;33:625D BattleAnim_Sine_e +;33:6263 BattleAnim_Cosine_e +;33:6326 GetBattleAnimOAMPointer +;33:6330 LoadBattleAnimGFX +;33:697C BattleAnimOAMData +;33:6CC8 OAMData +;33:7780 AnimObjGFX + 38:48A2 PokerMinigame 38:5AE3 FifteenPuzzleMinigame diff --git a/tools/common.h b/tools/common.h index 4da0b2e..97d901e 100755 --- a/tools/common.h +++ b/tools/common.h @@ -1,39 +1,150 @@ #ifndef GUARD_COMMON_H #define GUARD_COMMON_H -int __getopt_long_i__; -#define getopt_long(c, v, s, l) getopt_long(c, v, s, l, &__getopt_long_i__) +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include -FILE *fopen_verbose(char *filename, char *mode) { +#ifndef PROGRAM_NAME +#error Define PROGRAM_NAME before including common.h! +#endif +#ifndef USAGE_OPTS +#error Define USAGE_OPTS before including common.h! +#endif + +#define COUNTOF(...) (sizeof(__VA_ARGS__) / sizeof(*(__VA_ARGS__))) + +#define error_exit(...) exit((fprintf(stderr, PROGRAM_NAME ": " __VA_ARGS__), 1)) + +noreturn void usage_exit(int status) { + fprintf(stderr, "Usage: " PROGRAM_NAME " " USAGE_OPTS "\n"); + exit(status); +} + +int getopt_long_index; +#define getopt_long(argc, argv, optstring, longopts) getopt_long(argc, argv, optstring, longopts, &getopt_long_index) + +void *xmalloc(size_t size) { + errno = 0; + void *m = malloc(size); + if (!m) { + error_exit("Could not allocate %zu bytes: %s\n", size, strerror(errno)); + } + return m; +} + +void *xcalloc(size_t size) { + errno = 0; + void *m = calloc(size, 1); + if (!m) { + error_exit("Could not allocate %zu bytes: %s\n", size, strerror(errno)); + } + return m; +} + +void *xrealloc(void *m, size_t size) { + errno = 0; + m = realloc(m, size); + if (!m) { + error_exit("Could not allocate %zu bytes: %s\n", size, strerror(errno)); + } + return m; +} + +FILE *xfopen(const char *filename, char rw) { + char mode[3] = {rw, 'b', '\0'}; + errno = 0; FILE *f = fopen(filename, mode); if (!f) { - fprintf(stderr, "Could not open file: \"%s\"\n", filename); + error_exit("Could not open file \"%s\": %s\n", filename, strerror(errno)); } return f; } -uint8_t *read_u8(char *filename, int *size) { - FILE *f = fopen_verbose(filename, "rb"); - if (!f) { - exit(1); +void xfread(uint8_t *data, size_t size, const char *filename, FILE *f) { + errno = 0; + if (fread(data, 1, size, f) != size) { + fclose(f); + error_exit("Could not read from file \"%s\": %s\n", filename, strerror(errno)); } - fseek(f, 0, SEEK_END); - *size = ftell(f); - rewind(f); - uint8_t *data = malloc(*size); - if (*size != (int)fread(data, 1, *size, f)) { - fprintf(stderr, "Could not read file: \"%s\"\n", filename); - exit(1); +} + +void xfwrite(const uint8_t *data, size_t size, const char *filename, FILE *f) { + errno = 0; + if (fwrite(data, 1, size, f) != size) { + fclose(f); + error_exit("Could not write to file \"%s\": %s\n", filename, strerror(errno)); } +} + +long xfsize(const char *filename, FILE *f) { + long size = -1; + errno = 0; + if (!fseek(f, 0, SEEK_END)) { + size = ftell(f); + if (size != -1) { + rewind(f); + } + } + if (size == -1) { + error_exit("Could not measure file \"%s\": %s\n", filename, strerror(errno)); + } + return size; +} + +uint8_t *read_u8(const char *filename, long *size) { + FILE *f = xfopen(filename, 'r'); + *size = xfsize(filename, f); + uint8_t *data = xmalloc(*size); + xfread(data, *size, filename, f); fclose(f); return data; } -void write_u8(char *filename, uint8_t *data, int size) { - FILE *f = fopen_verbose(filename, "wb"); - if (f) { - fwrite(data, 1, size, f); +void write_u8(const char *filename, uint8_t *data, size_t size) { + FILE *f = xfopen(filename, 'w'); + xfwrite(data, size, filename, f); + fclose(f); +} + +uint32_t read_png_width(const char *filename) { + FILE *f = xfopen(filename, 'r'); + uint8_t header[16] = {0}; + xfread(header, sizeof(header), filename, f); + static uint8_t expected_header[16] = { + 0x89, 'P', 'N', 'G', '\r', '\n', 0x1A, '\n', // signature + 0, 0, 0, 13, // IHDR chunk length + 'I', 'H', 'D', 'R', // IHDR chunk type + }; + if (memcmp(header, expected_header, sizeof(header))) { fclose(f); + error_exit("Not a valid PNG file: \"%s\"\n", filename); + } + uint8_t bytes[4] = {0}; + xfread(bytes, sizeof(bytes), filename, f); + fclose(f); + return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]; +} + +void read_dimensions(const char *filename, int *width) { + long filesize; + uint8_t *bytes = read_u8(filename, &filesize); + if (filesize != 1) { + error_exit("%s: invalid dimensions file\n", filename); + } + uint8_t dimensions = bytes[0]; + free(bytes); + *width = dimensions & 0xF; + int height = dimensions >> 4; + if (*width != height || (*width != 5 && *width != 6 && *width != 7)) { + error_exit("%s: invalid dimensions: %dx%d tiles\n", filename, *width, height); } } diff --git a/tools/gfx.c b/tools/gfx.c index 1ce0590..dd2b5bd 100755 --- a/tools/gfx.c +++ b/tools/gfx.c @@ -1,91 +1,118 @@ -#include -#include -#include -#include -#include -#include +#define PROGRAM_NAME "gfx" +#define USAGE_OPTS "[-h|--help] [--trim-whitespace] [--remove-whitespace] [--interleave] [--remove-duplicates [--keep-whitespace]] [--remove-xflip] [--remove-yflip] [--preserve indexes] [-d|--depth depth] [-p|--png filename.png] [-o|--out outfile] infile" #include "common.h" -static void usage(void) { - fprintf(stderr, "Usage: gfx [[--trim-whitespace] | [--trim-trailing]] [--remove-whitespace] [--interleave] " - "[--remove-duplicates [--keep-whitespace]] [--remove-xflip] [--remove-yflip] [--png filename] " - "[-d depth] [-h] [-o outfile] infile\n"); -} - -static void error(char *message) { - fputs(message, stderr); - fputs("\n", stderr); -} - struct Options { - int trim_whitespace; - int trim_trailing; - int remove_whitespace; - int help; - char *outfile; + bool trim_whitespace; + bool trim_trailing; + bool remove_whitespace; + bool interleave; + bool remove_duplicates; + bool keep_whitespace; + bool remove_xflip; + bool remove_yflip; + int *preserved; + int num_preserved; int depth; - int interleave; - int remove_duplicates; - int keep_whitespace; - int remove_xflip; - int remove_yflip; char *png_file; + char *outfile; }; -struct Options Options = { - .depth = 2, -}; +struct Options options = {.depth = 2}; -void get_args(int argc, char *argv[]) { +void parse_args(int argc, char *argv[]) { struct option long_options[] = { - {"remove-whitespace", no_argument, &Options.remove_whitespace, 1}, - {"trim-whitespace", no_argument, &Options.trim_whitespace, 1}, - {"trim-trailing", no_argument, &Options.trim_trailing, 1}, - {"interleave", no_argument, &Options.interleave, 1}, - {"remove-duplicates", no_argument, &Options.remove_duplicates, 1}, - {"keep-whitespace", no_argument, &Options.keep_whitespace, 1}, - {"remove-xflip", no_argument, &Options.remove_xflip, 1}, - {"remove-yflip", no_argument, &Options.remove_yflip, 1}, + {"remove-whitespace", no_argument, 0, 'R'}, + {"trim-whitespace", no_argument, 0, 'T'}, + {"trim-trailing", no_argument, 0, 't'}, + {"interleave", no_argument, 0, 'I'}, + {"remove-duplicates", no_argument, 0, 'D'}, + {"keep-whitespace", no_argument, 0, 'W'}, + {"remove-xflip", no_argument, 0, 'X'}, + {"remove-yflip", no_argument, 0, 'Y'}, + {"preserve", required_argument, 0, 'r'}, {"png", required_argument, 0, 'p'}, {"depth", required_argument, 0, 'd'}, + {"out", required_argument, 0, 'o'}, {"help", no_argument, 0, 'h'}, {0} }; - for (int opt = 0; opt != -1;) { - switch (opt = getopt_long(argc, argv, "ho:d:p:", long_options)) { - case 'h': - Options.help = true; + for (int opt; (opt = getopt_long(argc, argv, "d:o:p:h", long_options)) != -1;) { + switch (opt) { + case 'R': + options.remove_whitespace = true; break; - case 'o': - Options.outfile = optarg; + case 'T': + options.trim_whitespace = true; + break; + case 't': + options.trim_trailing = true; + break; + case 'I': + options.interleave = true; + break; + case 'D': + options.remove_duplicates = true; + break; + case 'W': + options.keep_whitespace = true; + break; + case 'X': + options.remove_xflip = true; + break; + case 'Y': + options.remove_yflip = true; + break; + case 'r': + for (char *token = strtok(optarg, ","); token; token = strtok(NULL, ",")) { + options.preserved = xrealloc(options.preserved, ++options.num_preserved * sizeof(*options.preserved)); + options.preserved[options.num_preserved-1] = strtoul(token, NULL, 0); + } break; case 'd': - Options.depth = strtoul(optarg, NULL, 0); + options.depth = strtoul(optarg, NULL, 0); break; case 'p': - Options.png_file = optarg; + options.png_file = optarg; break; - case 0: - case -1: + case 'o': + options.outfile = optarg; + break; + case 'h': + usage_exit(0); break; default: - usage(); - exit(1); - break; + usage_exit(1); } } } struct Graphic { - int size; uint8_t *data; + long size; }; -bool is_whitespace(uint8_t *tile, int tile_size) { - uint8_t WHITESPACE = 0; +bool is_preserved(int index) { + for (int i = 0; i < options.num_preserved; i++) { + if (options.preserved[i] == index) { + return true; + } + } + return false; +} + +void shift_preserved(int removed_index) { + for (int i = 0; i < options.num_preserved; i++) { + if (options.preserved[i] >= removed_index) { + options.preserved[i]--; + } + } +} + +bool is_whitespace(const uint8_t *tile, int tile_size) { for (int i = 0; i < tile_size; i++) { - if (tile[i] != WHITESPACE) { + if (tile[i] != 0) { return false; } } @@ -114,9 +141,9 @@ bool is_solid_color(uint8_t *tile, int depth, int tile_size) { } void trim_whitespace(struct Graphic *graphic) { - int tile_size = Options.depth * 8; + int tile_size = options.depth * 8; for (int i = graphic->size - tile_size; i > 0; i -= tile_size) { - if (is_whitespace(&graphic->data[i], tile_size)) { + if (is_whitespace(&graphic->data[i], tile_size) && !is_preserved(i / tile_size)) { graphic->size = i; } else { break; @@ -125,9 +152,9 @@ void trim_whitespace(struct Graphic *graphic) { } void trim_trailing(struct Graphic *graphic) { - int tile_size = Options.depth * 8; + int tile_size = options.depth * 8; int last_tile = graphic->size - tile_size; - if (!is_solid_color(&graphic->data[last_tile], Options.depth, tile_size)) { + if (!is_solid_color(&graphic->data[last_tile], options.depth, tile_size)) { return; } for (int i = graphic->size - 2 * tile_size; i > 0; i -= tile_size) { @@ -139,30 +166,34 @@ void trim_trailing(struct Graphic *graphic) { } } +int get_tile_size(void) { + return options.depth * (options.interleave ? 16 : 8); +} + void remove_whitespace(struct Graphic *graphic) { - int tile_size = Options.depth * 8; - if (Options.interleave) tile_size *= 2; + int tile_size = get_tile_size(); + graphic->size &= ~(tile_size - 1); int i = 0; - for (int j = 0; i < graphic->size && j < graphic->size; i += tile_size, j += tile_size) { - while (is_whitespace(&graphic->data[j], tile_size)) { - j += tile_size; + for (int j = 0, d = 0; i < graphic->size && j < graphic->size; i += tile_size, j += tile_size) { + for (; j < graphic->size && is_whitespace(&graphic->data[j], tile_size) && !is_preserved(j / tile_size - d); j += tile_size, d++) { + shift_preserved(j / tile_size - d); } if (j >= graphic->size) { break; - } - if (j > i) { + } else if (j > i) { memcpy(&graphic->data[i], &graphic->data[j], tile_size); } } graphic->size = i; } -bool tile_exists(uint8_t *tile, uint8_t *tiles, int tile_size, int num_tiles) { +bool tile_exists(const uint8_t *tile, const uint8_t *tiles, int tile_size, int num_tiles) { for (int i = 0; i < num_tiles; i++) { bool match = true; for (int j = 0; j < tile_size; j++) { if (tile[j] != tiles[i * tile_size + j]) { match = false; + break; } } if (match) { @@ -173,15 +204,15 @@ bool tile_exists(uint8_t *tile, uint8_t *tiles, int tile_size, int num_tiles) { } void remove_duplicates(struct Graphic *graphic) { - int tile_size = Options.depth * 8; - if (Options.interleave) tile_size *= 2; + int tile_size = get_tile_size(); + graphic->size &= ~(tile_size - 1); int num_tiles = 0; - for (int i = 0, j = 0; i < graphic->size && j < graphic->size; i += tile_size, j += tile_size) { - while (tile_exists(&graphic->data[j], graphic->data, tile_size, num_tiles)) { - if (Options.keep_whitespace && is_whitespace(&graphic->data[j], tile_size)) { + for (int i = 0, j = 0, d = 0; i < graphic->size && j < graphic->size; i += tile_size, j += tile_size) { + for (; j < graphic->size && tile_exists(&graphic->data[j], graphic->data, tile_size, num_tiles); j += tile_size, d++) { + if ((options.keep_whitespace && is_whitespace(&graphic->data[j], tile_size)) || is_preserved(j / tile_size - d)) { break; } - j += tile_size; + shift_preserved(j / tile_size - d); } if (j >= graphic->size) { break; @@ -194,41 +225,49 @@ void remove_duplicates(struct Graphic *graphic) { graphic->size = num_tiles * tile_size; } -bool flip_exists(uint8_t *tile, uint8_t *tiles, int tile_size, int num_tiles, bool xflip, bool yflip) { - uint8_t *flip = calloc(tile_size, 1); +// for (int i = 0; i < 256; i++) +// for (int bit = 0; bit < 8; bit++) { +// flipped[i] |= ((i >> bit) & 1) << (7 - bit); +const uint8_t flipped[256] = { + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, + 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, + 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, + 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, + 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, + 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, + 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, + 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, + 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, + 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, + 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, + 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, + 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, + 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, + 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, + 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff +}; + +bool flip_exists(const uint8_t *tile, const uint8_t *tiles, int tile_size, int num_tiles, bool xflip, bool yflip) { + uint8_t flip[tile_size]; // VLA + memset(flip, 0, tile_size); int half_size = tile_size / 2; for (int i = 0; i < tile_size; i++) { - int byte = i; - if (yflip) { - byte = tile_size - 1 - (i ^ 1); - if (Options.interleave && i < half_size) { - byte = half_size - 1 - (i ^ 1); - } - } - if (xflip) { - for (int bit = 0; bit < 8; bit++) { - flip[byte] |= ((tile[i] >> bit) & 1) << (7 - bit); - } - } else { - flip[byte] = tile[i]; - } + int j = yflip ? (options.interleave && i < half_size ? half_size : tile_size) - 1 - (i ^ 1) : i; + flip[j] = xflip ? flipped[tile[i]] : tile[i]; } - if (tile_exists(flip, tiles, tile_size, num_tiles)) { - return true; - } - return false; + return tile_exists(flip, tiles, tile_size, num_tiles); } void remove_flip(struct Graphic *graphic, bool xflip, bool yflip) { - int tile_size = Options.depth * 8; - if (Options.interleave) tile_size *= 2; + int tile_size = get_tile_size(); + graphic->size &= ~(tile_size - 1); int num_tiles = 0; - for (int i = 0, j = 0; i < graphic->size && j < graphic->size; i += tile_size, j += tile_size) { - while (flip_exists(&graphic->data[j], graphic->data, tile_size, num_tiles, xflip, yflip)) { - if (Options.keep_whitespace && is_whitespace(&graphic->data[j], tile_size)) { + for (int i = 0, j = 0, d = 0; i < graphic->size && j < graphic->size; i += tile_size, j += tile_size) { + for (; j < graphic->size && flip_exists(&graphic->data[j], graphic->data, tile_size, num_tiles, xflip, yflip); j += tile_size, d++) { + if ((options.keep_whitespace && is_whitespace(&graphic->data[j], tile_size)) || is_preserved(j / tile_size - d)) { break; } - j += tile_size; + shift_preserved(j / tile_size - d); } if (j >= graphic->size) { break; @@ -242,18 +281,13 @@ void remove_flip(struct Graphic *graphic, bool xflip, bool yflip) { } void interleave(struct Graphic *graphic, int width) { - int tile_size = Options.depth * 8; + int tile_size = options.depth * 8; int width_tiles = width / 8; int num_tiles = graphic->size / tile_size; - uint8_t *interleaved = malloc(graphic->size); + uint8_t *interleaved = xmalloc(graphic->size); for (int i = 0; i < num_tiles; i++) { - int tile = i * 2; int row = i / width_tiles; - tile -= width_tiles * row; - if (row % 2) { - tile -= width_tiles; - tile += 1; - } + int tile = i * 2 - (row % 2 ? width_tiles * (row + 1) - 1 : width_tiles * row); memcpy(&interleaved[tile * tile_size], &graphic->data[i * tile_size], tile_size); } graphic->size = num_tiles * tile_size; @@ -261,78 +295,49 @@ void interleave(struct Graphic *graphic, int width) { free(interleaved); } -int png_get_width(char *filename) { - FILE *f = fopen_verbose(filename, "rb"); - if (!f) { - exit(1); - } - - const int OFFSET_WIDTH = 16; - uint8_t bytes[4]; - fseek(f, OFFSET_WIDTH, SEEK_SET); - size_t size = 4; - size_t result = fread(bytes, 1, size, f); - fclose(f); - if (result != size) { - fprintf(stderr, "Could not read file at offset 0x%x: \"%s\"\n", OFFSET_WIDTH, filename); - exit(1); - } - - int width = 0; - for (int i = 0; i < 4; i++) { - width |= bytes[i] << (8 * (3 - i)); - } - return width; -} - - int main(int argc, char *argv[]) { - get_args(argc, argv); + parse_args(argc, argv); + argc -= optind; argv += optind; - if (Options.help) { - usage(); - return 0; - } if (argc < 1) { - usage(); - exit(1); + usage_exit(1); } - char *infile = argv[0]; + struct Graphic graphic; - graphic.data = read_u8(infile, &graphic.size); - if (Options.trim_whitespace) { + graphic.data = read_u8(argv[0], &graphic.size); + + if (options.trim_whitespace) { trim_whitespace(&graphic); - } else if (Options.trim_trailing) { + } else if (options.trim_trailing) { trim_trailing(&graphic); } - if (Options.interleave) { - if (!Options.png_file) { - error("interleave: need --png to infer dimensions"); - usage(); - exit(1); + if (options.interleave) { + if (!options.png_file) { + error_exit("--interleave needs --png to infer dimensions\n"); } - int width = png_get_width(Options.png_file); + int width = read_png_width(options.png_file); interleave(&graphic, width); } - if (Options.remove_duplicates) { + if (options.remove_duplicates) { remove_duplicates(&graphic); } - if (Options.remove_xflip) { + if (options.remove_xflip) { remove_flip(&graphic, true, false); } - if (Options.remove_yflip) { + if (options.remove_yflip) { remove_flip(&graphic, false, true); } - if (Options.remove_xflip && Options.remove_yflip) { + if (options.remove_xflip && options.remove_yflip) { remove_flip(&graphic, true, true); } - if (Options.remove_whitespace) { + if (options.remove_whitespace) { remove_whitespace(&graphic); } - if (Options.outfile) { - write_u8(Options.outfile, graphic.data, graphic.size); + if (options.outfile) { + write_u8(options.outfile, graphic.data, graphic.size); } + free(graphic.data); return 0; }