pokered/engine/battle/animations.asm
2015-07-14 19:46:52 -07:00

2960 lines
60 KiB
NASM
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; 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 ; 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 GetMoveSound
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 [wd09f],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,[wcc79]
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,[wd09f] ; tileset select
add a
add a
ld hl,AnimationTilesetPointers
ld e,a
ld d,0
add hl,de
ld a,[hli]
ld [wTempTilesetNumTiles],a ; number of tiles
ld a,[hli]
ld e,a
ld a,[hl]
ld d,a ; de = address of tileset
ld hl,vSprites + $310
ld b, BANK(AnimationTileset1) ; ROM bank
ld a,[wTempTilesetNumTiles]
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 DEF(_RED)
INCBIN "gfx/red/slotmachine2.2bpp"
ENDC
IF DEF(_BLUE)
INCBIN "gfx/blue/slotmachine2.2bpp"
ENDC
IF DEF(_YELLOW)
INCBIN "gfx/yellow/slotmachine2.2bpp"
ENDC
MoveAnimation: ; 78d5e (1e:4d5e)
push hl
push de
push bc
push af
call WaitForSoundToFinish
call SetAnimationPalette
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,[W_OPTIONS]
bit 7,a
jr nz,.AnimationsDisabled
call ShareMoveAnimations
call PlayAnimation
jr .next4
.AnimationsDisabled
ld c,30
call DelayFrames
.next4
call PlayApplyingAttackAnimation ; shake the screen or flash the pic in and out (to show damage)
.AnimationFinished
call WaitForSoundToFinish
xor a
ld [W_SUBANIMSUBENTRYADDR],a
ld [wd09b],a
ld [W_SUBANIMTRANSFORM],a
dec a
ld [wAnimSoundID],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
; opponents 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
PlayApplyingAttackAnimation: ; 78dbd (1e:4dbd)
; Generic animation that shows after the move's individual animation
; Different animation depending on whether the move has an additional effect and on whose turn it is
ld a,[wAnimationType]
and a
ret z
dec a
add a
ld c,a
ld b,0
ld hl,AnimationTypePointerTable
add hl,bc
ld a,[hli]
ld h,[hl]
ld l,a
jp [hl]
AnimationTypePointerTable: ; 78dcf (1e:4dcf)
dw ShakeScreenVertically ; enemy mon has used a damaging move without a side effect
dw ShakeScreenHorizontallyHeavy ; enemy mon has used a damaging move with a side effect
dw ShakeScreenHorizontallySlow ; enemy mon has used a non-damaging move
dw BlinkEnemyMonSprite ; player mon has used a damaging move without a side effect
dw ShakeScreenHorizontallyLight ; player mon has used a damaging move with a side effect
dw ShakeScreenHorizontallySlow2 ; player mon has used a non-damaging move
ShakeScreenVertically: ; 78ddb (1e:4ddb)
call PlayApplyingAttackSound
ld b, $8
jp AnimationShakeScreenVertically
ShakeScreenHorizontallyHeavy: ; 78de3 (1e:4de3)
call PlayApplyingAttackSound
ld b, $8
jp AnimationShakeScreenHorizontallyFast
ShakeScreenHorizontallySlow: ; 78deb (1e:4deb)
ld bc, $602
jr AnimationShakeScreenHorizontallySlow
BlinkEnemyMonSprite: ; 78df0 (1e:4df0)
call PlayApplyingAttackSound
jp AnimationBlinkEnemyMon
ShakeScreenHorizontallyLight: ; 78df6 (1e:4df6)
call PlayApplyingAttackSound
ld b, $2
jp AnimationShakeScreenHorizontallyFast
ShakeScreenHorizontallySlow2: ; 78dfe (1e:4dfe)
ld bc, $302
AnimationShakeScreenHorizontallySlow: ; 78e01 (1e:4e01)
push bc
push bc
.asm_78e03
ld a, [rWX]
inc a
ld [rWX], a
ld c, 2
call DelayFrames
dec b
jr nz, .asm_78e03
pop bc
.asm_78e11
ld a, [rWX]
dec a
ld [rWX], a
ld c, 2
call DelayFrames
dec b
jr nz, .asm_78e11
pop bc
dec c
jr nz, AnimationShakeScreenHorizontallySlow
ret
SetAnimationPalette: ; 78e23 (1e:4e23)
ld a, [wOnSGB]
and a
ld a, $e4
jr z, .asm_78e47
ld a, $f0
ld [wcc79], a
ld b, $e4
ld a, [W_ANIMATIONID]
cp TRADE_BALL_DROP_ANIM
jr c, .asm_78e3f
cp TRADE_BALL_POOF_ANIM + 1
jr nc, .asm_78e3f
ld b, $f0
.asm_78e3f
ld a, b
ld [rOBP0], a
ld a, $6c
ld [rOBP1], a
ret
.asm_78e47
ld a, $e4
ld [wcc79], a
ld [rOBP0], a
ld a, $6c
ld [rOBP1], a
ret
PlaySubanimation: ; 78e53 (1e:4e53)
ld a,[wAnimSoundID]
cp a,$FF
jr z,.skipPlayingSound
call GetMoveSound
call PlaySound
.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 ; 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 ClearSprites
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 TailWhipAnimationUnused
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 TRADE_BALL_DROP_ANIM
dw TradeHidePokemon
db TRADE_BALL_SHAKE_ANIM
dw TradeShakePokeball
db TRADE_BALL_TILT_ANIM
dw TradeJumpPokeball
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,[wcf91]
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
.skipPlayingSound
ld a,[W_ISINBATTLE]
cp a,02 ; is it a trainer battle?
jr z,.isTrainerBattle
ld a,[wd11e]
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
hlCoord 17, 0
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
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,[wWhichTrade] ; number of shakes
dec a ; decrement number of shakes
ld [wWhichTrade],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
predef PredefShakeScreenHorizontally ; shake horizontally
ld b,1
predef_jump PredefShakeScreenVertically ; 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
hlCoord 1, 5
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
; unused
FlashScreenUnused: ; 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
TradeHidePokemon: ; 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
TradeShakePokeball: ; 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
BallMoveDistances1: ; 79078 (1e:5078)
db -12,-12,-8
db $ff ; terminator
; function to make the pokeball jump up
TradeJumpPokeball: ; 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,[hSCX] ; background scroll X
sub a,8 ; scroll to the left
ld [hSCX],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,wOAMBuffer + $10
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
TailWhipAnimationUnused: ; 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 [wd08a],a
ld a,[wOnSGB] ; 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,[wd08a]
dec a
ld [wd08a],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,[wd08a]
cp a,4 ; never true since [wd08a] 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 SetAnimationBGPalette
AnimationDarkenMonPalette: ; 791db (1e:51db)
; Darkens the mon sprite's palette.
ld bc, $f9f4
jr SetAnimationBGPalette
AnimationUnusedPalette1: ; 791e0 (1e:51e0)
ld bc, $fef8
jr SetAnimationBGPalette
AnimationUnusedPalette2: ; 791e5 (1e:51e5)
ld bc, $ffff
jr SetAnimationBGPalette
AnimationResetScreenPalette: ; 791ea (1e:51ea)
; Restores the screen's palette to the normal palette.
ld bc, $e4e4
jr SetAnimationBGPalette
AnimationUnusedPalette3: ; 791ef (1e:51ef)
ld bc, $0000
jr SetAnimationBGPalette
AnimationLightScreenPalette: ; 791f4 (1e:51f4)
; Changes the screen to use a palette with light colors.
ld bc, $9090
jr SetAnimationBGPalette
AnimationUnusedPalette4: ; 791f9 (1e:51f9)
ld bc, $4040
SetAnimationBGPalette: ; 791fc (1e:51fc)
ld a, [wOnSGB]
and a
ld a, b
jr z, .asm_79204
ld a, c
.asm_79204
ld [rBGP], a
ret
ld b, $5
AnimationShakeScreenVertically: ; 79209 (1e:5209)
predef_jump PredefShakeScreenVertically
AnimationShakeScreen: ; 7920e (1e:520e)
; Shakes the screen for a while. Used in Earthquake/Fissure/etc. animations.
ld b, $8
AnimationShakeScreenHorizontallyFast: ; 79210 (1e:5210)
predef_jump PredefShakeScreenHorizontally
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 [wd09f], a
call LoadAnimationTileset
ld d, $20
ld a, $f0
ld [W_BASECOORDX], a
ld a, $71
ld [wd09f], a
.asm_79228
ld a, $10
ld [W_BASECOORDY], a
ld a, $0
ld [wd08a], a
call _AnimationWaterDroplets
ld a, $18
ld [W_BASECOORDY], a
ld a, $20
ld [wd08a], a
call _AnimationWaterDroplets
dec d
jr nz, .asm_79228
ret
_AnimationWaterDroplets: ; 79246 (1e:5246)
ld hl, wOAMBuffer
.asm_79249
ld a, [W_BASECOORDY]
ld [hli], a
ld a, [W_BASECOORDX]
add $1b
ld [W_BASECOORDX], a
ld [hli], a
ld a, [wd09f]
ld [hli], a
xor a
ld [hli], a
ld a, [W_BASECOORDX]
cp $90
jr c, .asm_79249
sub $a8
ld [W_BASECOORDX], a
ld a, [W_BASECOORDY]
add $10
ld [W_BASECOORDY], a
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
hlCoord 1, 6
deCoord 1, 5
ld a, $30
jr z, .asm_79291
hlCoord 12, 1
deCoord 12, 0
ld a, $ff
.asm_79291
ld [wd09f], a
jp _AnimationSlideMonUp
AnimationSlideMonDown: ; 79297 (1e:5297)
; Slides the mon's sprite down out of the screen.
xor a
call GetTileIDList
.asm_7929b
call GetMonSpriteTileMapPointerFromRowCount
push bc
push de
call CopyPicTiles
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
jp AnimationSlideMonLeft
AnimationSlideEnemyMonOut: ; 792b9 (1e:52b9)
; Slides the enemy mon out of the screen horizontally.
ld hl, AnimationSlideMonOut
jp CallWithTurnFlipped
_AnimationSlideMonUp: ; 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, SCREEN_WIDTH * 2
add hl, bc
pop bc
dec b
jr nz, .asm_792c4
ld a, [H_WHOSETURN]
and a
hlCoord 1, 11
jr z, .asm_792e2
hlCoord 12, 6
.asm_792e2
ld a, [wd09f]
inc a
ld [wd09f], 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, _AnimationSlideMonUp
ret
_AnimationShakeEnemyHUD: ; 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 Animations_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
Animations_79329: ; 79329 (1e:5329)
ld a, e
add $8
ld e, a
ld [hli], a
ld a, [W_BASECOORDX]
ld [hli], a
ld a, d
ld [hli], a
xor a
ld [hli], a
ret
AdjustOAMBlockXPos: ; 79337 (1e:5337)
ld l, e
ld h, d
AdjustOAMBlockXPos2: ; 79339 (1e:5339)
ld de, $4
.loop
ld a, [wd08a]
ld b, a
ld a, [hl]
add b
cp $a8
jr c, .skipPuttingEntryOffScreen
dec hl
ld a, $a0
ld [hli], a
.skipPuttingEntryOffScreen
ld [hl], a
add hl, de
dec c
jr nz, .loop
ret
AdjustOAMBlockYPos: ; 79350 (1e:5350)
ld l, e
ld h, d
AdjustOAMBlockYPos2: ; 79352 (1e:5352)
ld de, $4
.loop
ld a, [wd08a]
ld b, a
ld a, [hl]
add b
cp $70
jr c, .skipSettingPreviousEntrysAttribute
dec hl
ld a, $a0 ; bug, sets previous OAM entry's attribute
ld [hli], a
.skipSettingPreviousEntrysAttribute
ld [hl], a
add hl, de
dec c
jr nz, .loop
ret
AnimationBlinkEnemyMon: ; 79369 (1e:5369)
; Make the enemy mon's sprite blink on and off for a second or two
ld hl, AnimationBlinkMon
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, [wBattleMonSpecies]
ld [wHPBarMaxHP + 1], a
ld a, [wEnemyMonSpecies]
ld [wHPBarMaxHP], 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 GetTileIDList
call GetMonSpriteTileMapPointerFromRowCount
call CopyPicTiles
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
hlCoord 0, 5
deCoord 2, 5
jr z, .asm_793c2
hlCoord 11, 0
deCoord 13, 0
.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 GetTileIDList
pop hl
call CopyPicTiles
call Delay3
pop hl
ld bc, $0709
call ClearScreenArea
pop af
call GetTileIDList
pop hl
call CopyPicTiles
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]
and a
hlCoord 2, 5
jr z, .asm_79407
hlCoord 11, 0
.asm_79407
xor a
push hl
call GetTileIDList
pop hl
call CopyPicTiles
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]
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]
and a
jr z, .asm_79435
ld a, $d8
ld [wd08a], a
ld a, $50
ld [W_SUBANIMTRANSFORM], a
jr .asm_7943c
.asm_79435
xor a
ld [wd08a], a
ld [W_SUBANIMTRANSFORM], a
.asm_7943c
ld d, $7a
ld c, $3
xor a
call Func_797e8
ld hl, SpiralBallAnimationCoordinates
.asm_79447
push hl
ld c, $3
ld de, wOAMBuffer
.asm_7944d
ld a, [hl]
cp $ff
jr z, .asm_7946f
ld a, [wd08a]
add [hl]
ld [de], a
inc de
inc hl
ld a, [W_SUBANIMTRANSFORM]
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]
and a
jr z, .asm_794b1
hlCoord 16, 0
deCoord 14, 0
jr .asm_794b7
.asm_794b1
hlCoord 5, 5
deCoord 3, 5
.asm_794b7
push de
xor a
ld [wd09f], a
call _AnimationSquishMonPic
pop hl
ld a, $1
ld [wd09f], a
call _AnimationSquishMonPic
pop bc
dec c
jr nz, .asm_794a3
call AnimationHideMonPic
ld c, $2
jp DelayFrame
_AnimationSquishMonPic: ; 794d4 (1e:54d4)
ld c, $7
.asm_794d6
push bc
push hl
ld c, $3
ld a, [wd09f]
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], " "
pop hl
ld de, SCREEN_WIDTH
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]
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
ld a, c
ld [W_BASECOORDX], a
ld bc, $501
call _AnimationShootBallsUpward
jp AnimationCleanOAM
_AnimationShootBallsUpward: ; 79517 (1e:5517)
push bc
xor a
ld [wd09f], a
call LoadAnimationTileset
pop bc
ld d, $7a
ld hl, wOAMBuffer
push bc
ld a, [W_BASECOORDY]
ld e, a
.asm_7952a
call Animations_79329
dec b
jr nz, .asm_7952a
call DelayFrame
pop bc
ld a, b
ld [wd08a], a
.asm_79538
push bc
ld hl, wOAMBuffer
.asm_7953c
ld a, [W_BASECOORDY]
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, [wd08a]
dec a
ld [wd08a], a
.asm_79554
ld de, $4
add hl, de
dec b
jr nz, .asm_7953c
call DelayFrames
pop bc
ld a, [wd08a]
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 _AnimationShootBallsUpward
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, wTempPic
push hl
xor a
ld bc, $310
call FillMemory
pop hl
ld de, $194
add hl, de
ld de, MinimizedMonSprite
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 GetTileIDList
call GetMonSpriteTileMapPointerFromRowCount
call CopyPicTiles
ld c, 8
call DelayFrames
pop af
inc a
pop bc
dec c
jr nz, .asm_795cd
call AnimationHideMonPic
ld hl, wTempPic
ld bc, $0310
xor a
call FillMemory
jp Func_79652
AnimationSlideMonLeft: ; 795f8 (1e:55f8)
ld a, [H_WHOSETURN]
and a
jr z, .asm_79602
hlCoord 12, 0
jr .asm_79605
.asm_79602
hlCoord 0, 5
.asm_79605
ld d, $8
.asm_79607
push hl
ld b, $7
.asm_7960a
ld c, $8
.asm_7960c
ld a, [H_WHOSETURN]
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]
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 AnimationSlideMonLeft
jp Delay3
Func_79652: ; 79652 (1e:5652)
ld a, [H_WHOSETURN]
and a
ld hl, vBackPic
jr z, .asm_7965d
ld hl, vFrontPic
.asm_7965d
ld de, wTempPic
ld bc, 7 * 7
jp CopyVideoData
AnimationWavyScreen: ; 79666 (1e:5666)
; used in Psywave/Psychic etc.
ld hl, vBGMap0
call Func_79e0d
call Delay3
xor a
ld [H_AUTOBGTRANSFERENABLED], a
ld a, $90
ld [hWY], a
ld d, $80
ld e, $8f
ld c, $ff
ld hl, WavyScreenLineOffsets
.asm_7967f
push hl
.asm_79680
call Func_796ae
ld a, [rLY]
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 [hWY], a
call SaveScreenTilesToBuffer2
call ClearScreen
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a
call Delay3
call LoadScreenTilesFromBuffer2
ld hl, vBGMap1
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, wTempPic
xor a
ld bc, $0310
call FillMemory
ld a, [$fff3]
and a
jr z, .asm_79715
ld hl, SlowbroSprite ; facing down sprite
ld de, wTempPic + $120
call CopySlowbroSpriteData
ld hl, SlowbroSprite + $10
ld de, wTempPic + $120 + $70
call CopySlowbroSpriteData
ld hl, SlowbroSprite + $20
ld de, wTempPic + $120 + $10
call CopySlowbroSpriteData
ld hl, SlowbroSprite + $30
ld de, wTempPic + $120 + $10 + $70
call CopySlowbroSpriteData
jr .asm_79739
.asm_79715
ld hl, SlowbroSprite + $40 ; facing up sprite
ld de, wTempPic + $120 + $70
call CopySlowbroSpriteData
ld hl, SlowbroSprite + $50
ld de, wTempPic + $120 + $e0
call CopySlowbroSpriteData
ld hl, SlowbroSprite + $60
ld de, wTempPic + $120 + $80
call CopySlowbroSpriteData
ld hl, SlowbroSprite + $70
ld de, wTempPic + $120 + $f0
call CopySlowbroSpriteData
.asm_79739
call Func_79652
jp AnimationShowMonPic
CopySlowbroSpriteData: ; 7973f (1e:573f)
ld bc, $0010
ld a, BANK(SlowbroSprite)
jp FarCopyData2
HideSubstituteShowMonAnim: ; 79747 (1e:5747)
ld a, [H_WHOSETURN]
and a
ld hl, wPlayerMonMinimized
ld a, [W_PLAYERBATTSTATUS2]
jr z, .next1
ld hl, wEnemyMonMinimized
ld a, [W_ENEMYBATTSTATUS2]
.next1
push hl
; if the substitute broke, slide it down, else slide it offscreen horizontally
bit HasSubstituteUp, a
jr nz, .substituteStillUp
call AnimationSlideMonDown
jr .next2
.substituteStillUp
call AnimationSlideMonOut
.next2
pop hl
ld a, [hl]
and a
jp nz, AnimationMinimizeMon
call AnimationFlashMonPic
jp AnimationShowMonPic
ReshowSubstituteAnim: ; 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
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, [wEnemyMonSpecies]
ld [wHPBarMaxHP + 1], a
ld a, [wBattleMonSpecies]
ld [wHPBarMaxHP], a
Func_79793: ; 79793 (1e:5793)
ld a, [H_WHOSETURN]
and a
jr z, .asm_797b0
ld a, [wHPBarMaxHP]
ld [wcf91], a
ld [wd0b5], a
xor a
ld [W_SPRITEFLIPPED], a
call GetMonHeader
hlCoord 12, 0
call LoadFrontSpriteByMonIndex
jr .asm_797d3
.asm_797b0
ld a, [wBattleMonSpecies2]
push af
ld a, [wHPBarMaxHP + 1]
ld [wBattleMonSpecies2], a
ld [wd0b5], a
call GetMonHeader
predef LoadMonBackPic
xor a
call GetTileIDList
call GetMonSpriteTileMapPointerFromRowCount
call CopyPicTiles
pop af
ld [wBattleMonSpecies2], 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
ld hl, AnimationHideMonPic
call CallWithTurnFlipped
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a
jp Delay3
Func_797e8: ; 797e8 (1e:57e8)
push bc
push de
ld [wd09f], a
call LoadAnimationTileset
pop de
pop bc
xor a
ld e, a
ld [W_BASECOORDX], a
ld hl, wOAMBuffer
.asm_797fa
call Animations_79329
dec c
jr nz, .asm_797fa
ret
AnimationHideMonPic: ; 79801 (1e:5801)
; Hides the mon's sprite.
ld a, [H_WHOSETURN]
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
hlCoord 0, 0
add hl, de
ld bc, $707
call ClearScreenArea
pop bc
pop de
pop hl
ret
; puts the tile map destination address of a mon sprite in hl, given the row count in b
; The usual row count is 7, but it may be smaller when sliding a mon sprite in/out,
; in order to show only a portion of the mon sprite.
GetMonSpriteTileMapPointerFromRowCount: ; 79820 (1e:5820)
push de
ld a, [H_WHOSETURN]
and a
jr nz, .enemyTurn
ld a, 20 * 5 + 1
jr .next
.enemyTurn
ld a, 12
.next
hlCoord 0, 0
ld e, a
ld d, 0
add hl, de
ld a, 7
sub b
and a
jr z, .done
ld de, 20
.loop
add hl, de
dec a
jr nz, .loop
.done
pop de
ret
; Input:
; a = tile ID list index
; Output:
; de = tile ID list pointer
; b = number of rows
; c = number of columns
GetTileIDList: ; 79842 (1e:5842)
ld hl, TileIDListPointerTable
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
; get the sound of the move id in b
GetMoveSoundB: ; 79869 (1e:5869)
ld a, b
call GetMoveSound
ld b, a
ret
; get the sound of the move id in a
GetMoveSound: ; 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,[wBattleMonSpecies] ; get number of current monster
jr .Continue
.next
ld a,[wEnemyMonSpecies]
.Continue
push hl
call GetCryData
ld b,a
pop hl
ld a,[wc0f1]
add [hl]
ld [wc0f1],a
inc hl
ld a,[wc0f2]
add [hl]
ld [wc0f2],a
jr .done
.NotCryMove
ld a,[hli]
ld [wc0f1],a
ld a,[hli]
ld [wc0f2],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 (SFX_08_4a - SFX_Headers_08) / 3,$00,$80
db (SFX_08_4c - SFX_Headers_08) / 3,$10,$80
db (SFX_08_5d - SFX_Headers_08) / 3,$00,$80
db (SFX_08_4b - SFX_Headers_08) / 3,$01,$80
db (SFX_08_4d - SFX_Headers_08) / 3,$00,$40
db (SFX_08_77 - SFX_Headers_08) / 3,$00,$ff
db (SFX_08_4d - SFX_Headers_08) / 3,$10,$60
db (SFX_08_4d - SFX_Headers_08) / 3,$20,$80
db (SFX_08_4d - SFX_Headers_08) / 3,$00,$a0
db (SFX_08_50 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_4f - SFX_Headers_08) / 3,$20,$40
db (SFX_08_4f - SFX_Headers_08) / 3,$00,$80
db (SFX_08_4e - SFX_Headers_08) / 3,$00,$a0
db (SFX_08_51 - SFX_Headers_08) / 3,$10,$c0
db (SFX_08_51 - SFX_Headers_08) / 3,$00,$a0
db (SFX_08_52 - SFX_Headers_08) / 3,$00,$c0
db (SFX_08_52 - SFX_Headers_08) / 3,$10,$a0
db (SFX_08_53 - SFX_Headers_08) / 3,$00,$e0
db (SFX_08_51 - SFX_Headers_08) / 3,$20,$c0
db (SFX_08_54 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_62 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_55 - SFX_Headers_08) / 3,$01,$80
db (SFX_08_60 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_57 - SFX_Headers_08) / 3,$f0,$40
db (SFX_08_5a - SFX_Headers_08) / 3,$00,$80
db (SFX_08_57 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_61 - SFX_Headers_08) / 3,$10,$80
db (SFX_08_5b - SFX_Headers_08) / 3,$01,$a0
db (SFX_08_58 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_5e - SFX_Headers_08) / 3,$00,$60
db (SFX_08_5e - SFX_Headers_08) / 3,$01,$40
db (SFX_08_5f - SFX_Headers_08) / 3,$00,$a0
db (SFX_08_5a - SFX_Headers_08) / 3,$10,$a0
db (SFX_08_60 - SFX_Headers_08) / 3,$00,$c0
db (SFX_08_54 - SFX_Headers_08) / 3,$10,$60
db (SFX_08_5a - SFX_Headers_08) / 3,$00,$a0
db (SFX_08_62 - SFX_Headers_08) / 3,$11,$c0
db (SFX_08_5a - SFX_Headers_08) / 3,$20,$c0
db (SFX_08_61 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_5b - SFX_Headers_08) / 3,$00,$80
db (SFX_08_5b - SFX_Headers_08) / 3,$20,$c0
db (SFX_08_59 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_71 - SFX_Headers_08) / 3,$ff,$40
db (SFX_08_5e - SFX_Headers_08) / 3,$00,$80
db (SFX_08_4b - SFX_Headers_08) / 3,$00,$c0
db (SFX_08_4b - SFX_Headers_08) / 3,$00,$40
db (SFX_08_75 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_67 - SFX_Headers_08) / 3,$40,$60
db (SFX_08_67 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_67 - SFX_Headers_08) / 3,$ff,$40
db (SFX_08_6a - SFX_Headers_08) / 3,$80,$c0
db (SFX_08_59 - SFX_Headers_08) / 3,$10,$a0
db (SFX_08_59 - SFX_Headers_08) / 3,$21,$e0
db (SFX_08_69 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_64 - SFX_Headers_08) / 3,$20,$60
db (SFX_08_6a - SFX_Headers_08) / 3,$00,$80
db (SFX_08_6c - SFX_Headers_08) / 3,$00,$80
db (SFX_08_68 - SFX_Headers_08) / 3,$40,$80
db (SFX_08_69 - SFX_Headers_08) / 3,$f0,$e0
db (SFX_08_6d - SFX_Headers_08) / 3,$00,$80
db (SFX_08_6a - SFX_Headers_08) / 3,$f0,$60
db (SFX_08_68 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_76 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_47 - SFX_Headers_08) / 3,$01,$a0
db (SFX_08_53 - SFX_Headers_08) / 3,$f0,$20
db (SFX_08_63 - SFX_Headers_08) / 3,$01,$c0
db (SFX_08_63 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_5a - SFX_Headers_08) / 3,$00,$e0
db (SFX_08_66 - SFX_Headers_08) / 3,$01,$60
db (SFX_08_66 - SFX_Headers_08) / 3,$20,$40
db (SFX_08_64 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_64 - SFX_Headers_08) / 3,$40,$c0
db (SFX_08_5b - SFX_Headers_08) / 3,$03,$60
db (SFX_08_65 - SFX_Headers_08) / 3,$11,$e0
db (SFX_08_52 - SFX_Headers_08) / 3,$20,$e0
db (SFX_08_6e - SFX_Headers_08) / 3,$00,$80
db (SFX_08_5c - SFX_Headers_08) / 3,$00,$80
db (SFX_08_5c - SFX_Headers_08) / 3,$11,$a0
db (SFX_08_5c - SFX_Headers_08) / 3,$01,$c0
db (SFX_08_53 - SFX_Headers_08) / 3,$14,$c0
db (SFX_08_5b - SFX_Headers_08) / 3,$02,$a0
db (SFX_08_69 - SFX_Headers_08) / 3,$f0,$80
db (SFX_08_69 - SFX_Headers_08) / 3,$20,$c0
db (SFX_08_6f - SFX_Headers_08) / 3,$00,$20
db (SFX_08_6f - SFX_Headers_08) / 3,$20,$80
db (SFX_08_6e - SFX_Headers_08) / 3,$12,$60
db (SFX_08_66 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_54 - SFX_Headers_08) / 3,$01,$e0
db (SFX_08_69 - SFX_Headers_08) / 3,$0f,$e0
db (SFX_08_69 - SFX_Headers_08) / 3,$11,$20
db (SFX_08_50 - SFX_Headers_08) / 3,$10,$40
db (SFX_08_4f - SFX_Headers_08) / 3,$10,$c0
db (SFX_08_54 - SFX_Headers_08) / 3,$00,$20
db (SFX_08_70 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_75 - SFX_Headers_08) / 3,$11,$18
db (SFX_08_49 - SFX_Headers_08) / 3,$20,$c0
db (SFX_08_48 - SFX_Headers_08) / 3,$20,$c0
db (SFX_08_65 - SFX_Headers_08) / 3,$00,$10
db (SFX_08_66 - SFX_Headers_08) / 3,$f0,$20
db (SFX_08_73 - SFX_Headers_08) / 3,$f0,$c0
db (SFX_08_51 - SFX_Headers_08) / 3,$f0,$e0
db (SFX_08_49 - SFX_Headers_08) / 3,$f0,$40
db (SFX_08_71 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_73 - SFX_Headers_08) / 3,$80,$40
db (SFX_08_73 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_54 - SFX_Headers_08) / 3,$11,$20
db (SFX_08_54 - SFX_Headers_08) / 3,$22,$10
db (SFX_08_5b - SFX_Headers_08) / 3,$f1,$ff
db (SFX_08_53 - SFX_Headers_08) / 3,$f1,$ff
db (SFX_08_54 - SFX_Headers_08) / 3,$33,$30
db (SFX_08_72 - SFX_Headers_08) / 3,$40,$c0
db (SFX_08_4e - SFX_Headers_08) / 3,$20,$20
db (SFX_08_4e - SFX_Headers_08) / 3,$f0,$10
db (SFX_08_4f - SFX_Headers_08) / 3,$f8,$10
db (SFX_08_51 - SFX_Headers_08) / 3,$f0,$10
db (SFX_08_65 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_58 - SFX_Headers_08) / 3,$00,$c0
db (SFX_08_72 - SFX_Headers_08) / 3,$c0,$ff
db (SFX_08_49 - SFX_Headers_08) / 3,$f2,$20
db (SFX_08_74 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_74 - SFX_Headers_08) / 3,$00,$40
db (SFX_08_49 - SFX_Headers_08) / 3,$00,$40
db (SFX_08_51 - SFX_Headers_08) / 3,$10,$ff
db (SFX_08_6a - SFX_Headers_08) / 3,$20,$20
db (SFX_08_72 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_69 - SFX_Headers_08) / 3,$1f,$20
db (SFX_08_65 - SFX_Headers_08) / 3,$2f,$80
db (SFX_08_4f - SFX_Headers_08) / 3,$1f,$ff
db (SFX_08_6b - SFX_Headers_08) / 3,$1f,$60
db (SFX_08_66 - SFX_Headers_08) / 3,$1e,$20
db (SFX_08_66 - SFX_Headers_08) / 3,$1f,$18
db (SFX_08_54 - SFX_Headers_08) / 3,$0f,$80
db (SFX_08_49 - SFX_Headers_08) / 3,$f8,$10
db (SFX_08_48 - SFX_Headers_08) / 3,$18,$20
db (SFX_08_72 - SFX_Headers_08) / 3,$08,$40
db (SFX_08_57 - SFX_Headers_08) / 3,$01,$e0
db (SFX_08_51 - SFX_Headers_08) / 3,$09,$ff
db (SFX_08_75 - SFX_Headers_08) / 3,$42,$01
db (SFX_08_5c - SFX_Headers_08) / 3,$00,$ff
db (SFX_08_72 - SFX_Headers_08) / 3,$08,$e0
db (SFX_08_64 - SFX_Headers_08) / 3,$00,$80
db (SFX_08_49 - SFX_Headers_08) / 3,$88,$10
db (SFX_08_65 - SFX_Headers_08) / 3,$48,$ff
db (SFX_08_48 - SFX_Headers_08) / 3,$ff,$ff
db (SFX_08_64 - SFX_Headers_08) / 3,$ff,$10
db (SFX_08_48 - SFX_Headers_08) / 3,$ff,$04
db (SFX_08_5c - SFX_Headers_08) / 3,$01,$ff
db (SFX_08_53 - SFX_Headers_08) / 3,$f8,$ff
db (SFX_08_4c - SFX_Headers_08) / 3,$f0,$f0
db (SFX_08_4f - SFX_Headers_08) / 3,$08,$10
db (SFX_08_4d - SFX_Headers_08) / 3,$f0,$ff
db (SFX_08_5a - SFX_Headers_08) / 3,$f0,$ff
db (SFX_08_74 - SFX_Headers_08) / 3,$10,$ff
db (SFX_08_4e - SFX_Headers_08) / 3,$f0,$20
db (SFX_08_6b - SFX_Headers_08) / 3,$f0,$60
db (SFX_08_61 - SFX_Headers_08) / 3,$12,$10
db (SFX_08_76 - SFX_Headers_08) / 3,$f0,$20
db (SFX_08_5e - SFX_Headers_08) / 3,$12,$ff
db (SFX_08_71 - SFX_Headers_08) / 3,$80,$04
db (SFX_08_73 - SFX_Headers_08) / 3,$f0,$10
db (SFX_08_69 - SFX_Headers_08) / 3,$f8,$ff
db (SFX_08_66 - SFX_Headers_08) / 3,$f0,$ff
db (SFX_08_51 - SFX_Headers_08) / 3,$01,$ff
db (SFX_08_6c - SFX_Headers_08) / 3,$d8,$04
db (SFX_08_4b - SFX_Headers_08) / 3,$00,$80
db (SFX_08_4b - SFX_Headers_08) / 3,$00,$80
CopyPicTiles: ; 79aae (1e:5aae)
ld a, [H_WHOSETURN]
and a
ld a, $31 ; base tile ID of player mon sprite
jr z, .asm_79ab6
; enemy turn
xor a ; base tile ID of enemy mon sprite
.asm_79ab6
ld [hBaseTileID], a
jr asm_79acb
; copy the tiles used when a mon is being sent out
; and "growing" out of the pokeball
CopyGrowingMonTiles: ; 79aba (1e:5aba)
call GetPredefRegisters
ld a, [wcd6c]
and a
jr nz, .asm_79ac8
ld de, Unknown_79b02 ; 5x5
jr asm_79acb
.asm_79ac8
ld de, Unknown_79b1b ; 3x3
asm_79acb: ; 79acb (1e:5acb)
xor a
ld [H_AUTOBGTRANSFERENABLED], a
; b = number of rows
; c = number of columns
CopyTileIDs: ; 79ace (1e:5ace)
push hl
.rowLoop
push bc
push hl
ld a, [hBaseTileID]
ld b, a
.columnLoop
ld a, [de]
add b
inc de
ld [hli], a
dec c
jr nz, .columnLoop
pop hl
ld bc, 20
add hl, bc
pop bc
dec b
jr nz, .rowLoop
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a
pop hl
ret
TileIDListPointerTable: ; 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
db $32,$39,$47,$55,$5C
db $34,$3B,$49,$57,$5E
db $36,$3D,$4B,$59,$60
db $37,$3E,$4C,$5A,$61
Unknown_79b1b: ; 79b1b (1e:5b1b)
db $31,$46,$5B
db $34,$49,$5E
db $37,$4C,$61
Unknown_79b24: ; 79b24 (1e:5b24)
db $00,$07,$0E,$15,$1C,$23,$2A
db $01,$08,$0F,$16,$1D,$24,$2B
db $02,$09,$10,$17,$1E,$25,$2C
db $03,$0A,$11,$18,$1F,$26,$2D
db $04,$0B,$12,$19,$20,$27,$2E
db $05,$0C,$13,$1A,$21,$28,$2F
db $06,$0D,$14,$1B,$22,$29,$30
Unknown_79b55: ; 79b55 (1e:5b55)
db $00,$07,$0E,$15,$1C,$23,$2A
db $01,$08,$0F,$16,$1D,$24,$2B
db $03,$0A,$11,$18,$1F,$26,$2D
db $04,$0B,$12,$19,$20,$27,$2E
db $05,$0C,$13,$1A,$21,$28,$2F
Unknown_79b78: ; 79b78 (1e:5b78)
db $00,$07,$0E,$15,$1C,$23,$2A
db $02,$09,$10,$17,$1E,$25,$2C
db $04,$0B,$12,$19,$20,$27,$2E
Unknown_79b8d: ; 79b8d (1e:5b8d)
db $00,$00,$00,$00,$00,$00,$00
db $00,$00,$00,$00,$00,$19,$00
db $02,$06,$0B,$10,$14,$1A,$00
db $00,$07,$0C,$11,$15,$1B,$00
db $03,$08,$0D,$12,$16,$1C,$00
db $04,$09,$0E,$13,$17,$1D,$1F
db $05,$0A,$0F,$01,$18,$1E,$20
Unknown_79bbe: ; 79bbe (1e:5bbe)
db $00,$00,$00,$30,$00,$37,$00
db $00,$00,$2B,$31,$34,$38,$3D
db $21,$26,$2C,$01,$35,$39,$3E
db $22,$27,$2D,$32,$36,$01,$00
db $23,$28,$2E,$33,$01,$3A,$00
db $24,$29,$2F,$01,$01,$3B,$00
db $25,$2A,$01,$01,$01,$3C,$00
Unknown_79bef: ; 79bef (1e:5bef)
db $00,$00,$00,$00,$00,$00,$00
db $00,$00,$47,$4D,$00,$00,$00
db $00,$00,$48,$4E,$52,$56,$5B
db $3F,$43,$49,$4F,$53,$57,$5C
db $40,$44,$4A,$50,$54,$58,$00
db $41,$45,$4B,$51,$4C,$59,$5D
db $42,$46,$4C,$4C,$55,$5A,$5E
Unknown_79c20: ; 79c20 (1e:5c20)
db $31,$32,$32,$32,$32,$33
db $34,$35,$36,$36,$37,$38
db $34,$39,$3A,$3A,$3B,$38
db $3C,$3D,$3E,$3E,$3F,$40
db $41,$42,$43,$43,$44,$45
db $46,$47,$43,$48,$49,$4A
db $41,$43,$4B,$4C,$4D,$4E
db $4F,$50,$50,$50,$51,$52
Unknown_79c50: ; 79c50 (1e:5c50)
db $43,$55,$56,$53,$53,$53,$53,$53,$53,$53,$53,$53
db $43,$57,$58,$54,$54,$54,$54,$54,$54,$54,$54,$54
db $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, [rOBP0]
push af
ld a, [wcc79]
ld [rOBP0], a
ld d, $37
ld a, $3
ld [W_SUBANIMTRANSFORM], a
call Func_79c97
pop af
ld [rOBP0], 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 ClearSprites
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 [wd08a], 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, [wd08a]
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, [wd08a]
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, [wd08a]
inc a
ld b, a
and $7f
cp $9
ld a, b
jr nz, .asm_79d26
and $80
xor $80
.asm_79d26
ld [wd08a], a
ret
Func_79d2a: ; 79d2a (1e:5d2a)
ld hl, wOAMBuffer + $01
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, vBackPic
ld hl, vSprites
ld bc, 7 * 7
call CopyVideoData
xor a
ld [hSCX], a
ld hl, vBGMap0
call Func_79e0d
ld a, $90
ld [hWY], a
ld hl, vBGMap0 + $320
call Func_79e0d
ld a, $38
ld [hWY], a
call _AnimationShakeEnemyHUD
ld hl, vBGMap0
call Func_79e0d
call AnimationHideMonPic
call Delay3
ld de, $0208
call Func_79de9
call AnimationShowMonPic
call ClearSprites
ld a, $90
ld [hWY], a
ld hl, vBGMap1
call Func_79e0d
xor a
ld [hWY], a
call SaveScreenTilesToBuffer1
ld hl, vBGMap0
call Func_79e0d
call ClearScreen
call Delay3
call LoadScreenTilesFromBuffer1
ld hl, vBGMap1
jp Func_79e0d
; b = tile ID list index
; c = base tile ID
CopyTileIDsFromList: ; 79dda (1e:5dda)
call GetPredefRegisters
ld a, c
ld [hBaseTileID], a
ld a, b
push hl
call GetTileIDList
pop hl
jp CopyTileIDs
Func_79de9: ; 79de9 (1e:5de9)
ld a, [hSCX]
ld [wTrainerSpriteOffset], a
.asm_79dee
ld a, [wTrainerSpriteOffset]
add d
ld [hSCX], a
ld c, 2
call DelayFrames
ld a, [wTrainerSpriteOffset]
sub d
ld [hSCX], a
ld c, 2
call DelayFrames
dec e
jr nz, .asm_79dee
ld a, [wTrainerSpriteOffset]
ld [hSCX], a
ret
Func_79e0d: ; 79e0d (1e:5e0d)
ld a, h
ld [H_AUTOBGTRANSFERDEST + 1], 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,[wd11e]
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 [wWhichTrade],a
ld hl,.PokeBallAnimations
; choose which toss animation to use
ld a,[wcf91]
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,SHAKE_ANIM,POOF_ANIM,SHOWPIC_ANIM
.BlockBall ; 5E55
ld a,TOSS_ANIM
ld [W_ANIMATIONID],a
call PlayAnimation
ld a,(SFX_08_43 - SFX_Headers_08) / 3
call PlaySound
ld a,BLOCKBALL_ANIM
ld [W_ANIMATIONID],a
jp PlayAnimation
PlayApplyingAttackSound: ; 79e6a (1e:5e6a)
; play a different sound depending if move is not very effective, neutral, or super-effective
; don't play any sound at all if move is ineffective
call WaitForSoundToFinish
ld a, [wDamageMultipliers]
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 [wc0f1], a
ld a, b
ld [wc0f2], a
ld a, c
jp PlaySound