diff options
author | U-Fish-PC\Daniel <corrnondacqb@yahoo.com> | 2014-05-22 18:13:20 -0400 |
---|---|---|
committer | U-Fish-PC\Daniel <corrnondacqb@yahoo.com> | 2014-05-22 18:13:20 -0400 |
commit | 15427f532085846ab6b51719be687951a094cb6c (patch) | |
tree | edea9b189e91641a12dd521756894df84aeeace7 /engine/battle/animations.asm | |
parent | ea3ba4cde3706b7c77efb705555ec0c86321cbe2 (diff) |
Pull a lot of engine out of main.asm
Diffstat (limited to 'engine/battle/animations.asm')
-rwxr-xr-x | engine/battle/animations.asm | 2908 |
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 |