summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/battle_anim_effects_1.s6
-rw-r--r--asm/rock.s1558
-rw-r--r--data/data_835B488.s21
-rw-r--r--data/graphics.s2
-rw-r--r--include/battle_anim.h10
-rw-r--r--include/gba/io_reg.h1
-rw-r--r--include/graphics.h5
-rw-r--r--ld_script.txt3
-rw-r--r--src/ghost.c10
-rw-r--r--src/rock.c833
10 files changed, 869 insertions, 1580 deletions
diff --git a/asm/battle_anim_effects_1.s b/asm/battle_anim_effects_1.s
index b71600380..42b3517f2 100644
--- a/asm/battle_anim_effects_1.s
+++ b/asm/battle_anim_effects_1.s
@@ -1316,8 +1316,8 @@ _080A2D08:
bx r0
thumb_func_end sub_80A2C68
- thumb_func_start sub_80A2D10
-sub_80A2D10: @ 80A2D10
+ thumb_func_start AnimMoveTwisterParticle
+AnimMoveTwisterParticle: @ 80A2D10
push {r4,lr}
adds r4, r0, 0
bl IsContest
@@ -1361,7 +1361,7 @@ _080A2D3C:
_080A2D64: .4byte gBattleAnimTarget
_080A2D68: .4byte gBattleAnimArgs
_080A2D6C: .4byte sub_80A2D70
- thumb_func_end sub_80A2D10
+ thumb_func_end AnimMoveTwisterParticle
thumb_func_start sub_80A2D70
sub_80A2D70: @ 80A2D70
diff --git a/asm/rock.s b/asm/rock.s
deleted file mode 100644
index 7df02ecc3..000000000
--- a/asm/rock.s
+++ /dev/null
@@ -1,1558 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_80B4634
-sub_80B4634: @ 80B4634
- push {r4-r6,lr}
- adds r5, r0, 0
- ldr r6, _080B46A0 @ =gBattleAnimArgs
- movs r1, 0x6
- ldrsh r0, [r6, r1]
- cmp r0, 0
- beq _080B4654
- ldr r0, _080B46A4 @ =gBattleAnimTarget
- ldrb r0, [r0]
- adds r2, r5, 0
- adds r2, 0x20
- adds r3, r5, 0
- adds r3, 0x22
- movs r1, 0
- bl SetAverageBattlerPositions
-_080B4654:
- ldrh r0, [r6]
- ldrh r1, [r5, 0x20]
- adds r0, r1
- movs r4, 0
- strh r0, [r5, 0x20]
- ldrh r0, [r5, 0x22]
- adds r0, 0xE
- strh r0, [r5, 0x22]
- ldrb r1, [r6, 0x2]
- adds r0, r5, 0
- bl StartSpriteAnim
- adds r0, r5, 0
- bl AnimateSprite
- strh r4, [r5, 0x2E]
- strh r4, [r5, 0x30]
- movs r0, 0x4
- strh r0, [r5, 0x32]
- movs r0, 0x10
- strh r0, [r5, 0x34]
- ldr r0, _080B46A8 @ =0x0000ffba
- strh r0, [r5, 0x36]
- ldrh r0, [r6, 0x4]
- strh r0, [r5, 0x38]
- ldr r1, _080B46AC @ =sub_80B46B4
- adds r0, r5, 0
- bl StoreSpriteCallbackInData6
- ldr r1, _080B46B0 @ =TranslateSpriteInEllipseOverDuration
- str r1, [r5, 0x1C]
- adds r0, r5, 0
- bl _call_via_r1
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080B46A0: .4byte gBattleAnimArgs
-_080B46A4: .4byte gBattleAnimTarget
-_080B46A8: .4byte 0x0000ffba
-_080B46AC: .4byte sub_80B46B4
-_080B46B0: .4byte TranslateSpriteInEllipseOverDuration
- thumb_func_end sub_80B4634
-
- thumb_func_start sub_80B46B4
-sub_80B46B4: @ 80B46B4
- push {r4,lr}
- adds r4, r0, 0
- ldrh r1, [r4, 0x38]
- ldrh r2, [r4, 0x20]
- adds r0, r1, r2
- strh r0, [r4, 0x20]
- movs r0, 0xC0
- strh r0, [r4, 0x2E]
- strh r1, [r4, 0x30]
- movs r0, 0x4
- strh r0, [r4, 0x32]
- movs r0, 0x20
- strh r0, [r4, 0x34]
- ldr r0, _080B46EC @ =0x0000ffe8
- strh r0, [r4, 0x36]
- ldr r1, _080B46F0 @ =DestroySpriteAndMatrix
- adds r0, r4, 0
- bl StoreSpriteCallbackInData6
- ldr r1, _080B46F4 @ =TranslateSpriteInEllipseOverDuration
- str r1, [r4, 0x1C]
- adds r0, r4, 0
- bl _call_via_r1
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080B46EC: .4byte 0x0000ffe8
-_080B46F0: .4byte DestroySpriteAndMatrix
-_080B46F4: .4byte TranslateSpriteInEllipseOverDuration
- thumb_func_end sub_80B46B4
-
- thumb_func_start sub_80B46F8
-sub_80B46F8: @ 80B46F8
- push {r4,r5,lr}
- adds r5, r0, 0
- ldr r4, _080B4720 @ =gBattleAnimArgs
- ldrb r1, [r4, 0xA]
- bl StartSpriteAnim
- adds r0, r5, 0
- bl AnimateSprite
- ldr r0, _080B4724 @ =gBattleAnimAttacker
- ldrb r0, [r0]
- bl GetBattlerSide
- lsls r0, 24
- cmp r0, 0
- beq _080B4728
- ldrh r0, [r5, 0x20]
- ldrh r1, [r4]
- subs r0, r1
- b _080B472E
- .align 2, 0
-_080B4720: .4byte gBattleAnimArgs
-_080B4724: .4byte gBattleAnimAttacker
-_080B4728:
- ldrh r0, [r4]
- ldrh r1, [r5, 0x20]
- adds r0, r1
-_080B472E:
- strh r0, [r5, 0x20]
- ldr r3, _080B4770 @ =gBattleAnimArgs
- ldrh r2, [r3, 0x2]
- ldrh r0, [r5, 0x22]
- adds r2, r0
- movs r4, 0
- strh r2, [r5, 0x22]
- ldrh r0, [r3, 0x8]
- strh r0, [r5, 0x2E]
- ldrh r0, [r5, 0x20]
- strh r0, [r5, 0x30]
- ldrh r1, [r3, 0x4]
- adds r0, r1
- strh r0, [r5, 0x32]
- strh r2, [r5, 0x34]
- ldrh r0, [r3, 0x6]
- adds r2, r0
- strh r2, [r5, 0x36]
- adds r0, r5, 0
- bl InitSpriteDataForLinearTranslation
- strh r4, [r5, 0x34]
- strh r4, [r5, 0x36]
- ldr r0, _080B4774 @ =TranslateSpriteLinearFixedPoint
- str r0, [r5, 0x1C]
- ldr r1, _080B4778 @ =DestroySpriteAndMatrix
- adds r0, r5, 0
- bl StoreSpriteCallbackInData6
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080B4770: .4byte gBattleAnimArgs
-_080B4774: .4byte TranslateSpriteLinearFixedPoint
-_080B4778: .4byte DestroySpriteAndMatrix
- thumb_func_end sub_80B46F8
-
- thumb_func_start sub_80B477C
-sub_80B477C: @ 80B477C
- push {r4,lr}
- adds r4, r0, 0
- ldr r0, _080B4794 @ =gBattleAnimArgs
- movs r1, 0xC
- ldrsh r0, [r0, r1]
- cmp r0, 0
- bne _080B4798
- adds r0, r4, 0
- movs r1, 0
- bl InitSpritePosToAnimAttacker
- b _080B47A0
- .align 2, 0
-_080B4794: .4byte gBattleAnimArgs
-_080B4798:
- adds r0, r4, 0
- movs r1, 0
- bl InitSpritePosToAnimTarget
-_080B47A0:
- ldr r1, _080B47BC @ =gBattleAnimArgs
- ldrh r0, [r1, 0x6]
- strh r0, [r4, 0x2E]
- ldrh r0, [r1, 0x4]
- strh r0, [r4, 0x30]
- ldrh r0, [r1, 0x8]
- strh r0, [r4, 0x32]
- ldrh r0, [r1, 0xA]
- strh r0, [r4, 0x34]
- ldr r0, _080B47C0 @ =sub_80B47C4
- str r0, [r4, 0x1C]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080B47BC: .4byte gBattleAnimArgs
-_080B47C0: .4byte sub_80B47C4
- thumb_func_end sub_80B477C
-
- thumb_func_start sub_80B47C4
-sub_80B47C4: @ 80B47C4
- push {r4,lr}
- adds r4, r0, 0
- ldrh r0, [r4, 0x30]
- ldrh r1, [r4, 0x36]
- adds r0, r1
- strh r0, [r4, 0x36]
- lsls r0, 16
- asrs r0, 24
- negs r0, r0
- strh r0, [r4, 0x26]
- movs r2, 0x38
- ldrsh r0, [r4, r2]
- movs r2, 0x34
- ldrsh r1, [r4, r2]
- bl Sin
- strh r0, [r4, 0x24]
- ldrh r0, [r4, 0x32]
- ldrh r1, [r4, 0x38]
- adds r0, r1
- movs r1, 0xFF
- ands r0, r1
- strh r0, [r4, 0x38]
- ldrh r0, [r4, 0x2E]
- subs r0, 0x1
- strh r0, [r4, 0x2E]
- lsls r0, 16
- asrs r0, 16
- movs r1, 0x1
- negs r1, r1
- cmp r0, r1
- bne _080B480A
- adds r0, r4, 0
- bl DestroyAnimSprite
-_080B480A:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80B47C4
-
- thumb_func_start do_boulder_dust
-do_boulder_dust: @ 80B4810
- push {r4-r6,lr}
- sub sp, 0x10
- lsls r0, 24
- lsrs r6, r0, 24
- movs r5, 0
- ldr r1, _080B48E4 @ =0x00003f42
- movs r0, 0x50
- bl SetGpuReg
- movs r1, 0x80
- lsls r1, 5
- movs r0, 0x52
- bl SetGpuReg
- movs r0, 0x1
- movs r1, 0x4
- movs r2, 0x1
- bl SetAnimBgAttribute
- movs r0, 0x1
- movs r1, 0
- movs r2, 0
- bl SetAnimBgAttribute
- bl IsContest
- lsls r0, 24
- cmp r0, 0
- bne _080B4854
- movs r0, 0x1
- movs r1, 0x3
- movs r2, 0x1
- bl SetAnimBgAttribute
-_080B4854:
- ldr r0, _080B48E8 @ =gBattle_BG1_X
- strh r5, [r0]
- ldr r4, _080B48EC @ =gBattle_BG1_Y
- strh r5, [r4]
- movs r0, 0x14
- movs r1, 0
- bl SetGpuReg
- ldrh r1, [r4]
- movs r0, 0x16
- bl SetGpuReg
- mov r0, sp
- bl sub_80752A0
- mov r0, sp
- ldrb r0, [r0, 0x9]
- ldr r1, _080B48F0 @ =gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap
- bl AnimLoadCompressedBgTilemap
- mov r0, sp
- ldrb r0, [r0, 0x9]
- ldr r1, _080B48F4 @ =gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet
- mov r2, sp
- ldrh r2, [r2, 0xA]
- bl AnimLoadCompressedBgGfx
- ldr r0, _080B48F8 @ =gFile_graphics_battle_anims_sprites_261_palette
- mov r1, sp
- ldrb r1, [r1, 0x8]
- lsls r1, 4
- movs r2, 0x20
- bl LoadCompressedPalette
- bl IsContest
- lsls r0, 24
- cmp r0, 0
- beq _080B48B0
- mov r0, sp
- ldrb r0, [r0, 0x8]
- ldr r1, [sp, 0x4]
- movs r2, 0
- movs r3, 0
- bl sub_80730C0
-_080B48B0:
- ldr r0, _080B48FC @ =gBattleAnimArgs
- movs r1, 0
- ldrsh r0, [r0, r1]
- cmp r0, 0
- beq _080B48CA
- ldr r0, _080B4900 @ =gBattleAnimAttacker
- ldrb r0, [r0]
- bl GetBattlerSide
- lsls r0, 24
- cmp r0, 0
- beq _080B48CA
- movs r5, 0x1
-_080B48CA:
- ldr r0, _080B4904 @ =gTasks
- lsls r1, r6, 2
- adds r1, r6
- lsls r1, 3
- adds r1, r0
- strh r5, [r1, 0x8]
- ldr r0, _080B4908 @ =sub_80B490C
- str r0, [r1]
- add sp, 0x10
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080B48E4: .4byte 0x00003f42
-_080B48E8: .4byte gBattle_BG1_X
-_080B48EC: .4byte gBattle_BG1_Y
-_080B48F0: .4byte gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap
-_080B48F4: .4byte gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet
-_080B48F8: .4byte gFile_graphics_battle_anims_sprites_261_palette
-_080B48FC: .4byte gBattleAnimArgs
-_080B4900: .4byte gBattleAnimAttacker
-_080B4904: .4byte gTasks
-_080B4908: .4byte sub_80B490C
- thumb_func_end do_boulder_dust
-
- thumb_func_start sub_80B490C
-sub_80B490C: @ 80B490C
- push {r4,r5,lr}
- sub sp, 0x10
- lsls r0, 24
- lsrs r5, r0, 24
- ldr r1, _080B4934 @ =gTasks
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- adds r0, r1
- movs r2, 0x8
- ldrsh r0, [r0, r2]
- adds r2, r1, 0
- cmp r0, 0
- bne _080B4940
- ldr r1, _080B4938 @ =gBattle_BG1_X
- ldr r3, _080B493C @ =0x0000fffa
- adds r0, r3, 0
- ldrh r3, [r1]
- adds r0, r3
- b _080B4946
- .align 2, 0
-_080B4934: .4byte gTasks
-_080B4938: .4byte gBattle_BG1_X
-_080B493C: .4byte 0x0000fffa
-_080B4940:
- ldr r1, _080B4974 @ =gBattle_BG1_X
- ldrh r0, [r1]
- adds r0, 0x6
-_080B4946:
- strh r0, [r1]
- ldr r1, _080B4978 @ =gBattle_BG1_Y
- ldr r3, _080B497C @ =0x0000ffff
- adds r0, r3, 0
- ldrh r3, [r1]
- adds r0, r3
- strh r0, [r1]
- lsls r1, r5, 2
- adds r0, r1, r5
- lsls r0, 3
- adds r0, r2
- movs r3, 0x20
- ldrsh r0, [r0, r3]
- adds r4, r1, 0
- cmp r0, 0x4
- bls _080B4968
- b _080B4A96
-_080B4968:
- lsls r0, 2
- ldr r1, _080B4980 @ =_080B4984
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_080B4974: .4byte gBattle_BG1_X
-_080B4978: .4byte gBattle_BG1_Y
-_080B497C: .4byte 0x0000ffff
-_080B4980: .4byte _080B4984
- .align 2, 0
-_080B4984:
- .4byte _080B4998
- .4byte _080B49DA
- .4byte _080B49F4
- .4byte _080B4A36
- .4byte _080B4A58
-_080B4998:
- adds r0, r4, r5
- lsls r0, 3
- adds r4, r0, r2
- ldrh r0, [r4, 0x1C]
- adds r0, 0x1
- movs r5, 0
- strh r0, [r4, 0x1C]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x4
- bne _080B4A96
- strh r5, [r4, 0x1C]
- ldrh r1, [r4, 0x1E]
- adds r1, 0x1
- strh r1, [r4, 0x1E]
- movs r0, 0x10
- subs r0, r1
- lsls r0, 8
- orrs r1, r0
- lsls r1, 16
- lsrs r1, 16
- movs r0, 0x52
- bl SetGpuReg
- movs r1, 0x1E
- ldrsh r0, [r4, r1]
- cmp r0, 0x7
- bne _080B4A96
- ldrh r0, [r4, 0x20]
- adds r0, 0x1
- strh r0, [r4, 0x20]
- strh r5, [r4, 0x1E]
- b _080B4A96
-_080B49DA:
- adds r0, r4, r5
- lsls r0, 3
- adds r1, r0, r2
- ldrh r0, [r1, 0x1E]
- adds r0, 0x1
- strh r0, [r1, 0x1E]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x65
- bne _080B4A96
- movs r0, 0x7
- strh r0, [r1, 0x1E]
- b _080B4A4C
-_080B49F4:
- adds r0, r4, r5
- lsls r0, 3
- adds r4, r0, r2
- ldrh r0, [r4, 0x1C]
- adds r0, 0x1
- strh r0, [r4, 0x1C]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x4
- bne _080B4A96
- movs r0, 0
- strh r0, [r4, 0x1C]
- ldrh r1, [r4, 0x1E]
- subs r1, 0x1
- strh r1, [r4, 0x1E]
- movs r0, 0x10
- subs r0, r1
- lsls r0, 8
- orrs r1, r0
- lsls r1, 16
- lsrs r1, 16
- movs r0, 0x52
- bl SetGpuReg
- movs r2, 0x1E
- ldrsh r1, [r4, r2]
- cmp r1, 0
- bne _080B4A96
- ldrh r0, [r4, 0x20]
- adds r0, 0x1
- strh r0, [r4, 0x20]
- strh r1, [r4, 0x1E]
- b _080B4A96
-_080B4A36:
- mov r0, sp
- bl sub_80752A0
- mov r0, sp
- ldrb r0, [r0, 0x9]
- bl sub_8075358
- ldr r0, _080B4A54 @ =gTasks
- adds r1, r4, r5
- lsls r1, 3
- adds r1, r0
-_080B4A4C:
- ldrh r0, [r1, 0x20]
- adds r0, 0x1
- strh r0, [r1, 0x20]
- b _080B4A96
- .align 2, 0
-_080B4A54: .4byte gTasks
-_080B4A58:
- bl IsContest
- lsls r0, 24
- cmp r0, 0
- bne _080B4A6C
- movs r0, 0x1
- movs r1, 0x3
- movs r2, 0
- bl SetAnimBgAttribute
-_080B4A6C:
- ldr r0, _080B4AA0 @ =gBattle_BG1_X
- movs r1, 0
- strh r1, [r0]
- ldr r0, _080B4AA4 @ =gBattle_BG1_Y
- strh r1, [r0]
- movs r0, 0x50
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x52
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x1
- movs r1, 0x4
- movs r2, 0x1
- bl SetAnimBgAttribute
- adds r0, r5, 0
- bl DestroyAnimVisualTask
-_080B4A96:
- add sp, 0x10
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080B4AA0: .4byte gBattle_BG1_X
-_080B4AA4: .4byte gBattle_BG1_Y
- thumb_func_end sub_80B490C
-
- thumb_func_start sub_80B4AA8
-sub_80B4AA8: @ 80B4AA8
- push {r4,r5,lr}
- adds r5, r0, 0
- movs r1, 0x2E
- ldrsh r0, [r5, r1]
- cmp r0, 0
- bne _080B4B24
- ldr r4, _080B4AEC @ =gBattleAnimArgs
- movs r2, 0x6
- ldrsh r0, [r4, r2]
- cmp r0, 0
- beq _080B4AF4
- ldr r0, _080B4AF0 @ =gBattleAnimAttacker
- ldrb r0, [r0]
- bl GetBattlerSide
- lsls r0, 24
- cmp r0, 0
- beq _080B4AF4
- movs r0, 0x98
- lsls r0, 1
- strh r0, [r5, 0x20]
- ldrh r0, [r4, 0x2]
- negs r0, r0
- strh r0, [r4, 0x2]
- movs r0, 0x1
- strh r0, [r5, 0x38]
- ldrb r1, [r5, 0x3]
- subs r0, 0x40
- ands r0, r1
- movs r1, 0x10
- orrs r0, r1
- strb r0, [r5, 0x3]
- b _080B4AF8
- .align 2, 0
-_080B4AEC: .4byte gBattleAnimArgs
-_080B4AF0: .4byte gBattleAnimAttacker
-_080B4AF4:
- ldr r0, _080B4B18 @ =0x0000ffc0
- strh r0, [r5, 0x20]
-_080B4AF8:
- ldr r4, _080B4B1C @ =gBattleAnimArgs
- ldrh r0, [r4]
- strh r0, [r5, 0x22]
- ldr r1, _080B4B20 @ =gUnknown_83E7470
- adds r0, r5, 0
- bl SetSubspriteTables
- ldrh r0, [r4, 0x2]
- strh r0, [r5, 0x30]
- ldrh r0, [r4, 0x4]
- strh r0, [r5, 0x32]
- ldrh r0, [r5, 0x2E]
- adds r0, 0x1
- strh r0, [r5, 0x2E]
- b _080B4B80
- .align 2, 0
-_080B4B18: .4byte 0x0000ffc0
-_080B4B1C: .4byte gBattleAnimArgs
-_080B4B20: .4byte gUnknown_83E7470
-_080B4B24:
- ldrh r1, [r5, 0x30]
- ldrh r3, [r5, 0x34]
- adds r1, r3
- ldrh r2, [r5, 0x32]
- ldrh r0, [r5, 0x36]
- adds r2, r0
- lsls r0, r1, 16
- asrs r0, 24
- ldrh r3, [r5, 0x24]
- adds r0, r3
- strh r0, [r5, 0x24]
- lsls r0, r2, 16
- asrs r0, 24
- ldrh r3, [r5, 0x26]
- adds r0, r3
- strh r0, [r5, 0x26]
- movs r0, 0xFF
- ands r1, r0
- strh r1, [r5, 0x34]
- ands r2, r0
- strh r2, [r5, 0x36]
- movs r1, 0x38
- ldrsh r0, [r5, r1]
- cmp r0, 0
- bne _080B4B6A
- movs r2, 0x20
- ldrsh r0, [r5, r2]
- movs r3, 0x24
- ldrsh r1, [r5, r3]
- adds r0, r1
- movs r1, 0x88
- lsls r1, 1
- cmp r0, r1
- ble _080B4B80
- b _080B4B7C
-_080B4B6A:
- movs r1, 0x20
- ldrsh r0, [r5, r1]
- movs r2, 0x24
- ldrsh r1, [r5, r2]
- adds r0, r1
- movs r1, 0x20
- negs r1, r1
- cmp r0, r1
- bge _080B4B80
-_080B4B7C:
- ldr r0, _080B4B88 @ =DestroyAnimSprite
- str r0, [r5, 0x1C]
-_080B4B80:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080B4B88: .4byte DestroyAnimSprite
- thumb_func_end sub_80B4AA8
-
- thumb_func_start sub_80B4B8C
-sub_80B4B8C: @ 80B4B8C
- push {r4,r5,lr}
- adds r4, r0, 0
- ldr r5, _080B4BC4 @ =gBattleAnimArgs
- ldrb r1, [r5, 0x8]
- bl StartSpriteAnim
- adds r0, r4, 0
- movs r1, 0
- bl InitSpritePosToAnimAttacker
- ldrh r0, [r5, 0x6]
- strh r0, [r4, 0x2E]
- ldrh r0, [r4, 0x20]
- strh r0, [r4, 0x32]
- ldrh r0, [r5, 0x4]
- ldrh r1, [r4, 0x22]
- adds r0, r1
- strh r0, [r4, 0x36]
- ldr r0, _080B4BC8 @ =StartAnimLinearTranslation
- str r0, [r4, 0x1C]
- ldr r1, _080B4BCC @ =DestroyAnimSprite
- adds r0, r4, 0
- bl StoreSpriteCallbackInData6
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080B4BC4: .4byte gBattleAnimArgs
-_080B4BC8: .4byte StartAnimLinearTranslation
-_080B4BCC: .4byte DestroyAnimSprite
- thumb_func_end sub_80B4B8C
-
- thumb_func_start sub_80B4BD0
-sub_80B4BD0: @ 80B4BD0
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- ldr r0, _080B4C50 @ =gTasks
- adds r6, r1, r0
- ldr r5, _080B4C54 @ =gBattleAnimAttacker
- ldrb r0, [r5]
- movs r1, 0x2
- bl GetBattlerSpriteCoord
- lsls r0, 24
- lsrs r0, 24
- mov r9, r0
- ldrb r0, [r5]
- movs r1, 0x1
- bl GetBattlerSpriteCoord
- lsls r0, 24
- lsrs r0, 8
- movs r1, 0xC0
- lsls r1, 13
- adds r0, r1
- lsrs r7, r0, 16
- ldr r4, _080B4C58 @ =gBattleAnimTarget
- ldrb r0, [r4]
- movs r1, 0x2
- bl GetBattlerSpriteCoord
- lsls r0, 24
- lsrs r0, 24
- mov r10, r0
- ldrb r0, [r4]
- movs r1, 0x1
- bl GetBattlerSpriteCoord
- lsls r0, 24
- lsrs r0, 8
- movs r2, 0xC0
- lsls r2, 13
- adds r0, r2
- lsrs r0, 16
- mov r8, r0
- ldrb r1, [r5]
- movs r0, 0x2
- eors r0, r1
- ldrb r4, [r4]
- cmp r0, r4
- bne _080B4C40
- mov r8, r7
-_080B4C40:
- bl sub_80B4FB8
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x1
- bne _080B4C5C
- movs r0, 0x20
- b _080B4C62
- .align 2, 0
-_080B4C50: .4byte gTasks
-_080B4C54: .4byte gBattleAnimAttacker
-_080B4C58: .4byte gBattleAnimTarget
-_080B4C5C:
- lsls r1, r5, 3
- movs r0, 0x30
- subs r0, r1
-_080B4C62:
- strh r0, [r6, 0x18]
- movs r4, 0
- strh r4, [r6, 0x8]
- strh r4, [r6, 0x1E]
- strh r4, [r6, 0x1A]
- movs r0, 0x1
- strh r0, [r6, 0x20]
- movs r1, 0x18
- ldrsh r0, [r6, r1]
- cmp r0, 0
- bge _080B4C7A
- adds r0, 0x7
-_080B4C7A:
- asrs r0, 3
- subs r0, 0x1
- strh r0, [r6, 0x1C]
- mov r2, r9
- lsls r0, r2, 3
- strh r0, [r6, 0xC]
- lsls r0, r7, 3
- strh r0, [r6, 0xE]
- mov r1, r10
- subs r0, r1, r2
- lsls r0, 3
- movs r2, 0x18
- ldrsh r1, [r6, r2]
- bl __divsi3
- strh r0, [r6, 0x10]
- mov r1, r8
- subs r0, r1, r7
- lsls r0, 3
- movs r2, 0x18
- ldrsh r1, [r6, r2]
- bl __divsi3
- strh r0, [r6, 0x12]
- strh r4, [r6, 0x14]
- strh r4, [r6, 0x16]
- movs r0, 0x40
- negs r0, r0
- bl BattleAnimAdjustPanning
- adds r4, r0, 0
- lsls r4, 24
- asrs r4, 8
- lsrs r4, 16
- movs r0, 0x3F
- bl BattleAnimAdjustPanning
- lsls r0, 24
- strh r4, [r6, 0x22]
- asrs r0, 24
- lsls r4, 16
- asrs r4, 16
- subs r0, r4
- movs r2, 0x18
- ldrsh r1, [r6, r2]
- bl __divsi3
- strh r0, [r6, 0x24]
- strh r5, [r6, 0xA]
- movs r0, 0
- bl GetAnimBattlerSpriteId
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r6, 0x26]
- ldr r0, _080B4CFC @ =sub_80B4D00
- str r0, [r6]
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080B4CFC: .4byte sub_80B4D00
- thumb_func_end sub_80B4BD0
-
- thumb_func_start sub_80B4D00
-sub_80B4D00: @ 80B4D00
- push {r4,lr}
- lsls r0, 24
- lsrs r2, r0, 24
- lsls r0, r2, 2
- adds r0, r2
- lsls r0, 3
- ldr r1, _080B4D24 @ =gTasks
- adds r4, r0, r1
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- cmp r0, 0x4
- bls _080B4D1A
- b _080B4E68
-_080B4D1A:
- lsls r0, 2
- ldr r1, _080B4D28 @ =_080B4D2C
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_080B4D24: .4byte gTasks
-_080B4D28: .4byte _080B4D2C
- .align 2, 0
-_080B4D2C:
- .4byte _080B4D40
- .4byte _080B4DA4
- .4byte _080B4DAC
- .4byte _080B4E08
- .4byte _080B4E5A
-_080B4D40:
- ldrh r2, [r4, 0x14]
- ldrh r0, [r4, 0x10]
- subs r2, r0
- strh r2, [r4, 0x14]
- ldrh r0, [r4, 0x16]
- ldrh r1, [r4, 0x12]
- subs r0, r1
- strh r0, [r4, 0x16]
- ldr r3, _080B4DA0 @ =gSprites
- movs r0, 0x26
- ldrsh r1, [r4, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r3
- lsls r2, 16
- asrs r2, 19
- strh r2, [r0, 0x24]
- movs r1, 0x26
- ldrsh r0, [r4, r1]
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- adds r1, r3
- ldrh r0, [r4, 0x16]
- lsls r0, 16
- asrs r0, 19
- strh r0, [r1, 0x26]
- ldrh r0, [r4, 0x1A]
- adds r0, 0x1
- strh r0, [r4, 0x1A]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0xA
- bne _080B4D90
- movs r0, 0x14
- strh r0, [r4, 0x1E]
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
-_080B4D90:
- ldrh r1, [r4, 0x22]
- lsls r1, 24
- asrs r1, 24
- movs r0, 0x9B
- bl PlaySE12WithPanning
- b _080B4E68
- .align 2, 0
-_080B4DA0: .4byte gSprites
-_080B4DA4:
- ldrh r0, [r4, 0x1E]
- subs r0, 0x1
- strh r0, [r4, 0x1E]
- b _080B4E4C
-_080B4DAC:
- ldrh r0, [r4, 0x1A]
- subs r0, 0x1
- strh r0, [r4, 0x1A]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0
- beq _080B4DCC
- ldrh r0, [r4, 0x10]
- ldrh r2, [r4, 0x14]
- adds r0, r2
- strh r0, [r4, 0x14]
- ldrh r0, [r4, 0x12]
- ldrh r1, [r4, 0x16]
- adds r0, r1
- strh r0, [r4, 0x16]
- b _080B4DD6
-_080B4DCC:
- strh r0, [r4, 0x14]
- strh r0, [r4, 0x16]
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
-_080B4DD6:
- ldr r2, _080B4E04 @ =gSprites
- movs r1, 0x26
- ldrsh r0, [r4, r1]
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- adds r1, r2
- ldrh r0, [r4, 0x14]
- lsls r0, 16
- asrs r0, 19
- strh r0, [r1, 0x24]
- movs r1, 0x26
- ldrsh r0, [r4, r1]
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- adds r1, r2
- ldrh r0, [r4, 0x16]
- lsls r0, 16
- asrs r0, 19
- strh r0, [r1, 0x26]
- b _080B4E68
- .align 2, 0
-_080B4E04: .4byte gSprites
-_080B4E08:
- ldrh r0, [r4, 0x10]
- ldrh r2, [r4, 0xC]
- adds r0, r2
- strh r0, [r4, 0xC]
- ldrh r0, [r4, 0x12]
- ldrh r1, [r4, 0xE]
- adds r0, r1
- strh r0, [r4, 0xE]
- ldrh r0, [r4, 0x1A]
- adds r0, 0x1
- strh r0, [r4, 0x1A]
- lsls r0, 16
- asrs r0, 16
- movs r2, 0x1C
- ldrsh r1, [r4, r2]
- cmp r0, r1
- blt _080B4E46
- movs r0, 0
- strh r0, [r4, 0x1A]
- adds r0, r4, 0
- bl sub_80B4E70
- ldrh r1, [r4, 0x24]
- ldrh r0, [r4, 0x22]
- adds r1, r0
- strh r1, [r4, 0x22]
- lsls r1, 24
- asrs r1, 24
- movs r0, 0xA8
- bl PlaySE12WithPanning
-_080B4E46:
- ldrh r0, [r4, 0x18]
- subs r0, 0x1
- strh r0, [r4, 0x18]
-_080B4E4C:
- lsls r0, 16
- cmp r0, 0
- bne _080B4E68
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- b _080B4E68
-_080B4E5A:
- movs r1, 0x1E
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _080B4E68
- adds r0, r2, 0
- bl DestroyAnimVisualTask
-_080B4E68:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80B4D00
-
- thumb_func_start sub_80B4E70
-sub_80B4E70: @ 80B4E70
- push {r4-r7,lr}
- adds r4, r0, 0
- ldrh r0, [r4, 0xA]
- subs r0, 0x1
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x4
- bhi _080B4F60
- lsls r0, 2
- ldr r1, _080B4E8C @ =_080B4E90
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_080B4E8C: .4byte _080B4E90
- .align 2, 0
-_080B4E90:
- .4byte _080B4EA4
- .4byte _080B4EB0
- .4byte _080B4EB0
- .4byte _080B4EBC
- .4byte _080B4EC8
-_080B4EA4:
- ldr r3, _080B4EAC @ =gUnknown_83E74D8
- movs r5, 0
- b _080B4ECC
- .align 2, 0
-_080B4EAC: .4byte gUnknown_83E74D8
-_080B4EB0:
- ldr r3, _080B4EB8 @ =gUnknown_83E74F0
- movs r5, 0x50
- b _080B4ECC
- .align 2, 0
-_080B4EB8: .4byte gUnknown_83E74F0
-_080B4EBC:
- ldr r3, _080B4EC4 @ =gUnknown_83E74F0
- movs r5, 0x40
- b _080B4ECC
- .align 2, 0
-_080B4EC4: .4byte gUnknown_83E74F0
-_080B4EC8:
- ldr r3, _080B4F68 @ =gUnknown_83E74F0
- movs r5, 0x30
-_080B4ECC:
- ldrh r1, [r4, 0xC]
- lsls r1, 16
- asrs r1, 19
- lsls r1, 16
- lsrs r1, 16
- ldrh r2, [r4, 0xE]
- lsls r2, 16
- asrs r2, 19
- lsls r2, 16
- movs r6, 0x20
- ldrsh r0, [r4, r6]
- lsls r0, 2
- adds r1, r0
- lsls r1, 16
- lsrs r6, r1, 16
- asrs r1, 16
- lsrs r7, r2, 16
- asrs r2, 16
- adds r0, r3, 0
- movs r3, 0x23
- bl CreateSprite
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x40
- beq _080B4F58
- ldr r1, _080B4F6C @ =gSprites
- lsls r0, r2, 4
- adds r0, r2
- lsls r0, 2
- adds r0, r1
- movs r1, 0x12
- strh r1, [r0, 0x2E]
- movs r2, 0x20
- ldrsh r1, [r4, r2]
- lsls r2, r1, 2
- adds r2, r1
- lsls r2, 2
- adds r2, r6, r2
- movs r6, 0xA
- ldrsh r3, [r4, r6]
- lsls r1, r3, 1
- adds r1, r3
- adds r2, r1
- strh r2, [r0, 0x32]
- strh r7, [r0, 0x36]
- movs r1, 0xA
- ldrsh r2, [r4, r1]
- lsls r2, 1
- movs r3, 0x10
- negs r3, r3
- adds r1, r3, 0
- subs r1, r2
- strh r1, [r0, 0x38]
- ldrh r3, [r0, 0x4]
- lsls r2, r3, 22
- lsrs r2, 22
- adds r2, r5
- ldr r5, _080B4F70 @ =0x000003ff
- adds r1, r5, 0
- ands r2, r1
- ldr r1, _080B4F74 @ =0xfffffc00
- ands r1, r3
- orrs r1, r2
- strh r1, [r0, 0x4]
- bl InitAnimArcTranslation
- ldrh r0, [r4, 0x1E]
- adds r0, 0x1
- strh r0, [r4, 0x1E]
-_080B4F58:
- movs r6, 0x20
- ldrsh r0, [r4, r6]
- negs r0, r0
- strh r0, [r4, 0x20]
-_080B4F60:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080B4F68: .4byte gUnknown_83E74F0
-_080B4F6C: .4byte gSprites
-_080B4F70: .4byte 0x000003ff
-_080B4F74: .4byte 0xfffffc00
- thumb_func_end sub_80B4E70
-
- thumb_func_start sub_80B4F78
-sub_80B4F78: @ 80B4F78
- push {r4,lr}
- adds r4, r0, 0
- bl TranslateAnimHorizontalArc
- lsls r0, 24
- cmp r0, 0
- beq _080B4FAA
- ldr r0, _080B4FB0 @ =sub_80B4D00
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0xFF
- beq _080B4FA4
- ldr r0, _080B4FB4 @ =gTasks
- lsls r1, r2, 2
- adds r1, r2
- lsls r1, 3
- adds r1, r0
- ldrh r0, [r1, 0x1E]
- subs r0, 0x1
- strh r0, [r1, 0x1E]
-_080B4FA4:
- adds r0, r4, 0
- bl DestroySprite
-_080B4FAA:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080B4FB0: .4byte sub_80B4D00
-_080B4FB4: .4byte gTasks
- thumb_func_end sub_80B4F78
-
- thumb_func_start sub_80B4FB8
-sub_80B4FB8: @ 80B4FB8
- push {lr}
- ldr r0, _080B4FE0 @ =gAnimDisableStructPtr
- ldr r0, [r0]
- ldrb r1, [r0, 0x11]
- lsrs r0, r1, 4
- lsls r1, 28
- lsrs r1, 28
- subs r0, r1
- lsls r0, 24
- lsrs r1, r0, 24
- movs r2, 0xFF
- lsls r2, 24
- adds r0, r2
- lsrs r0, 24
- cmp r0, 0x4
- bls _080B4FDA
- movs r1, 0x1
-_080B4FDA:
- adds r0, r1, 0
- pop {r1}
- bx r1
- .align 2, 0
-_080B4FE0: .4byte gAnimDisableStructPtr
- thumb_func_end sub_80B4FB8
-
- thumb_func_start sub_80B4FE4
-sub_80B4FE4: @ 80B4FE4
- push {r4,r5,lr}
- adds r4, r0, 0
- ldr r5, _080B501C @ =gBattleAnimArgs
- ldrb r1, [r5, 0x8]
- bl StartSpriteAnim
- ldrh r0, [r5]
- strh r0, [r4, 0x24]
- ldrh r0, [r5, 0x2]
- strh r0, [r4, 0x32]
- ldrh r0, [r4, 0x34]
- ldrh r1, [r5, 0x4]
- subs r0, r1
- strh r0, [r4, 0x34]
- movs r0, 0x3
- strh r0, [r4, 0x2E]
- ldrh r0, [r5, 0x6]
- strh r0, [r4, 0x30]
- ldr r0, _080B5020 @ =sub_80B5024
- str r0, [r4, 0x1C]
- adds r4, 0x3E
- ldrb r0, [r4]
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r4]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080B501C: .4byte gBattleAnimArgs
-_080B5020: .4byte sub_80B5024
- thumb_func_end sub_80B4FE4
-
- thumb_func_start sub_80B5024
-sub_80B5024: @ 80B5024
- push {lr}
- adds r2, r0, 0
- adds r3, r2, 0
- adds r3, 0x3E
- ldrb r0, [r3]
- movs r1, 0x5
- negs r1, r1
- ands r1, r0
- strb r1, [r3]
- ldrh r1, [r2, 0x34]
- movs r3, 0x34
- ldrsh r0, [r2, r3]
- cmp r0, 0
- beq _080B505C
- ldrh r3, [r2, 0x32]
- adds r0, r1, r3
- strh r0, [r2, 0x26]
- ldrh r0, [r2, 0x2E]
- adds r1, r0
- strh r1, [r2, 0x34]
- adds r0, 0x1
- strh r0, [r2, 0x2E]
- lsls r1, 16
- cmp r1, 0
- ble _080B506E
- movs r0, 0
- strh r0, [r2, 0x34]
- b _080B506E
-_080B505C:
- ldrh r0, [r2, 0x30]
- subs r0, 0x1
- strh r0, [r2, 0x30]
- lsls r0, 16
- cmp r0, 0
- bne _080B506E
- adds r0, r2, 0
- bl DestroyAnimSprite
-_080B506E:
- pop {r0}
- bx r0
- thumb_func_end sub_80B5024
-
- thumb_func_start sub_80B5074
-sub_80B5074: @ 80B5074
- push {r4,lr}
- adds r4, r0, 0
- ldr r0, _080B509C @ =gBattleAnimAttacker
- ldrb r0, [r0]
- bl GetBattlerSide
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080B5090
- adds r0, r4, 0
- movs r1, 0x1
- bl StartSpriteAffineAnim
-_080B5090:
- adds r0, r4, 0
- bl TranslateAnimSpriteToTargetMonLocation
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080B509C: .4byte gBattleAnimAttacker
- thumb_func_end sub_80B5074
-
- thumb_func_start sub_80B50A0
-sub_80B50A0: @ 80B50A0
- push {r4,r5,lr}
- adds r4, r0, 0
- ldr r5, _080B50EC @ =gBattleAnimTarget
- ldrb r0, [r5]
- movs r1, 0
- bl GetBattlerSpriteCoord
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4, 0x20]
- ldrb r0, [r5]
- movs r1, 0x1
- bl GetBattlerSpriteCoord
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _080B50F0 @ =gBattleAnimArgs
- ldrh r3, [r2]
- ldrh r5, [r4, 0x20]
- adds r1, r3, r5
- strh r1, [r4, 0x20]
- ldrh r1, [r2, 0x2]
- adds r0, r1
- strh r0, [r4, 0x22]
- strh r3, [r4, 0x30]
- strh r1, [r4, 0x32]
- ldrh r0, [r2, 0x4]
- strh r0, [r4, 0x38]
- ldrb r1, [r2, 0x6]
- adds r0, r4, 0
- bl StartSpriteAnim
- ldr r0, _080B50F4 @ =sub_80B50F8
- str r0, [r4, 0x1C]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080B50EC: .4byte gBattleAnimTarget
-_080B50F0: .4byte gBattleAnimArgs
-_080B50F4: .4byte sub_80B50F8
- thumb_func_end sub_80B50A0
-
- thumb_func_start sub_80B50F8
-sub_80B50F8: @ 80B50F8
- push {r4,lr}
- adds r4, r0, 0
- ldrh r0, [r4, 0x2E]
- adds r0, 0x8
- strh r0, [r4, 0x2E]
- ldrh r0, [r4, 0x30]
- ldrh r1, [r4, 0x34]
- adds r0, r1
- strh r0, [r4, 0x34]
- ldrh r0, [r4, 0x32]
- ldrh r2, [r4, 0x36]
- adds r0, r2
- strh r0, [r4, 0x36]
- movs r1, 0x34
- ldrsh r0, [r4, r1]
- movs r1, 0x28
- bl __divsi3
- ldrh r1, [r4, 0x24]
- adds r1, r0
- strh r1, [r4, 0x24]
- movs r2, 0x2E
- ldrsh r0, [r4, r2]
- movs r2, 0x38
- ldrsh r1, [r4, r2]
- bl Sin
- ldrh r1, [r4, 0x26]
- subs r1, r0
- strh r1, [r4, 0x26]
- movs r1, 0x2E
- ldrsh r0, [r4, r1]
- cmp r0, 0x8C
- ble _080B5142
- adds r0, r4, 0
- bl DestroyAnimSprite
-_080B5142:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80B50F8
-
- thumb_func_start sub_80B5148
-sub_80B5148: @ 80B5148
- push {lr}
- lsls r0, 24
- lsrs r3, r0, 24
- ldr r2, _080B5180 @ =gAnimMoveDmg
- ldr r0, [r2]
- cmp r0, 0x20
- bgt _080B515C
- ldr r1, _080B5184 @ =gBattleAnimArgs
- movs r0, 0
- strh r0, [r1, 0xE]
-_080B515C:
- ldr r2, [r2]
- adds r0, r2, 0
- subs r0, 0x21
- cmp r0, 0x20
- bhi _080B516C
- ldr r1, _080B5184 @ =gBattleAnimArgs
- movs r0, 0x1
- strh r0, [r1, 0xE]
-_080B516C:
- cmp r2, 0x41
- ble _080B5176
- ldr r1, _080B5184 @ =gBattleAnimArgs
- movs r0, 0x2
- strh r0, [r1, 0xE]
-_080B5176:
- adds r0, r3, 0
- bl DestroyAnimVisualTask
- pop {r0}
- bx r0
- .align 2, 0
-_080B5180: .4byte gAnimMoveDmg
-_080B5184: .4byte gBattleAnimArgs
- thumb_func_end sub_80B5148
-
- thumb_func_start sub_80B5188
-sub_80B5188: @ 80B5188
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r6, r0, 24
- ldr r1, _080B51E4 @ =gTasks
- lsls r0, r6, 2
- adds r0, r6
- lsls r0, 3
- adds r5, r0, r1
- movs r1, 0x8
- ldrsh r0, [r5, r1]
- cmp r0, 0
- bne _080B51AA
- movs r0, 0
- bl sub_8075458
- movs r0, 0xC8
- strh r0, [r5, 0xA]
-_080B51AA:
- ldr r4, _080B51E8 @ =gBattle_BG3_Y
- movs r1, 0xA
- ldrsh r0, [r5, r1]
- movs r1, 0xA
- bl __divsi3
- ldrh r1, [r4]
- adds r1, r0
- strh r1, [r4]
- ldrh r0, [r5, 0xA]
- subs r0, 0x3
- strh r0, [r5, 0xA]
- movs r1, 0x8
- ldrsh r0, [r5, r1]
- cmp r0, 0x78
- bne _080B51D6
- movs r0, 0x1
- bl sub_8075458
- adds r0, r6, 0
- bl DestroyAnimVisualTask
-_080B51D6:
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080B51E4: .4byte gTasks
-_080B51E8: .4byte gBattle_BG3_Y
- thumb_func_end sub_80B5188
-
- thumb_func_start sub_80B51EC
-sub_80B51EC: @ 80B51EC
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r0, 24
- adds r5, r0, 0
- ldr r1, _080B5258 @ =gTasks
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- adds r4, r0, r1
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _080B5218
- movs r0, 0
- bl sub_8075458
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- ldr r0, _080B525C @ =gBattle_BG3_Y
- ldrh r0, [r0]
- strh r0, [r4, 0xC]
-_080B5218:
- ldrh r0, [r4, 0xA]
- adds r0, 0x50
- movs r1, 0xFF
- ands r0, r1
- strh r0, [r4, 0xA]
- ldr r6, _080B525C @ =gBattle_BG3_Y
- movs r2, 0xA
- ldrsh r1, [r4, r2]
- movs r0, 0x4
- bl Cos
- ldrh r4, [r4, 0xC]
- adds r0, r4
- strh r0, [r6]
- ldr r0, _080B5260 @ =gBattleAnimArgs
- movs r2, 0xE
- ldrsh r1, [r0, r2]
- ldr r0, _080B5264 @ =0x00000fff
- cmp r1, r0
- bne _080B5250
- movs r0, 0
- strh r0, [r6]
- movs r0, 0x1
- bl sub_8075458
- adds r0, r5, 0
- bl DestroyAnimVisualTask
-_080B5250:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080B5258: .4byte gTasks
-_080B525C: .4byte gBattle_BG3_Y
-_080B5260: .4byte gBattleAnimArgs
-_080B5264: .4byte 0x00000fff
- thumb_func_end sub_80B51EC
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/data/data_835B488.s b/data/data_835B488.s
index fd6f9c209..cf435e174 100644
--- a/data/data_835B488.s
+++ b/data/data_835B488.s
@@ -843,13 +843,19 @@ gUnknown_83E4410:: @ 83E4410
.incbin "baserom.gba", 0x3E4410, 0x1488
gUnknown_83E5898:: @ 83E5898
- .incbin "baserom.gba", 0x3E5898, 0x248
+ .incbin "baserom.gba", 0x3E5898, 0xC0
+
+gUnknown_83E5958:: @ 83E5958
+ .incbin "baserom.gba", 0x3E5958, 0x188
gUnknown_83E5AE0:: @ 83E5AE0
.incbin "baserom.gba", 0x3E5AE0, 0xA8
gUnknown_83E5B88:: @ 83E5B88
- .incbin "baserom.gba", 0x3E5B88, 0x2A4
+ .incbin "baserom.gba", 0x3E5B88, 0x1C0
+
+gUnknown_83E5D48:: @ 83E5D48
+ .incbin "baserom.gba", 0x3E5D48, 0xE4
gUnknown_83E5E2C:: @ 83E5E2C
.incbin "baserom.gba", 0x3E5E2C, 0x18
@@ -915,16 +921,7 @@ gUnknown_83E7044:: @ 83E7044
.incbin "baserom.gba", 0x3E7044, 0xD0
gUnknown_83E7114:: @ 83E7114
- .incbin "baserom.gba", 0x3E7114, 0x35C
-
-gUnknown_83E7470:: @ 83E7470
- .incbin "baserom.gba", 0x3E7470, 0x68
-
-gUnknown_83E74D8:: @ 83E74D8
- .incbin "baserom.gba", 0x3E74D8, 0x18
-
-gUnknown_83E74F0:: @ 83E74F0
- .incbin "baserom.gba", 0x3E74F0, 0xB8
+ .incbin "baserom.gba", 0x3E7114, 0x27C
.section .rodata.83E7CFC
diff --git a/data/graphics.s b/data/graphics.s
index 79b622cfa..379411a67 100644
--- a/data/graphics.s
+++ b/data/graphics.s
@@ -13554,7 +13554,7 @@ gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet:: @ 8E794D0
.incbin "graphics/battle_anims/backgrounds/sandstorm_brew.4bpp.lz"
.align 2
-gFile_graphics_battle_anims_sprites_261_palette:: @ 8E799FC
+gBattleAnimSpritePal_FlyingDirt:: @ 8E799FC
.incbin "graphics/battle_anims/sprites/261.gbapal.lz"
.align 2
diff --git a/include/battle_anim.h b/include/battle_anim.h
index 09eeefb44..b5bdd05ce 100644
--- a/include/battle_anim.h
+++ b/include/battle_anim.h
@@ -74,6 +74,7 @@ extern struct OamData gOamData_83ACB18;
extern struct OamData gOamData_83ACB38;
extern struct OamData gOamData_83ACA18;
extern struct OamData gOamData_83ACB20;
+extern struct OamData gOamData_83ACB50;
void ClearBattleAnimationVars(void);
void DoMoveAnim(u16 move);
@@ -102,6 +103,9 @@ void sub_80BCEF4(s32 bgId, u8 arg1, u8 arg2, u8 battlerPosition, u8 arg4, u8 *ar
// battle_anim_special.s
void sub_80F1720(u8 battler, struct Pokemon *mon);
+// battle_anim_effects_1.s
+void AnimMoveTwisterParticle(struct Sprite *sprite);
+
enum
{
BATTLER_COORD_X,
@@ -302,6 +306,12 @@ void sub_80B63B4(u8 taskId);
void sub_80B68C8(u8 taskId);
void sub_80B6BBC(u8 taskId);
+// rock.c
+void AnimTask_LoadSandstormBackground(u8 taskId);
+void sub_80B4BD0(u8 taskId);
+void AnimTask_GetSeismicTossDamageLevel(u8 taskId);
+void sub_80B5188(u8 taskId);
+void sub_80B51EC(u8 taskId);
// flying.s
void sub_80B1D3C(struct Sprite *sprite);
diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h
index 2eefb2482..6d54bc5fb 100644
--- a/include/gba/io_reg.h
+++ b/include/gba/io_reg.h
@@ -596,6 +596,7 @@
// BLDALPHA
#define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1))
+#define BLDALPHA_BLEND2(target1, target2) ((target1) | ((target2) << 8))
// SOUNDCNT_H
#define SOUND_CGB_MIX_QUARTER 0x0000
diff --git a/include/graphics.h b/include/graphics.h
index 492b21893..1c0612fd1 100644
--- a/include/graphics.h
+++ b/include/graphics.h
@@ -986,6 +986,11 @@ extern const u32 gFile_graphics_battle_anims_backgrounds_scary_face_sheet[];
extern const u32 gFile_graphics_battle_anims_backgrounds_scary_face_palette[];
extern const u32 gFile_graphics_battle_anims_backgrounds_scary_face_player_tilemap[];
+// rock
+extern const u32 gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap[];
+extern const u32 gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet[];
+extern const u32 gBattleAnimSpritePal_FlyingDirt[];
+
// title_screen
extern const u16 gGraphics_TitleScreen_PokemonFireRedLogoPals[];
extern const u8 gGraphics_TitleScreen_PokemonFireRedLogoTiles[];
diff --git a/ld_script.txt b/ld_script.txt
index d7681bda0..9b9147b00 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -164,7 +164,7 @@ SECTIONS {
asm/flying.o(.text);
asm/psychic.o(.text);
asm/bug.o(.text);
- asm/rock.o(.text);
+ src/rock.o(.text);
src/ghost.o(.text);
src/dragon.o(.text);
src/dark.o(.text);
@@ -423,6 +423,7 @@ SECTIONS {
src/battle_anim_mon_movement.o(.rodata);
src/item.o(.rodata);
data/data_835B488.o(.rodata.83DF09C);
+ src/rock.o(.rodata);
src/ghost.o(.rodata);
src/dragon.o(.rodata);
src/dark.o(.rodata);
diff --git a/src/ghost.c b/src/ghost.c
index 1fc044a77..fbf452af6 100644
--- a/src/ghost.c
+++ b/src/ghost.c
@@ -942,9 +942,9 @@ void sub_80B63B4(u8 taskId)
startX = 40;
else
startX = 200;
- gBattle_WIN0H = (startX << 8) | startX;
+ gBattle_WIN0H = WIN_RANGE(startX, startX);
startY = 40;
- gBattle_WIN0V = (startY << 8) | startY;
+ gBattle_WIN0V = WIN_RANGE(startY, startY);
leftDistance = startX;
rightDistance = 240 - startX;
topDistance = startY;
@@ -988,8 +988,8 @@ static void sub_80B6468(u8 taskId)
BeginNormalPaletteFade(selectedPalettes, 0, 16, 16, RGB(0, 0, 0));
gTasks[taskId].func = sub_80B65F0;
}
- gBattle_WIN0H = (left << 8) | right;
- gBattle_WIN0V = (top << 8) | bottom;
+ gBattle_WIN0H = WIN_RANGE(left, right);
+ gBattle_WIN0V = WIN_RANGE(top, bottom);
}
static void sub_80B65F0(u8 taskId)
@@ -1079,7 +1079,7 @@ static void sub_80B6728(struct Sprite *sprite)
{
sprite->data[1] = 0;
++sprite->data[2];
- SetGpuReg(REG_OFFSET_BLDALPHA, (16 - sprite->data[2]) | (sprite->data[2] << 8));
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND2(16 - sprite->data[2], sprite->data[2]));
if (sprite->data[2] == 16)
{
sprite->invisible = TRUE;
diff --git a/src/rock.c b/src/rock.c
new file mode 100644
index 000000000..cc8da4034
--- /dev/null
+++ b/src/rock.c
@@ -0,0 +1,833 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "palette.h"
+#include "sound.h"
+#include "task.h"
+#include "trig.h"
+#include "constants/songs.h"
+
+extern const union AnimCmd *const gUnknown_83E5958[];
+extern const union AnimCmd *const gUnknown_83E5D48[];
+
+static void sub_80B4634(struct Sprite *sprite);
+static void sub_80B46F8(struct Sprite *sprite);
+static void AnimDirtParticleAcrossScreen(struct Sprite *sprite);
+static void AnimRaiseSprite(struct Sprite *sprite);
+static void sub_80B4D00(u8 taskId);
+static void sub_80B4F78(struct Sprite *sprite);
+static void sub_80B4FE4(struct Sprite *sprite);
+static void sub_80B5074(struct Sprite *sprite);
+static void sub_80B50A0(struct Sprite *sprite);
+static void sub_80B477C(struct Sprite *sprite);
+static void sub_80B46B4(struct Sprite *sprite);
+static void sub_80B47C4(struct Sprite *sprite);
+static void sub_80B490C(u8 taskId);
+static void sub_80B4E70(struct Task *task);
+static u8 sub_80B4FB8(void);
+static void sub_80B5024(struct Sprite *sprite);
+static void sub_80B50F8(struct Sprite *sprite);
+
+static const union AnimCmd gUnknown_83E7390[] =
+{
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_83E7398[] =
+{
+ ANIMCMD_FRAME(48, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_83E73A0[] =
+{
+ ANIMCMD_FRAME(64, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gUnknown_83E73A8[] =
+{
+ gUnknown_83E7390,
+ gUnknown_83E7398,
+ gUnknown_83E73A0,
+};
+
+const struct SpriteTemplate gUnknown_83E73B4 =
+{
+ .tileTag = ANIM_TAG_ROCKS,
+ .paletteTag = ANIM_TAG_ROCKS,
+ .oam = &gOamData_83AC9D8,
+ .anims = gUnknown_83E73A8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80B4634,
+};
+
+const struct SpriteTemplate gUnknown_83E73CC =
+{
+ .tileTag = ANIM_TAG_ROCKS,
+ .paletteTag = ANIM_TAG_ROCKS,
+ .oam = &gOamData_83AC9D8,
+ .anims = gUnknown_83E73A8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80B46F8,
+};
+
+const struct SpriteTemplate gUnknown_83E73E4 =
+{
+ .tileTag = ANIM_TAG_MUD_SAND,
+ .paletteTag = ANIM_TAG_MUD_SAND,
+ .oam = &gOamData_83AC9C8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80B477C,
+};
+
+static const union AffineAnimCmd gUnknown_83E73FC[] =
+{
+ AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0),
+ AFFINEANIMCMD_FRAME(0x2, 0xFFFD, 0, 5),
+ AFFINEANIMCMD_FRAME(0xFFFE, 0x3, 0, 5),
+ AFFINEANIMCMD_JUMP(1),
+};
+
+static const union AffineAnimCmd *const gUnknown_83E741C[] =
+{
+ gUnknown_83E73FC,
+};
+
+const struct SpriteTemplate gUnknown_83E7420 =
+{
+ .tileTag = ANIM_TAG_WATER_ORB,
+ .paletteTag = ANIM_TAG_WATER_ORB,
+ .oam = &gOamData_83ACB50,
+ .anims = gUnknown_83E5958,
+ .images = NULL,
+ .affineAnims = gUnknown_83E741C,
+ .callback = sub_80B477C,
+};
+
+const struct SpriteTemplate gUnknown_83E7438 =
+{
+ .tileTag = ANIM_TAG_SMALL_EMBER,
+ .paletteTag = ANIM_TAG_SMALL_EMBER,
+ .oam = &gOamData_83AC9D8,
+ .anims = gUnknown_83E5D48,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80B477C,
+};
+
+const struct SpriteTemplate gUnknown_83E7450 =
+{
+ .tileTag = ANIM_TAG_FLYING_DIRT,
+ .paletteTag = ANIM_TAG_FLYING_DIRT,
+ .oam = &gOamData_83AC9F8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimDirtParticleAcrossScreen,
+};
+
+static const struct Subsprite gUnknown_83E7468[] =
+{
+ {
+ .x = -16,
+ .y = 0,
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = 2,
+ .tileOffset = 0,
+ .priority = 1,
+ },
+ {
+ .x = 16,
+ .y = 0,
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = 2,
+ .tileOffset = 8,
+ .priority = 1,
+ },
+};
+
+static const struct SubspriteTable gUnknown_83E7470[] =
+{
+ { ARRAY_COUNT(gUnknown_83E7468), gUnknown_83E7468 },
+};
+
+static const union AnimCmd gUnknown_83E7478[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_83E7480[] =
+{
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_83E7488[] =
+{
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_83E7490[] =
+{
+ ANIMCMD_FRAME(48, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_83E7498[] =
+{
+ ANIMCMD_FRAME(64, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_83E74A0[] =
+{
+ ANIMCMD_FRAME(80, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gUnknown_83E74A8[] =
+{
+ gUnknown_83E7478,
+ gUnknown_83E7480,
+};
+
+static const union AnimCmd *const gUnknown_83E74B0[] =
+{
+ gUnknown_83E7488,
+ gUnknown_83E7490,
+};
+
+static const union AnimCmd *const gUnknown_83E74B8[] =
+{
+ gUnknown_83E7498,
+ gUnknown_83E74A0,
+};
+
+const struct SpriteTemplate gUnknown_83E74C0 =
+{
+ .tileTag = ANIM_TAG_ROCKS,
+ .paletteTag = ANIM_TAG_ROCKS,
+ .oam = &gOamData_83AC9D8,
+ .anims = gUnknown_83E74A8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimRaiseSprite,
+};
+
+const struct SpriteTemplate gUnknown_83E74D8 =
+{
+ .tileTag = ANIM_TAG_MUD_SAND,
+ .paletteTag = ANIM_TAG_MUD_SAND,
+ .oam = &gOamData_83AC9C8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80B4F78,
+};
+
+const struct SpriteTemplate gUnknown_83E74F0 =
+{
+ .tileTag = ANIM_TAG_ROCKS,
+ .paletteTag = ANIM_TAG_ROCKS,
+ .oam = &gOamData_83AC9D8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80B4F78,
+};
+
+const struct SpriteTemplate gUnknown_83E7508 =
+{
+ .tileTag = ANIM_TAG_ROCKS,
+ .paletteTag = ANIM_TAG_ROCKS,
+ .oam = &gOamData_83AC9D8,
+ .anims = gUnknown_83E74A8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80B4FE4,
+};
+
+static const union AffineAnimCmd gUnknown_83E7520[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -5, 5),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd gUnknown_83E7530[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 5, 5),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const gUnknown_83E7540[] =
+{
+ gUnknown_83E7520,
+ gUnknown_83E7530,
+};
+
+const struct SpriteTemplate gUnknown_83E7548 =
+{
+ .tileTag = ANIM_TAG_ROCKS,
+ .paletteTag = ANIM_TAG_ROCKS,
+ .oam = &gOamData_83ACA38,
+ .anims = gUnknown_83E74A8,
+ .images = NULL,
+ .affineAnims = gUnknown_83E7540,
+ .callback = sub_80B5074,
+};
+
+const struct SpriteTemplate gUnknown_83E7560 =
+{
+ .tileTag = ANIM_TAG_ROCKS,
+ .paletteTag = ANIM_TAG_ROCKS,
+ .oam = &gOamData_83ACA38,
+ .anims = gUnknown_83E74A8,
+ .images = NULL,
+ .affineAnims = gUnknown_83E7540,
+ .callback = sub_80B50A0,
+};
+
+const struct SpriteTemplate gUnknown_83E7578 =
+{
+ .tileTag = ANIM_TAG_ROCKS,
+ .paletteTag = ANIM_TAG_ROCKS,
+ .oam = &gOamData_83AC9D8,
+ .anims = gUnknown_83E74B8,
+ .images = NULL,
+ .affineAnims = gUnknown_83E7540,
+ .callback = AnimMoveTwisterParticle,
+};
+
+const struct SpriteTemplate gUnknown_83E7590 =
+{
+ .tileTag = ANIM_TAG_ROCKS,
+ .paletteTag = ANIM_TAG_ROCKS,
+ .oam = &gOamData_83ACA38,
+ .anims = gUnknown_83E74B0,
+ .images = NULL,
+ .affineAnims = gUnknown_83E7540,
+ .callback = sub_8077350,
+};
+
+static void sub_80B4634(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[3] != 0)
+ SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += 14;
+ StartSpriteAnim(sprite, gBattleAnimArgs[1]);
+ AnimateSprite(sprite);
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 4;
+ sprite->data[3] = 16;
+ sprite->data[4] = -70;
+ sprite->data[5] = gBattleAnimArgs[2];
+ StoreSpriteCallbackInData6(sprite, sub_80B46B4);
+ sprite->callback = TranslateSpriteInEllipseOverDuration;
+ sprite->callback(sprite);
+}
+
+static void sub_80B46B4(struct Sprite *sprite)
+{
+ sprite->pos1.x += sprite->data[5];
+ sprite->data[0] = 192;
+ sprite->data[1] = sprite->data[5];
+ sprite->data[2] = 4;
+ sprite->data[3] = 32;
+ sprite->data[4] = -24;
+ StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
+ sprite->callback = TranslateSpriteInEllipseOverDuration;
+ sprite->callback(sprite);
+}
+
+static void sub_80B46F8(struct Sprite *sprite)
+{
+ StartSpriteAnim(sprite, gBattleAnimArgs[5]);
+ AnimateSprite(sprite);
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ else
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[3];
+ InitSpriteDataForLinearTranslation(sprite);
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->callback = TranslateSpriteLinearFixedPoint;
+ StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
+}
+
+static void sub_80B477C(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[6] == 0)
+ InitSpritePosToAnimAttacker(sprite, 0);
+ else
+ InitSpritePosToAnimTarget(sprite, FALSE);
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[4];
+ sprite->data[3] = gBattleAnimArgs[5];
+ sprite->callback = sub_80B47C4;
+}
+
+static void sub_80B47C4(struct Sprite *sprite)
+{
+ sprite->data[4] += sprite->data[1];
+ sprite->pos2.y = -(sprite->data[4] >> 8);
+ sprite->pos2.x = Sin(sprite->data[5], sprite->data[3]);
+ sprite->data[5] = (sprite->data[5] + sprite->data[2]) & 0xFF;
+ if (--sprite->data[0] == -1)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimTask_LoadSandstormBackground(u8 taskId)
+{
+ s32 var0;
+ struct BattleAnimBgData animBg;
+
+ var0 = 0;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
+ SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
+ sub_80752A0(&animBg);
+ AnimLoadCompressedBgTilemap(animBg.bgId, gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap);
+ AnimLoadCompressedBgGfx(animBg.bgId, gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet, animBg.tilesOffset);
+ LoadCompressedPalette(gBattleAnimSpritePal_FlyingDirt, animBg.paletteId * 16, 32);
+ if (IsContest())
+ sub_80730C0(animBg.paletteId, animBg.bgTilemap, 0, 0);
+ if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ var0 = 1;
+ gTasks[taskId].data[0] = var0;
+ gTasks[taskId].func = sub_80B490C;
+}
+
+static void sub_80B490C(u8 taskId)
+{
+ struct BattleAnimBgData animBg;
+
+ if (gTasks[taskId].data[0] == 0)
+ gBattle_BG1_X += -6;
+ else
+ gBattle_BG1_X += 6;
+ gBattle_BG1_Y += -1;
+ switch (gTasks[taskId].data[12])
+ {
+ case 0:
+ if (++gTasks[taskId].data[10] == 4)
+ {
+ gTasks[taskId].data[10] = 0;
+ ++gTasks[taskId].data[11];
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
+ if (gTasks[taskId].data[11] == 7)
+ {
+ ++gTasks[taskId].data[12];
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 1:
+ if (++gTasks[taskId].data[11] == 101)
+ {
+ gTasks[taskId].data[11] = 7;
+ ++gTasks[taskId].data[12];
+ }
+ break;
+ case 2:
+ if (++gTasks[taskId].data[10] == 4)
+ {
+ gTasks[taskId].data[10] = 0;
+ --gTasks[taskId].data[11];
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
+ if (gTasks[taskId].data[11] == 0)
+ {
+ ++gTasks[taskId].data[12];
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 3:
+ sub_80752A0(&animBg);
+ sub_8075358(animBg.bgId);
+ ++gTasks[taskId].data[12];
+ break;
+ case 4:
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// Animates the sprites that fly diagonally across the screen
+// in Sandstorm and Heat Wave.
+// arg 0: initial y pixel offset
+// arg 1: projectile speed
+// arg 2: y pixel drop
+// arg 3: ??? unknown (possibly a color bit)
+static void AnimDirtParticleAcrossScreen(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ if (gBattleAnimArgs[3] != 0 && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ sprite->pos1.x = 304;
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ sprite->data[5] = 1;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
+ }
+ else
+ {
+ sprite->pos1.x = -64;
+ }
+ sprite->pos1.y = gBattleAnimArgs[0];
+ SetSubspriteTables(sprite, gUnknown_83E7470);
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[2] = gBattleAnimArgs[2];
+ ++sprite->data[0];
+ }
+ else
+ {
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ sprite->pos2.x += (sprite->data[3] >> 8);
+ sprite->pos2.y += (sprite->data[4] >> 8);
+ sprite->data[3] &= 0xFF;
+ sprite->data[4] &= 0xFF;
+ if (sprite->data[5] == 0)
+ {
+ if (sprite->pos1.x + sprite->pos2.x > 272)
+ {
+ sprite->callback = DestroyAnimSprite;
+ }
+ }
+ else if (sprite->pos1.x + sprite->pos2.x < -32)
+ {
+ sprite->callback = DestroyAnimSprite;
+ }
+ }
+}
+
+// Animates the rising rocks in Ancient Power.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: terminal y offset
+// arg 3: duration
+// arg 4: sprite size [1,5]
+static void AnimRaiseSprite(struct Sprite *sprite)
+{
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+ InitSpritePosToAnimAttacker(sprite, 0);
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[2];
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void sub_80B4BD0(u8 taskId)
+{
+ u16 var0, var1, var2, var3;
+ u8 var4;
+ s32 var5;
+ s16 pan1, pan2;
+ struct Task *task;
+
+ task = &gTasks[taskId];
+ var0 = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
+ var1 = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 24;
+ var2 = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
+ var3 = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + 24;
+ if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget)
+ var3 = var1;
+ var4 = sub_80B4FB8();
+ if (var4 == 1)
+ task->data[8] = 32;
+ else
+ task->data[8] = 48 - (var4 * 8);
+ task->data[0] = 0;
+ task->data[11] = 0;
+ task->data[9] = 0;
+ task->data[12] = 1;
+ var5 = task->data[8];
+ if (var5 < 0)
+ var5 += 7;
+ task->data[10] = (var5 >> 3) - 1;
+ task->data[2] = var0 * 8;
+ task->data[3] = var1 * 8;
+ task->data[4] = ((var2 - var0) * 8) / task->data[8];
+ task->data[5] = ((var3 - var1) * 8) / task->data[8];
+ task->data[6] = 0;
+ task->data[7] = 0;
+ pan1 = BattleAnimAdjustPanning(PAN_SIDE_PLAYER);
+ pan2 = BattleAnimAdjustPanning(PAN_SIDE_OPPONENT);
+ task->data[13] = pan1;
+ task->data[14] = (pan2 - pan1) / task->data[8];
+ task->data[1] = var4;
+ task->data[15] = GetAnimBattlerSpriteId(0);
+ task->func = sub_80B4D00;
+}
+
+static void sub_80B4D00(u8 taskId)
+{
+ struct Task *task;
+
+ task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[6] -= task->data[4];
+ task->data[7] -= task->data[5];
+ gSprites[task->data[15]].pos2.x = task->data[6] >> 3;
+ gSprites[task->data[15]].pos2.y = task->data[7] >> 3;
+ if (++task->data[9] == 10)
+ {
+ task->data[11] = 20;
+ ++task->data[0];
+ }
+ PlaySE12WithPanning(SE_W029, task->data[13]);
+ break;
+ case 1:
+ if (--task->data[11] == 0)
+ ++task->data[0];
+ break;
+ case 2:
+ if (--task->data[9] != 0)
+ {
+ task->data[6] += task->data[4];
+ task->data[7] += task->data[5];
+ }
+ else
+ {
+ task->data[6] = 0;
+ task->data[7] = 0;
+ ++task->data[0];
+ }
+ gSprites[task->data[15]].pos2.x = task->data[6] >> 3;
+ gSprites[task->data[15]].pos2.y = task->data[7] >> 3;
+ break;
+ case 3:
+ task->data[2] += task->data[4];
+ task->data[3] += task->data[5];
+ if (++task->data[9] >= task->data[10])
+ {
+ task->data[9] = 0;
+ sub_80B4E70(task);
+ task->data[13] += task->data[14];
+ PlaySE12WithPanning(SE_W091, task->data[13]);
+ }
+ if (--task->data[8] == 0)
+ {
+ ++task->data[0];
+ }
+ break;
+ case 4:
+ if (task->data[11] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+static void sub_80B4E70(struct Task *task)
+{
+ const struct SpriteTemplate *spriteTemplate;
+ s32 var0;
+ u16 x, y;
+ u8 spriteId;
+
+ switch (task->data[1])
+ {
+ case 1:
+ spriteTemplate = &gUnknown_83E74D8;
+ var0 = 0;
+ break;
+ case 2:
+ case 3:
+ spriteTemplate = &gUnknown_83E74F0;
+ var0 = 80;
+ break;
+ case 4:
+ spriteTemplate = &gUnknown_83E74F0;
+ var0 = 64;
+ break;
+ case 5:
+ spriteTemplate = &gUnknown_83E74F0;
+ var0 = 48;
+ break;
+ default:
+ return;
+ }
+ x = task->data[2] >> 3;
+ y = task->data[3] >> 3;
+ x += (task->data[12] * 4);
+ spriteId = CreateSprite(spriteTemplate, x, y, 35);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[0] = 18;
+ gSprites[spriteId].data[2] = ((task->data[12] * 20) + x) + (task->data[1] * 3);
+ gSprites[spriteId].data[4] = y;
+ gSprites[spriteId].data[5] = -16 - (task->data[1] * 2);
+ gSprites[spriteId].oam.tileNum += var0;
+ InitAnimArcTranslation(&gSprites[spriteId]);
+ ++task->data[11];
+ }
+ task->data[12] *= -1;
+}
+
+static void sub_80B4F78(struct Sprite *sprite)
+{
+ if (TranslateAnimHorizontalArc(sprite))
+ {
+ u8 taskId = FindTaskIdByFunc(sub_80B4D00);
+
+ if (taskId != TASK_NONE)
+ --gTasks[taskId].data[11];
+ DestroySprite(sprite);
+ }
+}
+
+static u8 sub_80B4FB8(void)
+{
+ u8 retVal = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer;
+ u8 var0 = retVal - 1;
+
+ if (var0 > 4)
+ retVal = 1;
+ return retVal;
+}
+
+static void sub_80B4FE4(struct Sprite *sprite)
+{
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+ sprite->pos2.x = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->data[3] -= gBattleAnimArgs[2];
+ sprite->data[0] = 3;
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->callback = sub_80B5024;
+ sprite->invisible = TRUE;
+}
+
+static void sub_80B5024(struct Sprite *sprite)
+{
+ sprite->invisible = FALSE;
+ if (sprite->data[3] != 0)
+ {
+ sprite->pos2.y = sprite->data[2] + sprite->data[3];
+ sprite->data[3] += sprite->data[0];
+ ++sprite->data[0];
+ if (sprite->data[3] > 0)
+ {
+ sprite->data[3] = 0;
+ }
+ }
+ else if (--sprite->data[1] == 0)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+static void sub_80B5074(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
+ StartSpriteAffineAnim(sprite, 1);
+ TranslateAnimSpriteToTargetMonLocation(sprite);
+}
+
+static void sub_80B50A0(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[1] = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->data[5] = gBattleAnimArgs[2];
+ StartSpriteAnim(sprite, gBattleAnimArgs[3]);
+ sprite->callback = sub_80B50F8;
+}
+
+static void sub_80B50F8(struct Sprite *sprite)
+{
+ sprite->data[0] += 8;
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ sprite->pos2.x += sprite->data[3] / 40;
+ sprite->pos2.y -= Sin(sprite->data[0], sprite->data[5]);
+ if (sprite->data[0] > 140)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimTask_GetSeismicTossDamageLevel(u8 taskId)
+{
+ if (gAnimMoveDmg < 33)
+ gBattleAnimArgs[7] = 0;
+ if ((u32)gAnimMoveDmg - 33 < 33)
+ gBattleAnimArgs[7] = 1;
+ if (gAnimMoveDmg > 65)
+ gBattleAnimArgs[7] = 2;
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80B5188(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ sub_8075458(0);
+ gTasks[taskId].data[1] = 200;
+ }
+ gBattle_BG3_Y += gTasks[taskId].data[1] / 10;
+ gTasks[taskId].data[1] -= 3;
+ if (gTasks[taskId].data[0] == 120)
+ {
+ sub_8075458(1);
+ DestroyAnimVisualTask(taskId);
+ }
+ ++gTasks[taskId].data[0];
+}
+
+void sub_80B51EC(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ sub_8075458(0);
+ ++gTasks[taskId].data[0];
+ gTasks[taskId].data[2] = gBattle_BG3_Y;
+ }
+ gTasks[taskId].data[1] += 80;
+ gTasks[taskId].data[1] &= 0xFF;
+ gBattle_BG3_Y = gTasks[taskId].data[2] + Cos(4, gTasks[taskId].data[1]);
+ if (gBattleAnimArgs[7] == 0xFFF)
+ {
+ gBattle_BG3_Y = 0;
+ sub_8075458(1);
+ DestroyAnimVisualTask(taskId);
+ }
+}