summaryrefslogtreecommitdiff
path: root/engine/battle/animations.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/battle/animations.asm')
-rwxr-xr-xengine/battle/animations.asm2908
1 files changed, 2908 insertions, 0 deletions
diff --git a/engine/battle/animations.asm b/engine/battle/animations.asm
new file mode 100755
index 00000000..aaa65bbb
--- /dev/null
+++ b/engine/battle/animations.asm
@@ -0,0 +1,2908 @@
+; Draws a "frame block". Frame blocks are blocks of tiles that are put
+; together to form frames in battle animations.
+DrawFrameBlock: ; 78000 (1e:4000)
+ ld l,c
+ ld h,b
+ ld a,[hli]
+ ld [W_NUMFBTILES],a
+ ld a,[W_FBDESTADDR + 1]
+ ld e,a
+ ld a,[W_FBDESTADDR]
+ ld d,a
+ xor a
+ ld [W_FBTILECOUNTER],a ; loop counter
+.loop
+ ld a,[W_FBTILECOUNTER]
+ inc a
+ ld [W_FBTILECOUNTER],a
+ ld a,[W_SUBANIMTRANSFORM]
+ dec a
+ jr z,.flipHorizontalAndVertical ; 1
+ dec a
+ jp z,.flipHorizontalTranslateDown ; 2
+ dec a
+ jr z,.flipBaseCoords ; 3
+.noTransformation
+ ld a,[W_BASECOORDY]
+ add [hl]
+ ld [de],a ; store Y
+ inc hl
+ inc de
+ ld a,[W_BASECOORDX]
+ jr .finishCopying
+.flipBaseCoords
+ ld a,[W_BASECOORDY]
+ ld b,a
+ ld a,136
+ sub b ; flip Y base coordinate
+ add [hl] ; Y offset
+ ld [de],a ; store Y
+ inc hl
+ inc de
+ ld a,[W_BASECOORDX]
+ ld b,a
+ ld a,168
+ sub b ; flip X base coordinate
+.finishCopying ; finish copying values to OAM (when [W_SUBANIMTRANSFORM] not 1 or 2)
+ add [hl] ; X offset
+ ld [de],a ; store X
+ inc hl
+ inc de
+ ld a,[hli]
+ add a,$31 ; base tile ID for battle animations
+ ld [de],a ; store tile ID
+ inc de
+ ld a,[hli]
+ ld [de],a ; store flags
+ inc de
+ jp .nextTile
+.flipHorizontalAndVertical
+ ld a,[W_BASECOORDY]
+ add [hl] ; Y offset
+ ld b,a
+ ld a,136
+ sub b ; flip Y coordinate
+ ld [de],a ; store Y
+ inc hl
+ inc de
+ ld a,[W_BASECOORDX]
+ add [hl] ; X offset
+ ld b,a
+ ld a,168
+ sub b ; flip X coordinate
+ ld [de],a ; store X
+ inc hl
+ inc de
+ ld a,[hli]
+ add a,$31 ; base tile ID for battle animations
+ ld [de],a ; store tile ID
+ inc de
+; toggle horizontal and vertical flip
+ ld a,[hli] ; flags
+ and a
+ ld b,OAM_VFLIP | OAM_HFLIP
+ jr z,.storeFlags1
+ cp a,OAM_HFLIP
+ ld b,OAM_VFLIP
+ jr z,.storeFlags1
+ cp a,OAM_VFLIP
+ ld b,OAM_HFLIP
+ jr z,.storeFlags1
+ ld b,0
+.storeFlags1
+ ld a,b
+ ld [de],a
+ inc de
+ jp .nextTile
+.flipHorizontalTranslateDown
+ ld a,[W_BASECOORDY]
+ add [hl]
+ add a,40 ; translate Y coordinate downwards
+ ld [de],a ; store Y
+ inc hl
+ inc de
+ ld a,[W_BASECOORDX]
+ add [hl]
+ ld b,a
+ ld a,168
+ sub b ; flip X coordinate
+ ld [de],a ; store X
+ inc hl
+ inc de
+ ld a,[hli]
+ add a,$31 ; base tile ID for battle animations
+ ld [de],a ; store tile ID
+ inc de
+ ld a,[hli]
+ bit 5,a ; is horizontal flip enabled?
+ jr nz,.disableHorizontalFlip
+.enableHorizontalFlip
+ set 5,a
+ jr .storeFlags2
+.disableHorizontalFlip
+ res 5,a
+.storeFlags2
+ ld [de],a
+ inc de
+.nextTile
+ ld a,[W_FBTILECOUNTER]
+ ld c,a
+ ld a,[W_NUMFBTILES]
+ cp c
+ jp nz,.loop ; go back up if there are more tiles to draw
+.afterDrawingTiles
+ ld a,[W_FBMODE]
+ cp a,2
+ jr z,.advanceFrameBlockDestAddr; skip delay and don't clean OAM buffer
+ ld a,[W_SUBANIMFRAMEDELAY]
+ ld c,a
+ call DelayFrames
+ ld a,[W_FBMODE]
+ cp a,3
+ jr z,.advanceFrameBlockDestAddr ; skip cleaning OAM buffer
+ cp a,4
+ jr z,.done ; skip cleaning OAM buffer and don't advance the frame block destination address
+ ld a,[W_ANIMATIONID]
+ cp a,GROWL
+ jr z,.resetFrameBlockDestAddr
+ call AnimationCleanOAM
+.resetFrameBlockDestAddr
+ ld hl,wOAMBuffer ; OAM buffer
+ ld a,l
+ ld [W_FBDESTADDR + 1],a
+ ld a,h
+ ld [W_FBDESTADDR],a ; set destination address to beginning of OAM buffer
+ ret
+.advanceFrameBlockDestAddr
+ ld a,e
+ ld [W_FBDESTADDR + 1],a
+ ld a,d
+ ld [W_FBDESTADDR],a
+.done
+ ret
+
+PlayAnimation: ; 780f1 (1e:40f1)
+ xor a
+ ld [$FF8B],a
+ ld [W_SUBANIMTRANSFORM],a
+ ld a,[W_ANIMATIONID] ; get animation number
+ dec a
+ ld l,a
+ ld h,0
+ add hl,hl
+ ld de,AttackAnimationPointers ; $607d ; animation command stream pointers
+ add hl,de
+ ld a,[hli]
+ ld h,[hl]
+ ld l,a
+.animationLoop
+ ld a,[hli]
+ cp a,$FF
+ jr z,.AnimationOver
+ cp a,$C0 ; is this subanimation or a special effect?
+ jr c,.playSubanimation
+.doSpecialEffect
+ ld c,a
+ ld de,SpecialEffectPointers
+.searchSpecialEffectTableLoop
+ ld a,[de]
+ cp c
+ jr z,.foundMatch
+ inc de
+ inc de
+ inc de
+ jr .searchSpecialEffectTableLoop
+.foundMatch
+ ld a,[hli]
+ cp a,$FF ; is there a sound to play?
+ jr z,.skipPlayingSound
+ ld [wAnimSoundID],a ; store sound
+ push hl
+ push de
+ call Func_7986f
+ call PlaySound
+ pop de
+ pop hl
+.skipPlayingSound
+ push hl
+ inc de
+ ld a,[de]
+ ld l,a
+ inc de
+ ld a,[de]
+ ld h,a
+ ld de,.nextAnimationCommand
+ push de
+ jp [hl] ; jump to special effect function
+.playSubanimation
+ ld c,a
+ and a,%00111111
+ ld [W_SUBANIMFRAMEDELAY],a
+ xor a
+ sla c
+ rla
+ sla c
+ rla
+ ld [$D09F],a ; tile select
+ ld a,[hli] ; sound
+ ld [wAnimSoundID],a ; store sound
+ ld a,[hli] ; subanimation ID
+ ld c,l
+ ld b,h
+ ld l,a
+ ld h,0
+ add hl,hl
+ ld de,SubanimationPointers
+ add hl,de
+ ld a,l
+ ld [W_SUBANIMADDRPTR],a
+ ld a,h
+ ld [W_SUBANIMADDRPTR + 1],a
+ ld l,c
+ ld h,b
+ push hl
+ ld a,[rOBP0]
+ push af
+ ld a,[$CC79]
+ ld [rOBP0],a
+ call LoadAnimationTileset
+ call LoadSubanimation
+ call PlaySubanimation
+ pop af
+ ld [rOBP0],a
+.nextAnimationCommand
+ pop hl
+ jr .animationLoop
+.AnimationOver ; 417B
+ ret
+
+LoadSubanimation: ; 7817c (1e:417c)
+ ld a,[W_SUBANIMADDRPTR + 1]
+ ld h,a
+ ld a,[W_SUBANIMADDRPTR]
+ ld l,a
+ ld a,[hli]
+ ld e,a
+ ld a,[hl]
+ ld d,a ; de = address of subanimation
+ ld a,[de]
+ ld b,a
+ and a,31
+ ld [W_SUBANIMCOUNTER],a ; number of frame blocks
+ ld a,b
+ and a,%11100000
+ cp a,5 << 5 ; is subanimation type 5?
+ jr nz,.isNotType5
+.isType5
+ call GetSubanimationTransform2
+ jr .saveTransformation
+.isNotType5
+ call GetSubanimationTransform1
+.saveTransformation
+; place the upper 3 bits of a into bits 0-2 of a before storing
+ srl a
+ swap a
+ ld [W_SUBANIMTRANSFORM],a
+ cp a,4 ; is the animation reversed?
+ ld hl,0
+ jr nz,.storeSubentryAddr
+; if the animation is reversed, then place the initial subentry address at the end of the list of subentries
+ ld a,[W_SUBANIMCOUNTER]
+ dec a
+ ld bc,3
+.loop
+ add hl,bc
+ dec a
+ jr nz,.loop
+.storeSubentryAddr
+ inc de
+ add hl,de
+ ld a,l
+ ld [W_SUBANIMSUBENTRYADDR],a
+ ld a,h
+ ld [W_SUBANIMSUBENTRYADDR + 1],a
+ ret
+
+; called if the subanimation type is not 5
+; sets the transform to 0 (i.e. no transform) if it's the player's turn
+; sets the transform to the subanimation type if it's the enemy's turn
+GetSubanimationTransform1: ; 781c2 (1e:41c2)
+ ld b,a
+ ld a,[H_WHOSETURN]
+ and a
+ ld a,b
+ ret nz
+ xor a
+ ret
+
+; called if the subanimation type is 5
+; sets the transform to 2 (i.e. horizontal and vertical flip) if it's the player's turn
+; sets the transform to 0 (i.e. no transform) if it's the enemy's turn
+GetSubanimationTransform2: ; 781ca (1e:41ca)
+ ld a,[H_WHOSETURN]
+ and a
+ ld a,2 << 5
+ ret z
+ xor a
+ ret
+
+; loads tile patterns for battle animations
+LoadAnimationTileset: ; 781d2 (1e:41d2)
+ ld a,[$D09F] ; tileset select
+ add a
+ add a
+ ld hl,AnimationTilesetPointers
+ ld e,a
+ ld d,0
+ add hl,de
+ ld a,[hli]
+ ld [$D07D],a ; number of tiles
+ ld a,[hli]
+ ld e,a
+ ld a,[hl]
+ ld d,a ; de = address of tileset
+ ld hl,$8310 ; destination address in VRAM
+ ld b, BANK(AnimationTileset1) ; ROM bank
+ ld a,[$D07D]
+ ld c,a ; number of tiles
+ jp CopyVideoData ; load tileset
+
+AnimationTilesetPointers: ; 781f2 (1e:41f2)
+ db 79 ; number of tiles
+ dw AnimationTileset1
+ db $FF
+
+ db 79 ; number of tiles
+ dw AnimationTileset2
+ db $FF
+
+ db 64 ; number of tiles
+ dw AnimationTileset1
+ db $FF
+
+AnimationTileset1: ; 781fe (1e:41fe)
+ INCBIN "gfx/attack_anim_1.2bpp"
+
+AnimationTileset2: ; 786ee (1e:46ee)
+ INCBIN "gfx/attack_anim_2.2bpp"
+
+SlotMachineTiles2: ; 78bde (1e:4bde)
+IF _RED
+ INCBIN "gfx/red/slotmachine2.2bpp"
+ENDC
+IF _BLUE
+ INCBIN "gfx/blue/slotmachine2.2bpp"
+ENDC
+
+MoveAnimation: ; 78d5e (1e:4d5e)
+ push hl
+ push de
+ push bc
+ push af
+ call WaitForSoundToFinish
+ call Func_78e23
+ ld a,[W_ANIMATIONID]
+ and a
+ jr z,.AnimationFinished
+
+ ; if throwing a Poké Ball, skip the regular animation code
+ cp a,TOSS_ANIM
+ jr nz,.MoveAnimation
+ ld de,.AnimationFinished
+ push de
+ jp TossBallAnimation
+
+.MoveAnimation
+ ; check if battle animations are disabled in the options
+ ld a,[$D355]
+ bit 7,a
+ jr nz,.AnimationsDisabled
+ call ShareMoveAnimations
+ call PlayAnimation
+ jr .next4
+.AnimationsDisabled
+ ld c,30
+ call DelayFrames
+.next4
+ call Func_78dbd ; reload pic and flash the pic in and out (to show damage)
+.AnimationFinished
+ call WaitForSoundToFinish
+ xor a
+ ld [$D096],a
+ ld [$D09B],a
+ ld [$D08B],a
+ dec a
+ ld [$CF07],a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+
+ShareMoveAnimations: ; 78da6 (1e:4da6)
+; some moves just reuse animations from status conditions
+ ld a,[H_WHOSETURN]
+ and a
+ ret z
+
+ ; opponent’s turn
+
+ ld a,[W_ANIMATIONID]
+
+ cp a,AMNESIA
+ ld b,CONF_ANIM
+ jr z,.Replace
+
+ cp a,REST
+ ld b,SLP_ANIM
+ ret nz
+
+.Replace
+ ld a,b
+ ld [W_ANIMATIONID],a
+ ret
+
+Func_78dbd: ; 78dbd (1e:4dbd)
+ ld a,[$CC5B]
+ and a
+ ret z
+ dec a
+ add a
+ ld c,a
+ ld b,0
+ ld hl,PointerTable_78dcf
+ add hl,bc
+ ld a,[hli]
+ ld h,[hl]
+ ld l,a
+ jp [hl]
+
+PointerTable_78dcf: ; 78dcf (1e:4dcf)
+ dw Func_78ddb
+ dw Func_78de3
+ dw Func_78deb
+ dw Func_78df0
+ dw Func_78df6
+ dw Func_78dfe
+
+Func_78ddb: ; 78ddb (1e:4ddb)
+ call Func_79e6a
+ ld b, $8
+ jp Func_79209
+
+Func_78de3: ; 78de3 (1e:4de3)
+ call Func_79e6a
+ ld b, $8
+ jp Func_79210
+
+Func_78deb: ; 78deb (1e:4deb)
+ ld bc, $602
+ jr Func_78e01
+
+Func_78df0: ; 78df0 (1e:4df0)
+ call Func_79e6a
+ jp AnimationBlinkEnemyMon
+
+Func_78df6: ; 78df6 (1e:4df6)
+ call Func_79e6a
+ ld b, $2
+ jp Func_79210
+
+Func_78dfe: ; 78dfe (1e:4dfe)
+ ld bc, $302
+
+Func_78e01: ; 78e01 (1e:4e01)
+ push bc
+ push bc
+.asm_78e03
+ ld a, [rWX] ; $ff4b
+ inc a
+ ld [rWX], a ; $ff4b
+ ld c, $2
+ call DelayFrames
+ dec b
+ jr nz, .asm_78e03
+ pop bc
+.asm_78e11
+ ld a, [rWX] ; $ff4b
+ dec a
+ ld [rWX], a ; $ff4b
+ ld c, $2
+ call DelayFrames
+ dec b
+ jr nz, .asm_78e11
+ pop bc
+ dec c
+ jr nz, Func_78e01
+ ret
+
+Func_78e23: ; 78e23 (1e:4e23)
+ ld a, [$cf1b]
+ and a
+ ld a, $e4
+ jr z, .asm_78e47
+ ld a, $f0
+ ld [$cc79], a
+ ld b, $e4
+ ld a, [W_ANIMATIONID] ; $d07c
+ cp $aa
+ jr c, .asm_78e3f
+ cp $ae
+ jr nc, .asm_78e3f
+ ld b, $f0
+.asm_78e3f
+ ld a, b
+ ld [rOBP0], a ; $ff48
+ ld a, $6c
+ ld [rOBP1], a ; $ff49
+ ret
+.asm_78e47
+ ld a, $e4
+ ld [$cc79], a
+ ld [rOBP0], a ; $ff48
+ ld a, $6c
+ ld [rOBP1], a ; $ff49
+ ret
+
+PlaySubanimation: ; 78e53 (1e:4e53)
+ ld a,[wAnimSoundID]
+ cp a,$FF
+ jr z,.skipPlayingSound
+ call Func_7986f
+ call PlaySound ; play sound effect
+.skipPlayingSound
+ ld hl,wOAMBuffer ; base address of OAM buffer
+ ld a,l
+ ld [W_FBDESTADDR + 1],a
+ ld a,h
+ ld [W_FBDESTADDR],a
+ ld a,[W_SUBANIMSUBENTRYADDR + 1]
+ ld h,a
+ ld a,[W_SUBANIMSUBENTRYADDR]
+ ld l,a
+.loop
+ push hl
+ ld c,[hl] ; frame block ID
+ ld b,0
+ ld hl,FrameBlockPointers
+ add hl,bc
+ add hl,bc
+ ld a,[hli]
+ ld c,a
+ ld a,[hli]
+ ld b,a
+ pop hl
+ inc hl
+ push hl
+ ld e,[hl] ; base coordinate ID
+ ld d,0
+ ld hl,FrameBlockBaseCoords ; $7c85 ; base coordinate table
+ add hl,de
+ add hl,de
+ ld a,[hli]
+ ld [W_BASECOORDY],a
+ ld a,[hl]
+ ld [W_BASECOORDX],a
+ pop hl
+ inc hl
+ ld a,[hl] ; frame block mode
+ ld [W_FBMODE],a
+ call DrawFrameBlock
+ call DoSpecialEffectByAnimationId ; run animation-specific function (if there is one)
+ ld a,[W_SUBANIMCOUNTER]
+ dec a
+ ld [W_SUBANIMCOUNTER],a
+ ret z
+ ld a,[W_SUBANIMSUBENTRYADDR + 1]
+ ld h,a
+ ld a,[W_SUBANIMSUBENTRYADDR]
+ ld l,a
+ ld a,[W_SUBANIMTRANSFORM]
+ cp a,4 ; is the animation reversed?
+ ld bc,3
+ jr nz,.nextSubanimationSubentry
+ ld bc,-3
+.nextSubanimationSubentry
+ add hl,bc
+ ld a,h
+ ld [W_SUBANIMSUBENTRYADDR + 1],a
+ ld a,l
+ ld [W_SUBANIMSUBENTRYADDR],a
+ jp .loop
+
+AnimationCleanOAM: ; 78ec8 (1e:4ec8)
+ push hl
+ push de
+ push bc
+ push af
+ call DelayFrame
+ call CleanLCD_OAM
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+
+; this runs after each frame block is drawn in a subanimation
+; it runs a particular special effect based on the animation ID
+DoSpecialEffectByAnimationId: ; 78ed7 (1e:4ed7)
+ push hl
+ push de
+ push bc
+ ld a,[W_ANIMATIONID]
+ ld hl,AnimationIdSpecialEffects
+ ld de,3
+ call IsInArray
+ jr nc,.done
+ inc hl
+ ld a,[hli]
+ ld h,[hl]
+ ld l,a
+ ld de,.done
+ push de
+ jp [hl]
+.done
+ pop bc
+ pop de
+ pop hl
+ ret
+
+; Format: Animation ID (1 byte), Address (2 bytes)
+AnimationIdSpecialEffects: ; 78ef5 (1e:4ef5)
+ db MEGA_PUNCH
+ dw AnimationFlashScreen
+
+ db GUILLOTINE
+ dw AnimationFlashScreen
+
+ db MEGA_KICK
+ dw AnimationFlashScreen
+
+ db HEADBUTT
+ dw AnimationFlashScreen
+
+ db TAIL_WHIP
+ dw Func_790d0
+
+ db GROWL
+ dw DoGrowlSpecialEffects
+
+ db DISABLE
+ dw AnimationFlashScreen
+
+ db BLIZZARD
+ dw DoBlizzardSpecialEffects
+
+ db BUBBLEBEAM
+ dw AnimationFlashScreen
+
+ db HYPER_BEAM
+ dw FlashScreenEveryFourFrameBlocks
+
+ db THUNDERBOLT
+ dw FlashScreenEveryEightFrameBlocks
+
+ db REFLECT
+ dw AnimationFlashScreen
+
+ db SELFDESTRUCT
+ dw DoExplodeSpecialEffects
+
+ db SPORE
+ dw AnimationFlashScreen
+
+ db EXPLOSION
+ dw DoExplodeSpecialEffects
+
+ db ROCK_SLIDE
+ dw DoRockSlideSpecialEffects
+
+ db $AA
+ dw Func_79041
+
+ db $AB
+ dw Func_7904c
+
+ db $AC
+ dw Func_7907c
+
+ db TOSS_ANIM
+ dw DoBallTossSpecialEffects
+
+ db SHAKE_ANIM
+ dw DoBallShakeSpecialEffects
+
+ db POOF_ANIM
+ dw DoPoofSpecialEffects
+
+ db GREATTOSS_ANIM
+ dw DoBallTossSpecialEffects
+
+ db ULTRATOSS_ANIM
+ dw DoBallTossSpecialEffects
+
+ db $FF ; terminator
+
+DoBallTossSpecialEffects: ; 78f3e (1e:4f3e)
+ ld a,[$CF91]
+ cp a,3 ; is it a Master Ball or Ultra Ball?
+ jr nc,.skipFlashingEffect
+.flashingEffect ; do a flashing effect if it's Master Ball or Ultra Ball
+ ld a,[rOBP0]
+ xor a,%00111100 ; complement colors 1 and 2
+ ld [rOBP0],a
+.skipFlashingEffect
+ ld a,[W_SUBANIMCOUNTER]
+ cp a,11 ; is it the beginning of the subanimation?
+ jr nz,.skipPlayingSound
+; if it is the beginning of the subanimation, play a sound
+ ld a,(SFX_08_41 - SFX_Headers_08) / 3
+ call PlaySound ; play sound
+.skipPlayingSound
+ ld a,[W_ISINBATTLE]
+ cp a,02 ; is it a trainer battle?
+ jr z,.isTrainerBattle
+ ld a,[$d11e]
+ cp a,$10 ; is the enemy pokemon the Ghost Marowak?
+ ret nz
+; if the enemy pokemon is the Ghost Marowak, make it dodge during the last 3 frames
+ ld a,[W_SUBANIMCOUNTER]
+ cp a,3
+ jr z,.moveGhostMarowakLeft
+ cp a,2
+ jr z,.moveGhostMarowakLeft
+ cp a,1
+ ret nz
+.moveGhostMarowakLeft
+ FuncCoord 17,0
+ ld hl,Coord
+ ld de,20
+ ld bc,$0707 ; 7 rows and 7 columns
+.loop
+ push hl
+ push bc
+ call Func_79862 ; move row of tiles left
+ pop bc
+ pop hl
+ add hl,de
+ dec b
+ jr nz,.loop
+ ld a,%00001000
+ ld [$ff10],a ; Channel 1 sweep register
+ ret
+.isTrainerBattle ; if it's a trainer battle, shorten the animation by one frame
+ ld a,[W_SUBANIMCOUNTER]
+ cp a,3
+ ret nz
+ dec a
+ ld [W_SUBANIMCOUNTER],a
+ ret
+
+DoBallShakeSpecialEffects: ; 78f96 (1e:4f96)
+ ld a,[W_SUBANIMCOUNTER]
+ cp a,4 ; is it the beginning of a shake?
+ jr nz,.skipPlayingSound
+; if it is the beginning of a shake, play a sound and wait 2/3 of a second
+ ld a,(SFX_08_3c - SFX_Headers_08) / 3
+ call PlaySound ; play sound
+ ld c,40
+ call DelayFrames
+.skipPlayingSound
+ ld a,[W_SUBANIMCOUNTER]
+ dec a
+ ret nz
+; if it's the end of the ball shaking subanimation, check if more shakes are left and restart the subanimation
+ ld a,[$cd3d] ; number of shakes
+ dec a ; decrement number of shakes
+ ld [$cd3d],a
+ ret z
+; if there are shakes left, restart the subanimation
+ ld a,[W_SUBANIMSUBENTRYADDR]
+ ld l,a
+ ld a,[W_SUBANIMSUBENTRYADDR + 1]
+ ld h,a
+ ld de,-(4 * 3) ; 4 subentries and 3 bytes per subentry
+ add hl,de
+ ld a,l
+ ld [W_SUBANIMSUBENTRYADDR],a
+ ld a,h
+ ld [W_SUBANIMSUBENTRYADDR + 1],a
+ ld a,5 ; number of subentries in the ball shaking subanimation plus one
+ ld [W_SUBANIMCOUNTER],a
+ ret
+
+; plays a sound after the second frame of the poof animation
+DoPoofSpecialEffects: ; 78fce (1e:4fce)
+ ld a,[W_SUBANIMCOUNTER]
+ cp a,5
+ ret nz
+ ld a,(SFX_08_42 - SFX_Headers_08) / 3
+ jp PlaySound
+
+DoRockSlideSpecialEffects: ; 78fd9 (1e:4fd9)
+ ld a,[W_SUBANIMCOUNTER]
+ cp a,12
+ ret nc
+ cp a,8
+ jr nc,.shakeScreen
+ cp a,1
+ jp z,AnimationFlashScreen ; if it's the end of the subanimation, flash the screen
+ ret
+; if the subaninmation counter is between 8 and 11, shake the screen horizontally and vertically
+.shakeScreen
+ ld b,1
+ ld a,$24
+ call Predef ; shake horizontally
+ ld b,1
+ ld a,$21
+ jp Predef ; shake vertically
+
+FlashScreenEveryEightFrameBlocks: ; 78ff7 (1e:4ff7)
+ ld a,[W_SUBANIMCOUNTER]
+ and a,7 ; is the subanimation counter exactly 8?
+ call z,AnimationFlashScreen ; if so, flash the screen
+ ret
+
+; flashes the screen if the subanimation counter is divisible by 4
+FlashScreenEveryFourFrameBlocks: ; 79000 (1e:5000)
+ ld a,[W_SUBANIMCOUNTER]
+ and a,3
+ call z,AnimationFlashScreen
+ ret
+
+; used for Explosion and Selfdestruct
+DoExplodeSpecialEffects: ; 79009 (1e:5009)
+ ld a,[W_SUBANIMCOUNTER]
+ cp a,1 ; is it the end of the subanimation?
+ jr nz,FlashScreenEveryFourFrameBlocks
+; if it's the end of the subanimation, make the attacking pokemon disappear
+ FuncCoord 1, 5 ; $c405
+ ld hl,Coord
+ jp AnimationHideMonPic ; make pokemon disappear
+
+; flashes the screen when subanimation counter is 1 modulo 4
+DoBlizzardSpecialEffects: ; 79016 (1e:5016)
+ ld a,[W_SUBANIMCOUNTER]
+ cp a,13
+ jp z,AnimationFlashScreen
+ cp a,9
+ jp z,AnimationFlashScreen
+ cp a,5
+ jp z,AnimationFlashScreen
+ cp a,1
+ jp z,AnimationFlashScreen
+ ret
+
+; flashes the screen at 3 points in the subanimation
+; XXX is this unused?
+Func_7902e: ; 7902e (1e:502e)
+ ld a,[W_SUBANIMCOUNTER]
+ cp a,14
+ jp z,AnimationFlashScreen
+ cp a,9
+ jp z,AnimationFlashScreen
+ cp a,2
+ jp z,AnimationFlashScreen
+ ret
+
+; function to make the pokemon disappear at the beginning of the animation
+; XXX probably a trade-related animation
+Func_79041: ; 79041 (1e:5041)
+ ld a,[W_SUBANIMCOUNTER]
+ cp a,6
+ ret nz
+ ld a,$2F
+ jp Func_7980c ; make pokemon disappear
+
+; function to make a shaking pokeball jump up at the end of the animation
+; XXX probably a trade-related animation
+Func_7904c: ; 7904c (1e:504c)
+ ld a,[W_SUBANIMCOUNTER]
+ cp a,1
+ ret nz
+; if it's the end of the animation, make the ball jump up
+ ld de,BallMoveDistances1
+.loop
+ ld hl,wOAMBuffer ; OAM buffer
+ ld bc,4
+.innerLoop
+ ld a,[de]
+ cp a,$ff
+ jr z,.done
+ add [hl] ; add to Y value of OAM entry
+ ld [hl],a
+ add hl,bc
+ ld a,l
+ cp a,4 * 4 ; there are 4 entries, each 4 bytes
+ jr nz,.innerLoop
+ inc de
+ push bc
+ call Delay3
+ pop bc
+ jr .loop
+.done
+ call AnimationCleanOAM
+ ld a,(SFX_02_44 - SFX_Headers_02) / 3
+ jp PlaySound ; play sound
+
+BallMoveDistances1: ; 79078 (1e:5078)
+ db -12,-12,-8
+ db $ff ; terminator
+
+; function to make the pokeball jump up
+; XXX probably a trade-related animation
+Func_7907c ; 507C
+ ld de,BallMoveDistances2
+.loop
+ ld hl,wOAMBuffer ; OAM buffer
+ ld bc,4
+.innerLoop
+ ld a,[de]
+ cp a,$ff
+ jp z,ClearScreen
+ add [hl]
+ ld [hl],a
+ add hl,bc
+ ld a,l
+ cp a,4 * 4 ; there are 4 entries, each 4 bytes
+ jr nz,.innerLoop
+ inc de
+ push de
+ ld a,[de]
+ cp a,12
+ jr z,.playSound
+ cp a,$ff
+ jr nz,.skipPlayingSound
+.playSound ; play sound if next move distance is 12 or this is the last one
+ ld a,(SFX_08_58 - SFX_Headers_08) / 3
+ call PlaySound
+.skipPlayingSound
+ push bc
+ ld c,5
+ call DelayFrames
+ pop bc
+ ld a,[$ffae] ; background scroll X
+ sub a,8 ; scroll to the left
+ ld [$ffae],a
+ pop de
+ jr .loop
+
+BallMoveDistances2: ; 790b3 (1e:50b3)
+ db 11,12,-12,-7,7,12,-8,8
+ db $ff ; terminator
+
+; this function copies the current musical note graphic
+; so that there are two musical notes flying towards the defending pokemon
+DoGrowlSpecialEffects: ; 790bc (1e:50bc)
+ ld hl,wOAMBuffer ; OAM buffer
+ ld de,$c310
+ ld bc,$10
+ call CopyData ; copy the musical note graphic
+ ld a,[W_SUBANIMCOUNTER]
+ dec a
+ call z,AnimationCleanOAM ; clean up at the end of the subanimation
+ ret
+
+; this is associated with Tail Whip, but Tail Whip doesn't use any subanimations
+Func_790d0: ; 790d0 (1e:50d0)
+ ld a,1
+ ld [W_SUBANIMCOUNTER],a
+ ld c,20
+ jp DelayFrames
+
+; Format: Special Effect ID (1 byte), Address (2 bytes)
+SpecialEffectPointers: ; 790da (1e:50da)
+ db SE_DARK_SCREEN_FLASH ; $FE
+ dw AnimationFlashScreen
+ db SE_DARK_SCREEN_PALETTE ; $FD
+ dw AnimationDarkScreenPalette
+ db SE_RESET_SCREEN_PALETTE ; $FC
+ dw AnimationResetScreenPalette
+ db SE_SHAKE_SCREEN ; $FB
+ dw AnimationShakeScreen
+ db SE_WATER_DROPLETS_EVERYWHERE ; $FA
+ dw AnimationWaterDropletsEverywhere
+ db SE_DARKEN_MON_PALETTE ; $F9
+ dw AnimationDarkenMonPalette
+ db SE_FLASH_SCREEN_LONG ; $F8
+ dw AnimationFlashScreenLong
+ db SE_SLIDE_MON_UP ; $F7
+ dw AnimationSlideMonUp
+ db SE_SLIDE_MON_DOWN ; $F6
+ dw AnimationSlideMonDown
+ db SE_FLASH_MON_PIC ; $F5
+ dw AnimationFlashMonPic
+ db SE_SLIDE_MON_OUT ; $F4
+ dw AnimationSlideMonOut
+ db SE_BLINK_MON ; $F3
+ dw AnimationBlinkMon
+ db SE_MOVE_MON_HORIZONTALLY ; $F2
+ dw AnimationMoveMonHorizontally
+ db SE_RESET_MON_POSITION ; $F1
+ dw AnimationResetMonPosition
+ db SE_LIGHT_SCREEN_PALETTE ; $F0
+ dw AnimationLightScreenPalette
+ db SE_HIDE_MON_PIC ; $EF
+ dw AnimationHideMonPic
+ db SE_SQUISH_MON_PIC ; $EE
+ dw AnimationSquishMonPic
+ db SE_SHOOT_BALLS_UPWARD ; $ED
+ dw AnimationShootBallsUpward
+ db SE_SHOOT_MANY_BALLS_UPWARD ; $EC
+ dw AnimationShootManyBallsUpward
+ db SE_BOUNCE_UP_AND_DOWN ; $EB
+ dw AnimationBoundUpAndDown
+ db SE_MINIMIZE_MON ; $EA
+ dw AnimationMinimizeMon
+ db SE_SLIDE_MON_DOWN_AND_HIDE ; $E9
+ dw AnimationSlideMonDownAndHide
+ db SE_TRANSFORM_MON ; $E8
+ dw AnimationTransformMon
+ db SE_LEAVES_FALLING ; $E7
+ dw AnimationLeavesFalling
+ db SE_PETALS_FALLING ; $E6
+ dw AnimationPetalsFalling
+ db SE_SLIDE_MON_HALF_LEFT ; $E5
+ dw AnimationSlideMonHalfLeft
+ db SE_SHAKE_ENEMY_HUD ; $E4
+ dw AnimationShakeEnemyHUD
+ db SE_SHAKE_ENEMY_HUD_2 ; unused--same pointer as SE_SHAKE_ENEMY_HUD ($E4)
+ dw AnimationShakeEnemyHUD
+ db SE_SPIRAL_BALLS_INWARD ; $E2
+ dw AnimationSpiralBallsInward
+ db SE_DELAY_ANIMATION_10 ; $E1
+ dw AnimationDelay10
+ db SE_FLASH_ENEMY_MON_PIC ; unused--same as SE_FLASH_MON_PIC ($F5), but for the enemy mon
+ dw AnimationFlashEnemyMonPic
+ db SE_HIDE_ENEMY_MON_PIC ; $DF
+ dw AnimationHideEnemyMonPic
+ db SE_BLINK_ENEMY_MON ; $DE
+ dw AnimationBlinkEnemyMon
+ db SE_SHOW_MON_PIC ; $DD
+ dw AnimationShowMonPic
+ db SE_SHOW_ENEMY_MON_PIC ; $DC
+ dw AnimationShowEnemyMonPic
+ db SE_SLIDE_ENEMY_MON_OUT ; $DB
+ dw AnimationSlideEnemyMonOut
+ db SE_SHAKE_BACK_AND_FORTH ; $DA
+ dw AnimationShakeBackAndForth
+ db SE_SUBSTITUTE_MON ; $D9
+ dw AnimationSubstitute
+ db SE_WAVY_SCREEN ; $D8
+ dw AnimationWavyScreen
+ db $FF
+
+AnimationDelay10: ; 79150 (1e:5150)
+ ld c,10
+ jp DelayFrames
+
+; calls a function with the turn flipped from player to enemy or vice versa
+; input - hl - address of function to call
+CallWithTurnFlipped: ; 79155 (1e:5155)
+ ld a,[H_WHOSETURN]
+ push af
+ xor a,1
+ ld [H_WHOSETURN],a
+ ld de,.returnAddress
+ push de
+ jp [hl]
+.returnAddress
+ pop af
+ ld [H_WHOSETURN],a
+ ret
+
+; flashes the screen for an extended period (48 frames)
+AnimationFlashScreenLong: ; 79165 (1e:5165)
+ ld a,3 ; cycle through the palettes 3 times
+ ld [$D08A],a
+ ld a,[$cf1b] ; running on SGB?
+ and a
+ ld hl,FlashScreenLongMonochrome
+ jr z,.loop
+ ld hl,FlashScreenLongSGB
+.loop
+ push hl
+.innerLoop
+ ld a,[hli]
+ cp a,$01 ; is it the end of the palettes?
+ jr z,.endOfPalettes
+ ld [rBGP],a
+ call FlashScreenLongDelay
+ jr .innerLoop
+.endOfPalettes
+ ld a,[$D08A]
+ dec a
+ ld [$D08A],a
+ pop hl
+ jr nz,.loop
+ ret
+
+; BG palettes
+FlashScreenLongMonochrome: ; 7918e (1e:518e)
+ db %11111001 ; 3, 3, 2, 1
+ db %11111110 ; 3, 3, 3, 2
+ db %11111111 ; 3, 3, 3, 3
+ db %11111110 ; 3, 3, 3, 2
+ db %11111001 ; 3, 3, 2, 1
+ db %11100100 ; 3, 2, 1, 0
+ db %10010000 ; 2, 1, 0, 0
+ db %01000000 ; 1, 0, 0, 0
+ db %00000000 ; 0, 0, 0, 0
+ db %01000000 ; 1, 0, 0, 0
+ db %10010000 ; 2, 1, 0, 0
+ db %11100100 ; 3, 2, 1, 0
+ db $01 ; terminator
+
+; BG palettes
+FlashScreenLongSGB: ; 7919b (1e:519b)
+ db %11111000 ; 3, 3, 2, 0
+ db %11111100 ; 3, 3, 3, 0
+ db %11111111 ; 3, 3, 3, 3
+ db %11111100 ; 3, 3, 3, 0
+ db %11111000 ; 3, 3, 2, 0
+ db %11100100 ; 3, 2, 1, 0
+ db %10010000 ; 2, 1, 0, 0
+ db %01000000 ; 1, 0, 0, 0
+ db %00000000 ; 0, 0, 0, 0
+ db %01000000 ; 1, 0, 0, 0
+ db %10010000 ; 2, 1, 0, 0
+ db %11100100 ; 3, 2, 1, 0
+ db $01 ; terminator
+
+; causes a delay of 2 frames for the first cycle
+; causes a delay of 1 frame for the second and third cycles
+FlashScreenLongDelay: ; 791a8 (1e:51a8)
+ ld a,[$D08A]
+ cp a,4 ; never true since [$D08A] starts at 3
+ ld c,4
+ jr z,.delayFrames
+ cp a,3
+ ld c,2
+ jr z,.delayFrames
+ cp a,2 ; nothing is done with this
+ ld c,1
+.delayFrames
+ jp DelayFrames
+
+AnimationFlashScreen: ; 791be (1e:51be)
+ ld a,[rBGP]
+ push af ; save initial palette
+ ld a,%00011011 ; 0, 1, 2, 3 (inverted colors)
+ ld [rBGP],a
+ ld c,2
+ call DelayFrames
+ xor a ; white out background
+ ld [rBGP],a
+ ld c,2
+ call DelayFrames
+ pop af
+ ld [rBGP],a ; restore initial palette
+ ret
+
+AnimationDarkScreenPalette: ; 791d6 (1e:51d6)
+; Changes the screen's palette to a dark palette.
+ ld bc, $6f6f
+ jr Func_791fc
+
+AnimationDarkenMonPalette: ; 791db (1e:51db)
+; Darkens the mon sprite's palette.
+ ld bc, $f9f4
+ jr Func_791fc
+
+Func_791e0: ; 791e0 (1e:51e0)
+ ld bc, $fef8
+ jr Func_791fc
+
+Func_791e5: ; 791e5 (1e:51e5)
+ ld bc, $ffff
+ jr Func_791fc
+
+AnimationResetScreenPalette: ; 791ea (1e:51ea)
+; Restores the screen's palette to the normal palette.
+ ld bc, $e4e4
+ jr Func_791fc
+
+Func_791ef: ; 791ef (1e:51ef)
+ ld bc, $0000
+ jr Func_791fc
+
+AnimationLightScreenPalette: ; 791f4 (1e:51f4)
+; Changes the screen to use a palette with light colors.
+ ld bc, $9090
+ jr Func_791fc
+
+Func_791f9: ; 791f9 (1e:51f9)
+ ld bc, $4040
+
+Func_791fc: ; 791fc (1e:51fc)
+ ld a, [$cf1b]
+ and a
+ ld a, b
+ jr z, .asm_79204
+ ld a, c
+.asm_79204
+ ld [rBGP], a ; $ff47
+ ret
+
+ ld b, $5
+
+Func_79209: ; 79209 (1e:5209)
+ ld a, $21
+ jp Predef ; indirect jump to Func_480ff (480ff (12:40ff))
+
+AnimationShakeScreen: ; 7920e (1e:520e)
+; Shakes the screen for a while. Used in Earthquake/Fissure/etc. animations.
+ ld b, $8
+
+Func_79210: ; 79210 (1e:5210)
+ ld a, $24
+ jp Predef ; indirect jump to Func_48125 (48125 (12:4125))
+
+AnimationWaterDropletsEverywhere: ; 79215 (1e:5215)
+; Draws water droplets all over the screen and makes them
+; scroll. It's hard to describe, but it's the main animation
+; in Surf/Mist/Toxic.
+ xor a
+ ld [$d09f], a
+ call LoadAnimationTileset
+ ld d, $20
+ ld a, $f0
+ ld [W_BASECOORDX], a ; $d081
+ ld a, $71
+ ld [$d09f], a
+.asm_79228
+ ld a, $10
+ ld [W_BASECOORDY], a ; $d082
+ ld a, $0
+ ld [$d08a], a
+ call Func_79246
+ ld a, $18
+ ld [W_BASECOORDY], a ; $d082
+ ld a, $20
+ ld [$d08a], a
+ call Func_79246
+ dec d
+ jr nz, .asm_79228
+ ret
+
+Func_79246: ; 79246 (1e:5246)
+ ld hl, wOAMBuffer
+.asm_79249
+ ld a, [W_BASECOORDY] ; $d082
+ ld [hli], a
+ ld a, [W_BASECOORDX] ; $d081
+ add $1b
+ ld [W_BASECOORDX], a ; $d081
+ ld [hli], a
+ ld a, [$d09f]
+ ld [hli], a
+ xor a
+ ld [hli], a
+ ld a, [W_BASECOORDX] ; $d081
+ cp $90
+ jr c, .asm_79249
+ sub $a8
+ ld [W_BASECOORDX], a ; $d081
+ ld a, [W_BASECOORDY] ; $d082
+ add $10
+ ld [W_BASECOORDY], a ; $d082
+ cp $70
+ jr c, .asm_79249
+ call AnimationCleanOAM
+ jp DelayFrame
+
+AnimationSlideMonUp: ; 7927a (1e:527a)
+; Slides the mon's sprite upwards.
+ ld c, $7
+ ld a, [H_WHOSETURN]
+ and a
+ ld hl, $c419
+ ld de, $c405
+ ld a, $30
+ jr z, .asm_79291
+ ld hl, $c3c0
+ ld de, $c3ac
+ ld a, $ff
+.asm_79291
+ ld [$d09f], a
+ jp Func_792bf
+
+AnimationSlideMonDown: ; 79297 (1e:5297)
+; Slides the mon's sprite down out of the screen.
+ xor a
+ call Func_79842
+.asm_7929b
+ call Func_79820
+ push bc
+ push de
+ call Func_79aae
+ call Delay3
+ call AnimationHideMonPic
+ pop de
+ pop bc
+ dec b
+ jr nz, .asm_7929b
+ ret
+
+AnimationSlideMonOut: ; 792af (1e:52af)
+; Slides the mon's sprite out of the screen horizontally.
+ ld e, $8
+ ld a, $3
+ ld [W_SUBANIMTRANSFORM], a ; $d08b
+ jp Func_795f8
+
+AnimationSlideEnemyMonOut: ; 792b9 (1e:52b9)
+; Slides the enemy mon out of the screen horizontally.
+ ld hl, AnimationSlideMonOut ; $52af
+ jp CallWithTurnFlipped
+
+Func_792bf: ; 792bf (1e:52bf)
+ push de
+ push hl
+ push bc
+ ld b, $6
+.asm_792c4
+ push bc
+ push de
+ push hl
+ ld bc, $0007
+ call CopyData
+ pop de
+ pop hl
+ ld bc, $0028
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_792c4
+ ld a, [H_WHOSETURN]
+ and a
+ ld hl, $c47d
+ jr z, .asm_792e2
+ ld hl, $c424
+.asm_792e2
+ ld a, [$d09f]
+ inc a
+ ld [$d09f], a
+ ld c, $7
+.asm_792eb
+ ld [hli], a
+ add $7
+ dec c
+ jr nz, .asm_792eb
+ ld c, $2
+ call DelayFrames
+ pop bc
+ pop hl
+ pop de
+ dec c
+ jr nz, Func_792bf
+ ret
+
+Func_792fd: ; 792fd (1e:52fd)
+ ld a, $10
+ ld [W_BASECOORDX], a
+ ld a, $30
+ ld [W_BASECOORDY], a
+ ld hl, wOAMBuffer
+ ld d, $0
+ ld c, $7
+.asm_7930e
+ ld a, [W_BASECOORDY]
+ ld e, a
+ ld b, $5
+.asm_79314
+ call Func_79329
+ inc d
+ dec b
+ jr nz, .asm_79314
+ dec c
+ ret z
+ inc d
+ inc d
+ ld a, [W_BASECOORDX]
+ add $8
+ ld [W_BASECOORDX], a
+ jr .asm_7930e
+
+Func_79329: ; 79329 (1e:5329)
+ ld a, e
+ add $8
+ ld e, a
+ ld [hli], a
+ ld a, [W_BASECOORDX] ; $d081
+ ld [hli], a
+ ld a, d
+ ld [hli], a
+ xor a
+ ld [hli], a
+ ret
+
+Func_79337: ; 79337 (1e:5337)
+ ld l, e
+ ld h, d
+
+Func_79339: ; 79339 (1e:5339)
+ ld de, $4
+.asm_7933c
+ ld a, [$d08a]
+ ld b, a
+ ld a, [hl]
+ add b
+ cp $a8
+ jr c, .asm_7934a
+ dec hl
+ ld a, $a0
+ ld [hli], a
+.asm_7934a
+ ld [hl], a
+ add hl, de
+ dec c
+ jr nz, .asm_7933c
+ ret
+
+Func_79350: ; 79350 (1e:5350)
+ ld l, e
+ ld h, d
+
+Func_79352: ; 79352 (1e:5352)
+ ld de, $4
+.asm_79355
+ ld a, [$d08a]
+ ld b, a
+ ld a, [hl]
+ add b
+ cp $70
+ jr c, .asm_79363
+ dec hl
+ ld a, $a0
+ ld [hli], a
+.asm_79363
+ ld [hl], a
+ add hl, de
+ dec c
+ jr nz, .asm_79355
+ ret
+
+AnimationBlinkEnemyMon: ; 79369 (1e:5369)
+; Make the enemy mon's sprite blink on and off for a second or two
+ ld hl, AnimationBlinkMon ; $536f
+ jp CallWithTurnFlipped
+
+AnimationBlinkMon: ; 7936f (1e:536f)
+; Make the mon's sprite blink on and off for a second or two.
+ push af
+ ld c, $6
+.asm_79372
+ push bc
+ call AnimationHideMonPic
+ ld c, $5
+ call DelayFrames
+ call AnimationShowMonPic
+ ld c, $5
+ call DelayFrames
+ pop bc
+ dec c
+ jr nz, .asm_79372
+ pop af
+ ret
+
+AnimationFlashMonPic: ; 79389 (1e:5389)
+; Flashes the mon's sprite on and off
+ ld a, [W_PLAYERMONID]
+ ld [$ceea], a
+ ld a, [$cfe5]
+ ld [$cee9], a
+ jp Func_79793
+
+AnimationFlashEnemyMonPic: ; 79398 (1e:5398)
+; Flashes the enemy mon's sprite on and off
+ ld hl, AnimationFlashMonPic
+ jp CallWithTurnFlipped
+
+AnimationShowMonPic: ; 7939e (1e:539e)
+ xor a
+ call Func_79842
+ call Func_79820
+ call Func_79aae
+ jp Delay3
+
+AnimationShowEnemyMonPic: ; 793ab (1e:53ab)
+; Shows the emenmy mon's front sprite. Used in animations like Seismic Toss
+; to make the mon's sprite reappear after disappears offscreen.
+ ld hl, AnimationShowMonPic
+ jp CallWithTurnFlipped
+
+AnimationShakeBackAndForth: ; 793b1 (1e:53b1)
+; Shakes the mon's sprite back and forth rapidly. This is used in Double Team.
+; The mon's sprite disappears after this animation.
+ ld a, [H_WHOSETURN]
+ and a
+ ld hl, $c404
+ ld de, $c406
+ jr z, .asm_793c2
+ ld hl, $c3ab
+ ld de, $c3ad
+
+.asm_793c2
+ xor a
+ ld c, $10
+.asm_793c5
+ push af
+ push bc
+ push de
+ push hl
+ push hl
+ push de
+ push af
+ push hl
+ push hl
+ call Func_79842
+ pop hl
+ call Func_79aae
+ call Delay3
+ pop hl
+ ld bc, $0709
+ call ClearScreenArea
+ pop af
+ call Func_79842
+ pop hl
+ call Func_79aae
+ call Delay3
+ pop hl
+ ld bc, $0709
+ call ClearScreenArea
+ pop hl
+ pop de
+ pop bc
+ pop af
+ dec c
+ jr nz, .asm_793c5
+ ret
+
+AnimationMoveMonHorizontally: ; 793f9 (1e:53f9)
+; Shifts the mon's sprite horizontally to a fixed location. Used by lots of
+; animations like Tackle/Body Slam.
+ call AnimationHideMonPic
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ FuncCoord 2, 5 ; $c406
+ ld hl, Coord
+ jr z, .asm_79407
+ FuncCoord 11, 0 ; $c3ab
+ ld hl, Coord
+.asm_79407
+ xor a
+ push hl
+ call Func_79842
+ pop hl
+ call Func_79aae
+ ld c, $3
+ jp DelayFrames
+
+AnimationResetMonPosition: ; 79415 (1e:5415)
+; Resets the mon's sprites to be located at the normal coordinates.
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ ld a, $66
+ jr z, .asm_7941e
+ ld a, $b
+.asm_7941e
+ call Func_7980c
+ jp AnimationShowMonPic
+
+AnimationSpiralBallsInward: ; 79424 (1e:5424)
+; Creates an effect that looks like energy balls sprialing into the
+; player mon's sprite. Used in Focus Energy, for example.
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ jr z, .asm_79435
+ ld a, $d8
+ ld [$d08a], a
+ ld a, $50
+ ld [W_SUBANIMTRANSFORM], a ; $d08b
+ jr .asm_7943c
+.asm_79435
+ xor a
+ ld [$d08a], a
+ ld [W_SUBANIMTRANSFORM], a ; $d08b
+.asm_7943c
+ ld d, $7a
+ ld c, $3
+ xor a
+ call Func_797e8
+ ld hl, SpiralBallAnimationCoordinates ; $5476
+.asm_79447
+ push hl
+ ld c, $3
+ ld de, wOAMBuffer
+.asm_7944d
+ ld a, [hl]
+ cp $ff
+ jr z, .asm_7946f
+ ld a, [$d08a]
+ add [hl]
+ ld [de], a
+ inc de
+ inc hl
+ ld a, [W_SUBANIMTRANSFORM] ; $d08b
+ add [hl]
+ ld [de], a
+ inc hl
+ inc de
+ inc de
+ inc de
+ dec c
+ jr nz, .asm_7944d
+ ld c, $5
+ call DelayFrames
+ pop hl
+ inc hl
+ inc hl
+ jr .asm_79447
+.asm_7946f
+ pop hl
+ call AnimationCleanOAM
+ jp AnimationFlashScreen
+
+SpiralBallAnimationCoordinates: ; 79476 (1e:5476)
+; y, x pairs
+; This is the sequence of screen coordinates that the spiraling
+; balls are positioned at.
+ db $38, $28
+ db $40, $18
+ db $50, $10
+ db $60, $18
+ db $68, $28
+ db $60, $38
+ db $50, $40
+ db $40, $38
+ db $40, $28
+ db $46, $1E
+ db $50, $18
+ db $5B, $1E
+ db $60, $28
+ db $5B, $32
+ db $50, $38
+ db $46, $32
+ db $48, $28
+ db $50, $20
+ db $58, $28
+ db $50, $30
+ db $50, $28
+ db $FF ; list terminator
+
+AnimationSquishMonPic: ; 794a1 (1e:54a1)
+; Squishes the mon's sprite horizontally making it
+; disappear. Used by Teleport/Sky Attack animations.
+ ld c, $4
+.asm_794a3
+ push bc
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ jr z, .asm_794b1
+ FuncCoord 16, 0 ; $c3b0
+ ld hl, Coord
+ FuncCoord 14, 0 ; $c3ae
+ ld de, Coord
+ jr .asm_794b7
+.asm_794b1
+ FuncCoord 5, 5 ; $c409
+ ld hl, Coord
+ FuncCoord 3, 5 ; $c407
+ ld de, Coord
+.asm_794b7
+ push de
+ xor a
+ ld [$d09f], a
+ call Func_794d4
+ pop hl
+ ld a, $1
+ ld [$d09f], a
+ call Func_794d4
+ pop bc
+ dec c
+ jr nz, .asm_794a3
+ call AnimationHideMonPic
+ ld c, $2
+ jp DelayFrame
+
+Func_794d4: ; 794d4 (1e:54d4)
+ ld c, $7
+.asm_794d6
+ push bc
+ push hl
+ ld c, $3
+ ld a, [$d09f]
+ cp $0
+ jr nz, .asm_794e7
+ call Func_7985b
+ dec hl
+ jr .asm_794eb
+.asm_794e7
+ call Func_79862
+ inc hl
+.asm_794eb
+ ld [hl], $7f
+ pop hl
+ ld de, $14
+ add hl, de
+ pop bc
+ dec c
+ jr nz, .asm_794d6
+ jp Delay3
+
+AnimationShootBallsUpward: ; 794f9 (1e:54f9)
+; Shoots one pillar of "energy" balls upwards. Used in Teleport/Sky Attack
+; animations.
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ jr z, .asm_79503
+ ld bc, $80
+ jr .asm_79506
+.asm_79503
+ ld bc, $3028
+.asm_79506
+ ld a, b
+ ld [W_BASECOORDY], a ; $d082
+ ld a, c
+ ld [W_BASECOORDX], a ; $d081
+ ld bc, $501
+ call Func_79517
+ jp AnimationCleanOAM
+
+Func_79517: ; 79517 (1e:5517)
+ push bc
+ xor a
+ ld [$d09f], a
+ call LoadAnimationTileset
+ pop bc
+ ld d, $7a
+ ld hl, wOAMBuffer
+ push bc
+ ld a, [W_BASECOORDY] ; $d082
+ ld e, a
+.asm_7952a
+ call Func_79329
+ dec b
+ jr nz, .asm_7952a
+ call DelayFrame
+ pop bc
+ ld a, b
+ ld [$d08a], a
+.asm_79538
+ push bc
+ ld hl, wOAMBuffer
+.asm_7953c
+ ld a, [W_BASECOORDY] ; $d082
+ add $8
+ ld e, a
+ ld a, [hl]
+ cp e
+ jr z, .asm_7954b
+ add $fc
+ ld [hl], a
+ jr .asm_79554
+.asm_7954b
+ ld [hl], $0
+ ld a, [$d08a]
+ dec a
+ ld [$d08a], a
+.asm_79554
+ ld de, $4
+ add hl, de
+ dec b
+ jr nz, .asm_7953c
+ call DelayFrames
+ pop bc
+ ld a, [$d08a]
+ and a
+ jr nz, .asm_79538
+ ret
+
+AnimationShootManyBallsUpward: ; 79566 (1e:5566)
+; Shoots several pillars of "energy" balls upward.
+ ld a, [H_WHOSETURN]
+ and a
+ ld hl, UpwardBallsAnimXCoordinatesPlayerTurn
+ ld a, $50 ; y coordinate for "energy" ball pillar
+ jr z, .player
+ ld hl, UpwardBallsAnimXCoordinatesEnemyTurn
+ ld a, $28 ; y coordinate for "energy" ball pillar
+.player
+ ld [wTrainerSpriteOffset], a
+.loop
+ ld a, [wTrainerSpriteOffset]
+ ld [W_BASECOORDY], a
+ ld a, [hli]
+ cp $ff
+ jp z, AnimationCleanOAM
+ ld [W_BASECOORDX], a
+ ld bc, $0401
+ push hl
+ call Func_79517
+ pop hl
+ jr .loop
+
+UpwardBallsAnimXCoordinatesPlayerTurn: ; 79591 (1e:5591)
+; List of x coordinates for each pillar of "energy" balls in the
+; AnimationShootManyBallsUpward animation. It's unused in the game.
+ db $10, $40, $28, $18, $38, $30
+ db $FF ; list terminator
+
+UpwardBallsAnimXCoordinatesEnemyTurn: ; 79598 (1e:5598)
+; List of x coordinates for each pillar of "energy" balls in the
+; AnimationShootManyBallsUpward animation. It's unused in the game.
+ db $60, $90, $78, $68, $88, $80
+ db $FF ; list terminator
+
+AnimationMinimizeMon: ; 7959f (1e:559f)
+; Changes the mon's sprite to a mini black sprite. Used by the
+; Minimize animation.
+ ld hl, $c6e8
+ push hl
+ xor a
+ ld bc, $310
+ call FillMemory
+ pop hl
+ ld de, $194
+ add hl, de
+ ld de, MinimizedMonSprite ; $55c4
+ ld c, $5
+.asm_795b4
+ ld a, [de]
+ ld [hli], a
+ ld [hli], a
+ inc de
+ dec c
+ jr nz, .asm_795b4
+ call Func_79652
+ call Delay3
+ jp AnimationShowMonPic
+
+MinimizedMonSprite: ; 795c4 (1e:55c4)
+ INCBIN "gfx/minimized_mon_sprite.1bpp"
+
+AnimationSlideMonDownAndHide: ; 795c9 (1e:55c9)
+; Slides the mon's sprite down and disappears. Used in Acid Armor.
+ ld a, $1
+ ld c, $2
+.asm_795cd
+ push bc
+ push af
+ call AnimationHideMonPic
+ pop af
+ push af
+ call Func_79842
+ call Func_79820
+ call Func_79aae
+ ld c, $8
+ call DelayFrames
+ pop af
+ inc a
+ pop bc
+ dec c
+ jr nz, .asm_795cd
+ call AnimationHideMonPic
+ ld hl, $c6e8
+ ld bc, $0310
+ xor a
+ call FillMemory
+ jp Func_79652
+
+Func_795f8: ; 795f8 (1e:55f8)
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ jr z, .asm_79602
+ FuncCoord 12, 0 ; $c3ac
+ ld hl, Coord
+ jr .asm_79605
+.asm_79602
+ FuncCoord 0, 5 ; $c404
+ ld hl, Coord
+.asm_79605
+ ld d, $8
+.asm_79607
+ push hl
+ ld b, $7
+.asm_7960a
+ ld c, $8
+.asm_7960c
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ jr z, .asm_79616
+ call Func_7963c
+ jr .asm_79619
+.asm_79616
+ call Func_79633
+.asm_79619
+ ld [hli], a
+ dec c
+ jr nz, .asm_7960c
+ push de
+ ld de, $c
+ add hl, de
+ pop de
+ dec b
+ jr nz, .asm_7960a
+ ld a, [W_SUBANIMTRANSFORM] ; $d08b
+ ld c, a
+ call DelayFrames
+ pop hl
+ dec d
+ dec e
+ jr nz, .asm_79607
+ ret
+
+Func_79633: ; 79633 (1e:5633)
+ ld a, [hl]
+ add $7
+ cp $61
+ ret c
+ ld a, $7f
+ ret
+
+Func_7963c: ; 7963c (1e:563c)
+ ld a, [hl]
+ sub $7
+ cp $30
+ ret c
+ ld a, $7f
+ ret
+
+AnimationSlideMonHalfLeft: ; 79645 (1e:5645)
+; Slides the mon's sprite halfway out of the screen. It's used in Softboiled.
+ ld e, $4
+ ld a, $4
+ ld [W_SUBANIMTRANSFORM], a
+ call Func_795f8
+ jp Delay3
+
+Func_79652: ; 79652 (1e:5652)
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ ld hl, $9310
+ jr z, .asm_7965d
+ ld hl, $9000
+.asm_7965d
+ ld de, $c6e8
+ ld bc, $31
+ jp CopyVideoData
+
+AnimationWavyScreen: ; 79666 (1e:5666)
+; used in Psywave/Psychic etc.
+ ld hl, $9800
+ call Func_79e0d
+ call Delay3
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ld a, $90
+ ld [$ffb0], a
+ ld d, $80
+ ld e, $8f
+ ld c, $ff
+ ld hl, WavyScreenLineOffsets
+.asm_7967f
+ push hl
+.asm_79680
+ call Func_796ae
+ ld a, [$ff44]
+ cp e
+ jr nz, .asm_79680
+ pop hl
+ inc hl
+ ld a, [hl]
+ cp d
+ jr nz, .asm_79691
+ ld hl, WavyScreenLineOffsets
+.asm_79691
+ dec c
+ jr nz, .asm_7967f
+ xor a
+ ld [$ffb0], a
+ call SaveScreenTilesToBuffer2
+ call ClearScreen
+ ld a, $1
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call Delay3
+ call LoadScreenTilesFromBuffer2
+ ld hl, $9c00
+ call Func_79e0d
+ ret
+
+Func_796ae: ; 796ae (1e:56ae)
+ ld a, [$ff41]
+ and $3
+ jr nz, Func_796ae
+ ld a, [hl]
+ ld [$ff43], a
+ inc hl
+ ld a, [hl]
+ cp d
+ ret nz
+ ld hl, WavyScreenLineOffsets
+ ret
+
+WavyScreenLineOffsets: ; 796bf (1e:56bf)
+; Sequence of horizontal line pixel offsets for the wavy screen animation.
+; This sequence vaguely resembles a sine wave.
+ db 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1
+ db 0, 0, 0, 0, 0, -1, -1, -1, -2, -2, -2, -2, -2, -1, -1, -1
+ db $80 ; terminator
+
+AnimationSubstitute: ; 796e0 (1e:56e0)
+; Changes the pokemon's sprite to the mini sprite
+ ld hl, $c6e8
+ xor a
+ ld bc, $0310
+ call FillMemory
+ ld a, [$fff3]
+ and a
+ jr z, .asm_79715 ; 0x796ed $26
+ ld hl, SlowbroSprite ; $4780 ; facing down sprite
+ ld de, $c808
+ call CopySlowbroSpriteData
+ ld hl, SlowbroSprite + $10 ; $4790
+ ld de, $c878
+ call CopySlowbroSpriteData
+ ld hl, SlowbroSprite + $20 ; $47a0
+ ld de, $c818
+ call CopySlowbroSpriteData
+ ld hl, SlowbroSprite + $30 ; $47b0
+ ld de, $c888
+ call CopySlowbroSpriteData
+ jr .asm_79739 ; 0x79713 $24
+.asm_79715
+ ld hl, SlowbroSprite + $40 ; $47c0 ; facing up sprite
+ ld de, $c878
+ call CopySlowbroSpriteData
+ ld hl, SlowbroSprite + $50 ; $47d0
+ ld de, $c8e8
+ call CopySlowbroSpriteData
+ ld hl, SlowbroSprite + $60 ; $47e0
+ ld de, $c888
+ call CopySlowbroSpriteData
+ ld hl, SlowbroSprite + $70 ; $47f0
+ ld de, $c8f8
+ call CopySlowbroSpriteData
+.asm_79739
+ call Func_79652
+ jp AnimationShowMonPic
+
+CopySlowbroSpriteData: ; 7973f (1e:573f)
+ ld bc, $0010
+ ld a, BANK(SlowbroSprite)
+ jp FarCopyData2
+
+Func_79747: ; 79747 (1e:5747)
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ ld hl, $ccf7
+ ld a, [W_PLAYERBATTSTATUS2] ; $d063
+ jr z, .asm_79758
+ ld hl, $ccf3
+ ld a, [W_ENEMYBATTSTATUS2] ; $d068
+.asm_79758
+ push hl
+ bit 4, a
+ jr nz, .asm_79762
+ call AnimationSlideMonDown
+ jr .asm_79765
+.asm_79762
+ call AnimationSlideMonOut
+.asm_79765
+ pop hl
+ ld a, [hl]
+ and a
+ jp nz, AnimationMinimizeMon
+ call AnimationFlashMonPic
+ jp AnimationShowMonPic
+
+Func_79771: ; 79771 (1e:5771)
+ call AnimationSlideMonOut
+ call AnimationSubstitute
+ jp AnimationShowMonPic
+
+AnimationBoundUpAndDown: ; 7977a (1e:577a)
+; Bounces the mon's sprite up and down several times. It is used
+; by Splash's animation.
+ ld c, $5
+.asm_7977c
+ push bc
+ call AnimationSlideMonDown
+ pop bc
+ dec c
+ jr nz, .asm_7977c ; 0x79782 $f8
+ jp AnimationShowMonPic
+
+AnimationTransformMon: ; 79787 (1e:5787)
+; Redraws this mon's sprite as the back/front sprite of the opposing mon.
+; Used in Transform.
+ ld a, [$cfe5]
+ ld [$ceea], a
+ ld a, [W_PLAYERMONID]
+ ld [$cee9], a
+
+Func_79793: ; 79793 (1e:5793)
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ jr z, .asm_797b0
+ ld a, [$cee9]
+ ld [$cf91], a
+ ld [$d0b5], a
+ xor a
+ ld [W_SPRITEFLIPPED], a
+ call GetMonHeader
+ FuncCoord 12, 0 ; $c3ac
+ ld hl, Coord
+ call LoadFrontSpriteByMonIndex
+ jr .asm_797d3
+.asm_797b0
+ ld a, [$cfd9]
+ push af
+ ld a, [$ceea]
+ ld [$cfd9], a
+ ld [$d0b5], a
+ call GetMonHeader
+ ld a, $4
+ call Predef ; indirect jump to LoadMonBackSprite (3f103 (f:7103))
+ xor a
+ call Func_79842
+ call Func_79820
+ call Func_79aae
+ pop af
+ ld [$cfd9], a
+.asm_797d3
+ ld b, $1
+ jp GoPAL_SET
+
+AnimationHideEnemyMonPic: ; 797d8 (1e:57d8)
+; Hides the enemy mon's sprite
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
+ ld hl, AnimationHideMonPic ; $5801
+ call CallWithTurnFlipped
+ ld a, $1
+ ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
+ jp Delay3
+
+Func_797e8: ; 797e8 (1e:57e8)
+ push bc
+ push de
+ ld [$d09f], a
+ call LoadAnimationTileset
+ pop de
+ pop bc
+ xor a
+ ld e, a
+ ld [W_BASECOORDX], a ; $d081
+ ld hl, wOAMBuffer
+.asm_797fa
+ call Func_79329
+ dec c
+ jr nz, .asm_797fa
+ ret
+
+AnimationHideMonPic: ; 79801 (1e:5801)
+; Hides the mon's sprite.
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ jr z, .asm_7980a
+ ld a, $c
+ jr Func_7980c
+.asm_7980a
+ ld a, $65
+
+Func_7980c: ; 7980c (1e:580c)
+ push hl
+ push de
+ push bc
+ ld e, a
+ ld d, $0
+ ld hl, wTileMap
+ add hl, de
+ ld bc, $707
+ call ClearScreenArea
+ pop bc
+ pop de
+ pop hl
+ ret
+
+Func_79820: ; 79820 (1e:5820)
+ push de
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ jr nz, .asm_7982a
+ ld a, $65
+ jr .asm_7982c
+.asm_7982a
+ ld a, $c
+.asm_7982c
+ ld hl, wTileMap
+ ld e, a
+ ld d, $0
+ add hl, de
+ ld a, $7
+ sub b
+ and a
+ jr z, .asm_79840
+ ld de, $14
+.asm_7983c
+ add hl, de
+ dec a
+ jr nz, .asm_7983c
+.asm_79840
+ pop de
+ ret
+
+Func_79842: ; 79842 (1e:5842)
+ ld hl, PointerTable_79aea ; $5aea
+ ld e, a
+ ld d, $0
+ add hl, de
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld b, a
+ and $f
+ ld c, a
+ ld a, b
+ swap a
+ and $f
+ ld b, a
+ ret
+
+Func_7985b: ; 7985b (1e:585b)
+ ld a, [hld]
+ ld [hli], a
+ inc hl
+ dec c
+ jr nz, Func_7985b
+ ret
+
+Func_79862: ; 79862 (1e:5862)
+ ld a, [hli]
+ ld [hld], a
+ dec hl
+ dec c
+ jr nz, Func_79862
+ ret
+
+Func_79869: ; 79869 (1e:5869)
+ ld a, b
+ call Func_7986f
+ ld b, a
+ ret
+
+Func_7986f: ; 7986f (1e:586f)
+ ld hl,MoveSoundTable
+ ld e,a
+ ld d,0
+ add hl,de
+ add hl,de
+ add hl,de
+ ld a,[hli]
+ ld b,a
+ call IsCryMove
+ jr nc,.NotCryMove
+ ld a,[H_WHOSETURN]
+ and a
+ jr nz,.next
+ ld a,[W_PLAYERMONID] ; get number of current monster
+ jr .Continue
+.next
+ ld a,[$CFE5]
+.Continue
+ push hl
+ call GetCryData
+ ld b,a
+ pop hl
+ ld a,[$C0F1]
+ add [hl]
+ ld [$C0F1],a
+ inc hl
+ ld a,[$C0F2]
+ add [hl]
+ ld [$C0F2],a
+ jr .done
+.NotCryMove
+ ld a,[hli]
+ ld [$C0F1],a
+ ld a,[hli]
+ ld [$C0F2],a
+.done
+ ld a,b
+ ret
+
+IsCryMove: ; 798ad (1e:58ad)
+; set carry if the move animation involves playing a monster cry
+ ld a,[W_ANIMATIONID]
+ cp a,GROWL
+ jr z,.CryMove
+ cp a,ROAR
+ jr z,.CryMove
+ and a ; clear carry
+ ret
+.CryMove
+ scf
+ ret
+
+MoveSoundTable: ; 798bc (1e:58bc)
+ db $a0,$00,$80
+ db $a2,$10,$80
+ db $b3,$00,$80
+ db $a1,$01,$80
+ db $a3,$00,$40
+ db $e9,$00,$ff
+ db $a3,$10,$60
+ db $a3,$20,$80
+ db $a3,$00,$a0
+ db $a6,$00,$80
+ db $a5,$20,$40
+ db $a5,$00,$80
+ db $a4,$00,$a0
+ db $a7,$10,$c0
+ db $a7,$00,$a0
+ db $a8,$00,$c0
+ db $a8,$10,$a0
+ db $a9,$00,$e0
+ db $a7,$20,$c0
+ db $aa,$00,$80
+ db $b9,$00,$80
+ db $ab,$01,$80
+ db $b7,$00,$80
+ db $ad,$f0,$40
+ db $b0,$00,$80
+ db $ad,$00,$80
+ db $b8,$10,$80
+ db $b1,$01,$a0
+ db $ae,$00,$80
+ db $b4,$00,$60
+ db $b4,$01,$40
+ db $b6,$00,$a0
+ db $b0,$10,$a0
+ db $b7,$00,$c0
+ db $aa,$10,$60
+ db $b0,$00,$a0
+ db $b9,$11,$c0
+ db $b0,$20,$c0
+ db $b8,$00,$80
+ db $b1,$00,$80
+ db $b1,$20,$c0
+ db $af,$00,$80
+ db $db,$ff,$40
+ db $b4,$00,$80
+ db $a1,$00,$c0
+ db $a1,$00,$40
+ db $e4,$00,$80
+ db $bf,$40,$60
+ db $bf,$00,$80
+ db $bf,$ff,$40
+ db $c7,$80,$c0
+ db $af,$10,$a0
+ db $af,$21,$e0
+ db $c5,$00,$80
+ db $bb,$20,$60
+ db $c7,$00,$80
+ db $cc,$00,$80
+ db $c2,$40,$80
+ db $c5,$f0,$e0
+ db $cf,$00,$80
+ db $c7,$f0,$60
+ db $c2,$00,$80
+ db $e6,$00,$80
+ db $9d,$01,$a0
+ db $a9,$f0,$20
+ db $ba,$01,$c0
+ db $ba,$00,$80
+ db $b0,$00,$e0
+ db $be,$01,$60
+ db $be,$20,$40
+ db $bb,$00,$80
+ db $bb,$40,$c0
+ db $b1,$03,$60
+ db $bd,$11,$e0
+ db $a8,$20,$e0
+ db $d2,$00,$80
+ db $b2,$00,$80
+ db $b2,$11,$a0
+ db $b2,$01,$c0
+ db $a9,$14,$c0
+ db $b1,$02,$a0
+ db $c5,$f0,$80
+ db $c5,$20,$c0
+ db $d5,$00,$20
+ db $d5,$20,$80
+ db $d2,$12,$60
+ db $be,$00,$80
+ db $aa,$01,$e0
+ db $c5,$0f,$e0
+ db $c5,$11,$20
+ db $a6,$10,$40
+ db $a5,$10,$c0
+ db $aa,$00,$20
+ db $d8,$00,$80
+ db $e4,$11,$18
+ db $9f,$20,$c0
+ db $9e,$20,$c0
+ db $bd,$00,$10
+ db $be,$f0,$20
+ db $df,$f0,$c0
+ db $a7,$f0,$e0
+ db $9f,$f0,$40
+ db $db,$00,$80
+ db $df,$80,$40
+ db $df,$00,$80
+ db $aa,$11,$20
+ db $aa,$22,$10
+ db $b1,$f1,$ff
+ db $a9,$f1,$ff
+ db $aa,$33,$30
+ db $dd,$40,$c0
+ db $a4,$20,$20
+ db $a4,$f0,$10
+ db $a5,$f8,$10
+ db $a7,$f0,$10
+ db $bd,$00,$80
+ db $ae,$00,$c0
+ db $dd,$c0,$ff
+ db $9f,$f2,$20
+ db $e1,$00,$80
+ db $e1,$00,$40
+ db $9f,$00,$40
+ db $a7,$10,$ff
+ db $c7,$20,$20
+ db $dd,$00,$80
+ db $c5,$1f,$20
+ db $bd,$2f,$80
+ db $a5,$1f,$ff
+ db $ca,$1f,$60
+ db $be,$1e,$20
+ db $be,$1f,$18
+ db $aa,$0f,$80
+ db $9f,$f8,$10
+ db $9e,$18,$20
+ db $dd,$08,$40
+ db $ad,$01,$e0
+ db $a7,$09,$ff
+ db $e4,$42,$01
+ db $b2,$00,$ff
+ db $dd,$08,$e0
+ db $bb,$00,$80
+ db $9f,$88,$10
+ db $bd,$48,$ff
+ db $9e,$ff,$ff
+ db $bb,$ff,$10
+ db $9e,$ff,$04
+ db $b2,$01,$ff
+ db $a9,$f8,$ff
+ db $a2,$f0,$f0
+ db $a5,$08,$10
+ db $a3,$f0,$ff
+ db $b0,$f0,$ff
+ db $e1,$10,$ff
+ db $a4,$f0,$20
+ db $ca,$f0,$60
+ db $b8,$12,$10
+ db $e6,$f0,$20
+ db $b4,$12,$ff
+ db $db,$80,$04
+ db $df,$f0,$10
+ db $c5,$f8,$ff
+ db $be,$f0,$ff
+ db $a7,$01,$ff
+ db $cc,$d8,$04
+ db $a1,$00,$80
+ db $a1,$00,$80
+
+Func_79aae: ; 79aae (1e:5aae)
+ ld a, [H_WHOSETURN] ; $fff3
+ and a
+ ld a, $31
+ jr z, .asm_79ab6
+ xor a
+.asm_79ab6
+ ld [H_DOWNARROWBLINKCNT1], a ; $ff8b
+ jr asm_79acb
+
+Func_79aba: ; 79aba (1e:5aba)
+ call Load16BitRegisters
+ ld a, [$cd6c]
+ and a
+ jr nz, .asm_79ac8
+ ld de, Unknown_79b02 ; $5b02
+ jr asm_79acb
+.asm_79ac8
+ ld de, Unknown_79b1b ; $5b1b
+asm_79acb: ; 79acb (1e:5acb)
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
+
+Func_79ace: ; 79ace (1e:5ace)
+ push hl
+.asm_79acf
+ push bc
+ push hl
+ ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b
+ ld b, a
+.asm_79ad4
+ ld a, [de]
+ add b
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .asm_79ad4
+ pop hl
+ ld bc, $14
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_79acf
+ ld a, $1
+ ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
+ pop hl
+ ret
+
+PointerTable_79aea: ; 79aea (1e:5aea)
+ dw Unknown_79b24
+ db $77
+ dw Unknown_79b55
+ db $57
+ dw Unknown_79b78
+ db $37
+ dw Unknown_79b8d
+ db $77
+ dw Unknown_79bbe
+ db $77
+ dw Unknown_79bef
+ db $77
+ dw Unknown_79c20
+ db $86
+ dw Unknown_79c50
+ db $3C
+
+Unknown_79b02: ; 79b02 (1e:5b02)
+ db $31,$38,$46,$54,$5B,$32,$39,$47,$55,$5C,$34,$3B,$49,$57,$5E,$36,$3D,$4B,$59,$60,$37,$3E,$4C,$5A,$61
+
+Unknown_79b1b: ; 79b1b (1e:5b1b)
+ db $31,$46,$5B,$34,$49,$5E,$37,$4C,$61
+
+Unknown_79b24: ; 79b24 (1e:5b24)
+ db $00,$07,$0E,$15,$1C,$23,$2A,$01,$08,$0F,$16,$1D,$24,$2B,$02,$09,$10,$17,$1E,$25,$2C,$03,$0A,$11,$18,$1F,$26,$2D,$04,$0B,$12,$19,$20,$27,$2E,$05,$0C,$13,$1A,$21,$28,$2F,$06,$0D,$14,$1B,$22,$29,$30
+
+Unknown_79b55: ; 79b55 (1e:5b55)
+ db $00,$07,$0E,$15,$1C,$23,$2A,$01,$08,$0F,$16,$1D,$24,$2B,$03,$0A,$11,$18,$1F,$26,$2D,$04,$0B,$12,$19,$20,$27,$2E,$05,$0C,$13,$1A,$21,$28,$2F
+
+Unknown_79b78: ; 79b78 (1e:5b78)
+ db $00,$07,$0E,$15,$1C,$23,$2A,$02,$09,$10,$17,$1E,$25,$2C,$04,$0B,$12,$19,$20,$27,$2E
+
+Unknown_79b8d: ; 79b8d (1e:5b8d)
+ db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$19,$00,$02,$06,$0B,$10,$14,$1A,$00,$00,$07,$0C,$11,$15,$1B,$00,$03,$08,$0D,$12,$16,$1C,$00,$04,$09,$0E,$13,$17,$1D,$1F,$05,$0A,$0F,$01,$18,$1E,$20
+
+Unknown_79bbe: ; 79bbe (1e:5bbe)
+ db $00,$00,$00,$30,$00,$37,$00,$00,$00,$2B,$31,$34,$38,$3D,$21,$26,$2C,$01,$35,$39,$3E,$22,$27,$2D,$32,$36,$01,$00,$23,$28,$2E,$33,$01,$3A,$00,$24,$29,$2F,$01,$01,$3B,$00,$25,$2A,$01,$01,$01,$3C,$00
+
+Unknown_79bef: ; 79bef (1e:5bef)
+ db $00,$00,$00,$00,$00,$00,$00,$00,$00,$47,$4D,$00,$00,$00,$00,$00,$48,$4E,$52,$56,$5B,$3F,$43,$49,$4F,$53,$57,$5C,$40,$44,$4A,$50,$54,$58,$00,$41,$45,$4B,$51,$4C,$59,$5D,$42,$46,$4C,$4C,$55,$5A,$5E
+
+Unknown_79c20: ; 79c20 (1e:5c20)
+ db $31,$32,$32,$32,$32,$33,$34,$35,$36,$36,$37,$38,$34,$39,$3A,$3A,$3B,$38,$3C,$3D,$3E,$3E,$3F,$40,$41,$42,$43,$43,$44,$45,$46,$47,$43,$48,$49,$4A,$41,$43,$4B,$4C,$4D,$4E,$4F,$50,$50,$50,$51,$52
+
+Unknown_79c50: ; 79c50 (1e:5c50)
+ db $43,$55,$56,$53,$53,$53,$53,$53,$53,$53,$53,$53,$43,$57,$58,$54,$54,$54,$54,$54,$54,$54,$54,$54,$43,$59,$5A,$43,$43,$43,$43,$43,$43,$43,$43,$43
+
+AnimationLeavesFalling: ; 79c74 (1e:5c74)
+; Makes leaves float down from the top of the screen. This is used
+; in Razor Leaf's animation.
+ ld a, [$ff48]
+ push af
+ ld a, [$cc79]
+ ld [$ff48], a
+ ld d, $37
+ ld a, $3
+ ld [W_SUBANIMTRANSFORM], a
+ call Func_79c97
+ pop af
+ ld [$ff48], a
+ ret
+
+AnimationPetalsFalling: ; 79c8a (1e:5c8a)
+; Makes lots of petals fall down from the top of the screen. It's used in
+; the animation for Petal Dance.
+ ld d, $71
+ ld a, $14
+ ld [W_SUBANIMTRANSFORM], a
+ call Func_79c97
+ jp CleanLCD_OAM
+
+Func_79c97: ; 79c97 (1e:5c97)
+ ld c, a
+ ld a, $1
+ call Func_797e8
+ call Func_79d2a
+ call Func_79d52
+ ld hl, wOAMBuffer
+ ld [hl], $0
+.asm_79ca8
+ ld hl, wTrainerSpriteOffset
+ ld de, $0000
+ ld a, [W_SUBANIMTRANSFORM]
+ ld c, a
+.asm_79cb2
+ push bc
+ push hl
+ push de
+ ld a, [hl]
+ ld [$d08a], a
+ call Func_79d16
+ call Func_79cdb
+ pop de
+ ld hl, $0004
+ add hl, de
+ ld e, l
+ ld d, h
+ pop hl
+ ld a, [$d08a]
+ ld [hli], a
+ pop bc
+ dec c
+ jr nz, .asm_79cb2
+ call Delay3
+ ld hl, wOAMBuffer
+ ld a, [hl]
+ cp $68
+ jr nz, .asm_79ca8
+ ret
+
+Func_79cdb: ; 79cdb (1e:5cdb)
+ ld hl, wOAMBuffer
+ add hl, de
+ ld a, [hl]
+ inc a
+ inc a
+ cp $70
+ jr c, .asm_79ce8
+ ld a, $a0
+.asm_79ce8
+ ld [hli], a
+ ld a, [$d08a]
+ ld b, a
+ ld de, Unknown_79d0d
+ and $7f
+ add e
+ jr nc, .asm_79cf6
+ inc d
+.asm_79cf6
+ ld e, a
+ ld a, b
+ and $80
+ jr nz, .asm_79d03
+ ld a, [de]
+ add [hl]
+ ld [hli], a
+ inc hl
+ xor a
+ jr .asm_79d0b
+.asm_79d03
+ ld a, [de]
+ ld b, a
+ ld a, [hl]
+ sub b
+ ld [hli], a
+ inc hl
+ ld a, $20
+.asm_79d0b
+ ld [hl], a
+ ret
+
+Unknown_79d0d: ; 79d0d (1e:5d0d)
+ db $00,$01,$03,$05,$07,$09,$0B,$0D,$0F
+
+Func_79d16: ; 79d16 (1e:5d16)
+ ld a, [$d08a]
+ inc a
+ ld b, a
+ and $7f
+ cp $9
+ ld a, b
+ jr nz, .asm_79d26
+ and $80
+ xor $80
+.asm_79d26
+ ld [$d08a], a
+ ret
+
+Func_79d2a: ; 79d2a (1e:5d2a)
+ ld hl, $c301
+ ld de, Unknown_79d3e
+ ld a, [W_SUBANIMTRANSFORM]
+ ld c, a
+.asm_79d34
+ ld a, [de]
+ ld [hli], a
+ inc hl
+ inc hl
+ inc hl
+ inc de
+ dec c
+ jr nz, .asm_79d34
+ ret
+
+Unknown_79d3e: ; 79d3e (1e:5d3e)
+ db $38,$40,$50,$60,$70,$88,$90,$56,$67,$4A,$77,$84,$98,$32,$22,$5C,$6C,$7D,$8E,$99
+
+Func_79d52: ; 79d52 (1e:5d52)
+ ld hl, wTrainerSpriteOffset
+ ld de, Unknown_79d63
+ ld a, [W_SUBANIMTRANSFORM]
+ ld c, a
+.asm_79d5c
+ ld a, [de]
+ ld [hli], a
+ inc de
+ dec c
+ jr nz, .asm_79d5c
+ ret
+
+Unknown_79d63: ; 79d63 (1e:5d63)
+ db $00,$84,$06,$81,$02,$88,$01,$83,$05,$89,$09,$80,$07,$87,$03,$82,$04,$85,$08,$86
+
+AnimationShakeEnemyHUD: ; 79d77 (1e:5d77)
+ ld de, $9310
+ ld hl, $8000
+ ld bc, $0031
+ call CopyVideoData
+ xor a
+ ld [$ffae], a
+ ld hl, $9800
+ call Func_79e0d
+ ld a, $90
+ ld [$ffb0], a
+ ld hl, $9b20
+ call Func_79e0d
+ ld a, $38
+ ld [$ffb0], a
+ call Func_792fd
+ ld hl, $9800
+ call Func_79e0d
+ call AnimationHideMonPic
+ call Delay3
+ ld de, $0208
+ call Func_79de9
+ call AnimationShowMonPic
+ call CleanLCD_OAM
+ ld a, $90
+ ld [$ffb0], a
+ ld hl, $9c00
+ call Func_79e0d
+ xor a
+ ld [$ffb0], a
+ call SaveScreenTilesToBuffer1
+ ld hl, $9800
+ call Func_79e0d
+ call ClearScreen
+ call Delay3
+ call LoadScreenTilesFromBuffer1
+ ld hl, $9c00
+ jp Func_79e0d
+
+Func_79dda: ; 79dda (1e:5dda)
+ call Load16BitRegisters
+ ld a, c
+ ld [H_DOWNARROWBLINKCNT1], a ; $ff8b
+ ld a, b
+ push hl
+ call Func_79842
+ pop hl
+ jp Func_79ace
+
+Func_79de9: ; 79de9 (1e:5de9)
+ ld a, [$ffae]
+ ld [wTrainerSpriteOffset], a
+.asm_79dee
+ ld a, [wTrainerSpriteOffset]
+ add d
+ ld [$ffae], a
+ ld c, $2
+ call DelayFrames
+ ld a, [wTrainerSpriteOffset]
+ sub d
+ ld [$ffae], a
+ ld c, $2
+ call DelayFrames
+ dec e
+ jr nz, .asm_79dee
+ ld a, [wTrainerSpriteOffset]
+ ld [$ffae], a
+ ret
+
+Func_79e0d: ; 79e0d (1e:5e0d)
+ ld a, h
+ ld [$ffbd], a
+ ld a, l
+ ld [H_AUTOBGTRANSFERDEST], a
+ jp Delay3
+
+TossBallAnimation: ; 79e16 (1e:5e16)
+ ld a,[W_ISINBATTLE]
+ cp a,2
+ jr z,.BlockBall ; if in trainer battle, play different animation
+ ld a,[$D11E]
+ ld b,a
+
+ ; upper nybble: how many animations (from PokeBallAnimations) to play
+ ; this will be 4 for successful capture, 6 for breakout
+ and a,$F0
+ swap a
+ ld c,a
+
+ ; lower nybble: number of shakes
+ ; store these for later
+ ld a,b
+ and a,$F
+ ld [$CD3D],a
+
+ ld hl,.PokeBallAnimations
+ ; choose which toss animation to use
+ ld a,[$CF91]
+ cp a,POKE_BALL
+ ld b,TOSS_ANIM
+ jr z,.done
+ cp a,GREAT_BALL
+ ld b,GREATTOSS_ANIM
+ jr z,.done
+ ld b,ULTRATOSS_ANIM
+.done
+ ld a,b
+.PlayNextAnimation
+ ld [W_ANIMATIONID],a
+ push bc
+ push hl
+ call PlayAnimation
+ pop hl
+ ld a,[hli]
+ pop bc
+ dec c
+ jr nz,.PlayNextAnimation
+ ret
+
+.PokeBallAnimations: ; 79e50 (1e:5e50)
+; sequence of animations that make up the Poké Ball toss
+ db POOF_ANIM,HIDEPIC_ANIM,$C2,POOF_ANIM,SHOWPIC_ANIM
+
+.BlockBall ; 5E55
+ ld a,$C1
+ ld [W_ANIMATIONID],a
+ call PlayAnimation
+ ld a,(SFX_08_43 - SFX_Headers_08) / 3
+ call PlaySound ; play sound effect
+ ld a,BLOCKBALL_ANIM
+ ld [W_ANIMATIONID],a
+ jp PlayAnimation
+
+Func_79e6a: ; 79e6a (1e:5e6a)
+ call WaitForSoundToFinish
+ ld a, [$d05b]
+ and $7f
+ ret z
+ cp $a
+ ld a, $20
+ ld b, $30
+ ld c, (SFX_08_50 - SFX_Headers_08) / 3
+ jr z, .asm_79e8b
+ ld a, $e0
+ ld b, $ff
+ ld c, (SFX_08_5a - SFX_Headers_08) / 3
+ jr nc, .asm_79e8b
+ ld a, $50
+ ld b, $1
+ ld c, (SFX_08_51 - SFX_Headers_08) / 3
+.asm_79e8b
+ ld [$c0f1], a
+ ld a, b
+ ld [$c0f2], a
+ ld a, c
+ jp PlaySound