diff options
author | luckytyphlosion <alan.rj.huang@gmail.com> | 2016-03-26 19:06:42 -0400 |
---|---|---|
committer | luckytyphlosion <alan.rj.huang@gmail.com> | 2016-03-26 19:06:42 -0400 |
commit | 817729c36ac6d43129731290f3feed9db9ff65a4 (patch) | |
tree | fa8d8b01dbc590bbb7229f1f39594850692d440f | |
parent | b8d71377bf7600abd624a21599f6a60373beaf66 (diff) |
Delete animations_.asm
-rwxr-xr-x | engine/battle/animations.asm | 634 | ||||
-rw-r--r-- | engine/battle/animations_.asm | 3238 | ||||
-rwxr-xr-x | yellow/main.asm | 2 |
3 files changed, 423 insertions, 3451 deletions
diff --git a/engine/battle/animations.asm b/engine/battle/animations.asm index 00c828e6..d07e0b42 100755 --- a/engine/battle/animations.asm +++ b/engine/battle/animations.asm @@ -15,6 +15,8 @@ DrawFrameBlock: ; 78000 (1e:4000) ld a,[wFBTileCounter] inc a ld [wFBTileCounter],a + ld a, $2 + ld [wdef5], a ld a,[wSubAnimTransform] dec a jr z,.flipHorizontalAndVertical ; 1 @@ -46,6 +48,12 @@ DrawFrameBlock: ; 78000 (1e:4000) .finishCopying ; finish copying values to OAM (when [wSubAnimTransform] not 1 or 2) add [hl] ; X offset ld [de],a ; store X + cp 88 + jr c, .asm_78056 + ld a, [wdef5] + inc a + ld [wdef5], a +.asm_78056 inc hl inc de ld a,[hli] @@ -53,6 +61,9 @@ DrawFrameBlock: ; 78000 (1e:4000) ld [de],a ; store tile ID inc de ld a,[hli] + ld b, a + ld a, [wdef5] + or b ld [de],a ; store flags inc de jp .nextTile @@ -71,6 +82,12 @@ DrawFrameBlock: ; 78000 (1e:4000) ld a,168 sub b ; flip X coordinate ld [de],a ; store X + cp 88 + jr c, .asm_78087 + ld a, [wdef5] + inc a + ld [wdef5], a +.asm_78087 inc hl inc de ld a,[hli] @@ -90,7 +107,8 @@ DrawFrameBlock: ; 78000 (1e:4000) jr z,.storeFlags1 ld b,0 .storeFlags1 - ld a,b + ld a, [wdef5] + or b ld [de],a inc de jp .nextTile @@ -107,6 +125,12 @@ DrawFrameBlock: ; 78000 (1e:4000) ld a,168 sub b ; flip X coordinate ld [de],a ; store X + cp 88 + jr c, .asm_780c8 + ld a, [wdef5] + inc a + ld [wdef5], a +.asm_780c8 inc hl inc de ld a,[hli] @@ -122,6 +146,9 @@ DrawFrameBlock: ; 78000 (1e:4000) .disableHorizontalFlip res 5,a .storeFlags2 + ld b, a + ld a, [wdef5] + or b ld [de],a inc de .nextTile @@ -161,7 +188,7 @@ DrawFrameBlock: ; 78000 (1e:4000) .done ret -PlayAnimation: ; 780f1 (1e:40f1) +PlayAnimation: ; 78124 (1e:4124) xor a ld [$FF8B],a ; it looks like nothing reads this ld [wSubAnimTransform],a @@ -245,18 +272,20 @@ PlayAnimation: ; 780f1 (1e:40f1) push af ld a,[wAnimPalette] ld [rOBP0],a + call UpdateGBCPal_OBP0 call LoadAnimationTileset call LoadSubanimation call PlaySubanimation pop af ld [rOBP0],a + call UpdateGBCPal_OBP0 .nextAnimationCommand pop hl jr .animationLoop .AnimationOver ; 417B ret -LoadSubanimation: ; 7817c (1e:417c) +LoadSubanimation: ; 781b5 (1e:41b5) ld a,[wSubAnimAddrPtr + 1] ld h,a ld a,[wSubAnimAddrPtr] @@ -306,7 +335,7 @@ LoadSubanimation: ; 7817c (1e:417c) ; 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) +GetSubanimationTransform1: ; 781fb (1e:41fb) ld b,a ld a,[H_WHOSETURN] and a @@ -318,7 +347,7 @@ GetSubanimationTransform1: ; 781c2 (1e:41c2) ; 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) +GetSubanimationTransform2: ; 78203 (1e:4203) ld a,[H_WHOSETURN] and a ld a,2 << 5 @@ -327,7 +356,7 @@ GetSubanimationTransform2: ; 781ca (1e:41ca) ret ; loads tile patterns for battle animations -LoadAnimationTileset: ; 781d2 (1e:41d2) +LoadAnimationTileset: ; 7820b (1e:420b) ld a,[wWhichBattleAnimTileset] add a add a @@ -347,7 +376,7 @@ LoadAnimationTileset: ; 781d2 (1e:41d2) ld c,a ; number of tiles jp CopyVideoData ; load tileset -AnimationTilesetPointers: ; 781f2 (1e:41f2) +AnimationTilesetPointers: ; 7822b (1e:422b) db 79 ; number of tiles dw AnimationTileset1 db $FF @@ -360,16 +389,16 @@ AnimationTilesetPointers: ; 781f2 (1e:41f2) dw AnimationTileset1 db $FF -AnimationTileset1: ; 781fe (1e:41fe) +AnimationTileset1: ; 78237 (1e:4237) INCBIN "gfx/attack_anim_1.2bpp" -AnimationTileset2: ; 786ee (1e:46ee) +AnimationTileset2: ; 78757 (1e:4757) INCBIN "gfx/attack_anim_2.2bpp" -SlotMachineTiles2: ; 78bde (1e:4bde) +SlotMachineTiles2: ; 78bde (1e:4c17) INCBIN "gfx/slotmachine2.2bpp" -MoveAnimation: ; 78d5e (1e:4d5e) +MoveAnimation: ; 78d97 (1e:4d97) push hl push de push bc @@ -378,29 +407,29 @@ MoveAnimation: ; 78d5e (1e:4d5e) call SetAnimationPalette ld a,[wAnimationID] and a - jr z,.AnimationFinished + jr z, .animationFinished ; if throwing a Poké Ball, skip the regular animation code cp a,TOSS_ANIM - jr nz,.MoveAnimation - ld de,.AnimationFinished + jr nz, .moveAnimation + ld de, .animationFinished push de jp TossBallAnimation -.MoveAnimation +.moveAnimation ; check if battle animations are disabled in the options ld a,[wOptions] bit 7,a - jr nz,.AnimationsDisabled + jr nz, .animationsDisabled call ShareMoveAnimations call PlayAnimation jr .next4 -.AnimationsDisabled +.animationsDisabled ld c,30 call DelayFrames .next4 call PlayApplyingAttackAnimation ; shake the screen or flash the pic in and out (to show damage) -.AnimationFinished +.animationFinished call WaitForSoundToFinish xor a ld [wSubAnimSubEntryAddr],a @@ -414,7 +443,7 @@ MoveAnimation: ; 78d5e (1e:4d5e) pop hl ret -ShareMoveAnimations: ; 78da6 (1e:4da6) +ShareMoveAnimations: ; 78ddf (1e:4ddf) ; some moves just reuse animations from status conditions ld a,[H_WHOSETURN] and a @@ -426,18 +455,18 @@ ShareMoveAnimations: ; 78da6 (1e:4da6) cp a,AMNESIA ld b,CONF_ANIM - jr z,.Replace + jr z, .replaceAnim cp a,REST ld b,SLP_ANIM ret nz -.Replace +.replaceAnim ld a,b ld [wAnimationID],a ret -PlayApplyingAttackAnimation: ; 78dbd (1e:4dbd) +PlayApplyingAttackAnimation: ; 78df6 (1e:4df6) ; 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] @@ -454,7 +483,7 @@ PlayApplyingAttackAnimation: ; 78dbd (1e:4dbd) ld l,a jp [hl] -AnimationTypePointerTable: ; 78dcf (1e:4dcf) +AnimationTypePointerTable: ; 78e08 (1e:4e08) 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 @@ -462,33 +491,33 @@ AnimationTypePointerTable: ; 78dcf (1e:4dcf) 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) +ShakeScreenVertically: ; 78e14 (1e:4e14) call PlayApplyingAttackSound ld b, 8 jp AnimationShakeScreenVertically -ShakeScreenHorizontallyHeavy: ; 78de3 (1e:4de3) +ShakeScreenHorizontallyHeavy: ; 78e1c (1e:4e1c) call PlayApplyingAttackSound ld b, 8 jp AnimationShakeScreenHorizontallyFast -ShakeScreenHorizontallySlow: ; 78deb (1e:4deb) +ShakeScreenHorizontallySlow: ; 78e24 (1e:4e24) lb bc, 6, 2 jr AnimationShakeScreenHorizontallySlow -BlinkEnemyMonSprite: ; 78df0 (1e:4df0) +BlinkEnemyMonSprite: ; 78e29 (1e:4e29) call PlayApplyingAttackSound jp AnimationBlinkEnemyMon -ShakeScreenHorizontallyLight: ; 78df6 (1e:4df6) +ShakeScreenHorizontallyLight: ; 78e2f (1e:4e2f) call PlayApplyingAttackSound ld b, 2 jp AnimationShakeScreenHorizontallyFast -ShakeScreenHorizontallySlow2: ; 78dfe (1e:4dfe) +ShakeScreenHorizontallySlow2: ; 78e37 (1e:4e37) lb bc, 3, 2 -AnimationShakeScreenHorizontallySlow: ; 78e01 (1e:4e01) +AnimationShakeScreenHorizontallySlow: ; 78e3a (1e:4e3a) push bc push bc .loop1 @@ -513,7 +542,7 @@ AnimationShakeScreenHorizontallySlow: ; 78e01 (1e:4e01) jr nz, AnimationShakeScreenHorizontallySlow ret -SetAnimationPalette: ; 78e23 (1e:4e23) +SetAnimationPalette: ; 78e5c (1e:4e5c) ld a, [wOnSGB] and a ld a, $e4 @@ -532,6 +561,8 @@ SetAnimationPalette: ; 78e23 (1e:4e23) ld [rOBP0], a ld a, $6c ld [rOBP1], a + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 ret .notSGB ld a, $e4 @@ -539,9 +570,31 @@ SetAnimationPalette: ; 78e23 (1e:4e23) ld [rOBP0], a ld a, $6c ld [rOBP1], a + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 ret - -PlaySubanimation: ; 78e53 (1e:4e53) + +Func_78e98: ; 78e98 (1e:4e98) + call SaveScreenTilesToBuffer2 + xor a + ld [H_AUTOBGTRANSFERENABLED], a + call ClearScreen + ld h, vBGMap0 / $100 + call WriteLowerByteOfBGMapAndEnableBGTransfer + call Delay3 + xor a + ld [H_AUTOBGTRANSFERENABLED], a + call LoadScreenTilesFromBuffer2 + ld h, vBGMap1 / $100 + +WriteLowerByteOfBGMapAndEnableBGTransfer: ; 78eb1 (1e:4eb1) + ld l, vBGMap0 & $ff + call BattleAnimCopyTileMapToVRAM + ld a, $1 + ld [H_AUTOBGTRANSFERENABLED], a + ret + +PlaySubanimation: ; 78ebb (1e:4ebb) ld a,[wAnimSoundID] cp a,$FF jr z,.skipPlayingSound @@ -607,7 +660,7 @@ PlaySubanimation: ; 78e53 (1e:4e53) ld [wSubAnimSubEntryAddr],a jp .loop -AnimationCleanOAM: ; 78ec8 (1e:4ec8) +AnimationCleanOAM: ; 78f30 (1e:4f30) push hl push de push bc @@ -622,7 +675,7 @@ AnimationCleanOAM: ; 78ec8 (1e:4ec8) ; 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) +DoSpecialEffectByAnimationId: ; 78f3f (1e:4f3f) push hl push de push bc @@ -645,7 +698,7 @@ DoSpecialEffectByAnimationId: ; 78ed7 (1e:4ed7) ret ; Format: Animation ID (1 byte), Address (2 bytes) -AnimationIdSpecialEffects: ; 78ef5 (1e:4ef5) +AnimationIdSpecialEffects: ; 78f5d (1e:4f5d) db MEGA_PUNCH dw AnimationFlashScreen @@ -686,7 +739,7 @@ AnimationIdSpecialEffects: ; 78ef5 (1e:4ef5) dw DoExplodeSpecialEffects db SPORE - dw AnimationFlashScreen + dw FlashScreenEveryFourFrameBlocks db EXPLOSION dw DoExplodeSpecialEffects @@ -720,7 +773,7 @@ AnimationIdSpecialEffects: ; 78ef5 (1e:4ef5) db $FF ; terminator -DoBallTossSpecialEffects: ; 78f3e (1e:4f3e) +DoBallTossSpecialEffects: ; 78fa6 (1e:4fa6) ld a,[wcf91] cp a,3 ; is it a Master Ball or Ultra Ball? jr nc,.skipFlashingEffect @@ -728,6 +781,7 @@ DoBallTossSpecialEffects: ; 78f3e (1e:4f3e) ld a,[rOBP0] xor a,%00111100 ; complement colors 1 and 2 ld [rOBP0],a + call UpdateGBCPal_OBP0 .skipFlashingEffect ld a,[wSubAnimCounter] cp a,11 ; is it the beginning of the subanimation? @@ -774,7 +828,7 @@ DoBallTossSpecialEffects: ; 78f3e (1e:4f3e) ld [wSubAnimCounter],a ret -DoBallShakeSpecialEffects: ; 78f96 (1e:4f96) +DoBallShakeSpecialEffects: ; 79001 (1e:5001) ld a,[wSubAnimCounter] cp a,4 ; is it the beginning of a shake? jr nz,.skipPlayingSound @@ -808,14 +862,14 @@ DoBallShakeSpecialEffects: ; 78f96 (1e:4f96) ret ; plays a sound after the second frame of the poof animation -DoPoofSpecialEffects: ; 78fce (1e:4fce) +DoPoofSpecialEffects: ; 79039 (1e:5039) ld a,[wSubAnimCounter] cp a,5 ret nz ld a,SFX_BALL_POOF jp PlaySound -DoRockSlideSpecialEffects: ; 78fd9 (1e:4fd9) +DoRockSlideSpecialEffects: ; 79044 (1e:5044) ld a,[wSubAnimCounter] cp a,12 ret nc @@ -831,21 +885,21 @@ DoRockSlideSpecialEffects: ; 78fd9 (1e:4fd9) ld b,1 predef_jump PredefShakeScreenVertically ; shake vertically -FlashScreenEveryEightFrameBlocks: ; 78ff7 (1e:4ff7) +FlashScreenEveryEightFrameBlocks: ; 79062 (1e:5062) ld a,[wSubAnimCounter] 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) +FlashScreenEveryFourFrameBlocks: ; 7906b (1e:506b) ld a,[wSubAnimCounter] and a,3 call z,AnimationFlashScreen ret ; used for Explosion and Selfdestruct -DoExplodeSpecialEffects: ; 79009 (1e:5009) +DoExplodeSpecialEffects: ; 79074 (1e:5074) ld a,[wSubAnimCounter] cp a,1 ; is it the end of the subanimation? jr nz,FlashScreenEveryFourFrameBlocks @@ -854,7 +908,7 @@ DoExplodeSpecialEffects: ; 79009 (1e:5009) jp AnimationHideMonPic ; make pokemon disappear ; flashes the screen when subanimation counter is 1 modulo 4 -DoBlizzardSpecialEffects: ; 79016 (1e:5016) +DoBlizzardSpecialEffects: ; 79081 (1e:5081) ld a,[wSubAnimCounter] cp a,13 jp z,AnimationFlashScreen @@ -868,7 +922,7 @@ DoBlizzardSpecialEffects: ; 79016 (1e:5016) ; flashes the screen at 3 points in the subanimation ; unused -FlashScreenUnused: ; 7902e (1e:502e) +FlashScreenUnused: ; 79099 (1e:5099) ld a,[wSubAnimCounter] cp a,14 jp z,AnimationFlashScreen @@ -879,7 +933,7 @@ FlashScreenUnused: ; 7902e (1e:502e) ret ; function to make the pokemon disappear at the beginning of the animation -TradeHidePokemon: ; 79041 (1e:5041) +TradeHidePokemon: ; 790ac (1e:50ac) ld a,[wSubAnimCounter] cp a,6 ret nz @@ -887,7 +941,7 @@ TradeHidePokemon: ; 79041 (1e:5041) jp ClearMonPicFromTileMap ; make pokemon disappear ; function to make a shaking pokeball jump up at the end of the animation -TradeShakePokeball: ; 7904c (1e:504c) +TradeShakePokeball: ; 790b7 (1e:50b7) ld a,[wSubAnimCounter] cp a,1 ret nz @@ -916,12 +970,12 @@ TradeShakePokeball: ; 7904c (1e:504c) ld a,SFX_TRADE_MACHINE jp PlaySound -BallMoveDistances1: ; 79078 (1e:5078) +BallMoveDistances1: ; 790e3 (1e:50e3) db -12,-12,-8 db $ff ; terminator ; function to make the pokeball jump up -TradeJumpPokeball: ; 507C +TradeJumpPokeball: ; 790e7 (1e:50e7) ld de,BallMoveDistances2 .loop ld hl,wOAMBuffer ; OAM buffer @@ -957,13 +1011,13 @@ TradeJumpPokeball: ; 507C pop de jr .loop -BallMoveDistances2: ; 790b3 (1e:50b3) +BallMoveDistances2: ; 7911f (1e:511f) 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) +DoGrowlSpecialEffects: ; 79127 (1e:5127) ld hl,wOAMBuffer ; OAM buffer ld de,wOAMBuffer + $10 ld bc,$10 @@ -974,14 +1028,13 @@ DoGrowlSpecialEffects: ; 790bc (1e:50bc) ret ; this is associated with Tail Whip, but Tail Whip doesn't use any subanimations -TailWhipAnimationUnused: ; 790d0 (1e:50d0) +TailWhipAnimationUnused: ; 7913b (1e:513b) ld a,1 ld [wSubAnimCounter],a ld c,20 jp DelayFrames -; Format: Special Effect ID (1 byte), Address (2 bytes) -SpecialEffectPointers: ; 790da (1e:50da) +SpecialEffectPointers: ; 79145 (1e:5145) db SE_DARK_SCREEN_FLASH ; $FE dw AnimationFlashScreen db SE_DARK_SCREEN_PALETTE ; $FD @@ -1062,13 +1115,13 @@ SpecialEffectPointers: ; 790da (1e:50da) dw AnimationWavyScreen db $FF -AnimationDelay10: ; 79150 (1e:5150) +AnimationDelay10: ; 791bb (1e:51bb) 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) +CallWithTurnFlipped: ; 791c0 (1e:51c0) ld a,[H_WHOSETURN] push af xor a,1 @@ -1082,7 +1135,7 @@ CallWithTurnFlipped: ; 79155 (1e:5155) ret ; flashes the screen for an extended period (48 frames) -AnimationFlashScreenLong: ; 79165 (1e:5165) +AnimationFlashScreenLong: ; 791d0 (1e:51d0) ld a,3 ; cycle through the palettes 3 times ld [wFlashScreenLongCounter],a ld a,[wOnSGB] ; running on SGB? @@ -1097,6 +1150,7 @@ AnimationFlashScreenLong: ; 79165 (1e:5165) cp a,$01 ; is it the end of the palettes? jr z,.endOfPalettes ld [rBGP],a + call UpdateGBCPal_BGP call FlashScreenLongDelay jr .innerLoop .endOfPalettes @@ -1108,7 +1162,7 @@ AnimationFlashScreenLong: ; 79165 (1e:5165) ret ; BG palettes -FlashScreenLongMonochrome: ; 7918e (1e:518e) +FlashScreenLongMonochrome: ; 791fc (1e:51fc) db %11111001 ; 3, 3, 2, 1 db %11111110 ; 3, 3, 3, 2 db %11111111 ; 3, 3, 3, 3 @@ -1124,7 +1178,7 @@ FlashScreenLongMonochrome: ; 7918e (1e:518e) db $01 ; terminator ; BG palettes -FlashScreenLongSGB: ; 7919b (1e:519b) +FlashScreenLongSGB: ; 79209 (1e:5209) db %11111000 ; 3, 3, 2, 0 db %11111100 ; 3, 3, 3, 0 db %11111111 ; 3, 3, 3, 3 @@ -1141,7 +1195,7 @@ FlashScreenLongSGB: ; 7919b (1e:519b) ; 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) +FlashScreenLongDelay: ; 79216 (1e:5216) ld a,[wFlashScreenLongCounter] cp a,4 ; never true since [wFlashScreenLongCounter] starts at 3 ld c,4 @@ -1153,58 +1207,61 @@ FlashScreenLongDelay: ; 791a8 (1e:51a8) ld c,1 .delayFrames jp DelayFrames - -AnimationFlashScreen: ; 791be (1e:51be) + +AnimationFlashScreen: ; 7922c (1e:522c) ld a,[rBGP] push af ; save initial palette ld a,%00011011 ; 0, 1, 2, 3 (inverted colors) ld [rBGP],a + call UpdateGBCPal_BGP ld c,2 call DelayFrames xor a ; white out background ld [rBGP],a + call UpdateGBCPal_BGP ld c,2 call DelayFrames pop af ld [rBGP],a ; restore initial palette + call UpdateGBCPal_BGP ret -AnimationDarkScreenPalette: ; 791d6 (1e:51d6) +AnimationDarkScreenPalette: ; 7924d (1e:524d) ; Changes the screen's palette to a dark palette. lb bc, $6f, $6f jr SetAnimationBGPalette -AnimationDarkenMonPalette: ; 791db (1e:51db) +AnimationDarkenMonPalette: ; 79252 (1e:5252) ; Darkens the mon sprite's palette. lb bc, $f9, $f4 jr SetAnimationBGPalette -AnimationUnusedPalette1: ; 791e0 (1e:51e0) +AnimationUnusedPalette1: ; 79257 (1e:5257) lb bc, $fe, $f8 jr SetAnimationBGPalette -AnimationUnusedPalette2: ; 791e5 (1e:51e5) +AnimationUnusedPalette2: ; 7925c (1e:525c) lb bc, $ff, $ff jr SetAnimationBGPalette -AnimationResetScreenPalette: ; 791ea (1e:51ea) +AnimationResetScreenPalette: ; 79261 (1e:5261) ; Restores the screen's palette to the normal palette. lb bc, $e4, $e4 jr SetAnimationBGPalette -AnimationUnusedPalette3: ; 791ef (1e:51ef) +AnimationUnusedPalette3: ; 79266 (1e:5266) lb bc, $00, $00 jr SetAnimationBGPalette -AnimationLightScreenPalette: ; 791f4 (1e:51f4) +AnimationLightScreenPalette: ; 7926b (1e:526b) ; Changes the screen to use a palette with light colors. lb bc, $90, $90 jr SetAnimationBGPalette -AnimationUnusedPalette4: ; 791f9 (1e:51f9) +AnimationUnusedPalette4: ; 79270 (1e:5270) lb bc, $40, $40 -SetAnimationBGPalette: ; 791fc (1e:51fc) +SetAnimationBGPalette: ; 79273 (1e:5273) ld a, [wOnSGB] and a ld a, b @@ -1212,21 +1269,22 @@ SetAnimationBGPalette: ; 791fc (1e:51fc) ld a, c .next ld [rBGP], a + call UpdateGBCPal_BGP ret ld b, $5 - -AnimationShakeScreenVertically: ; 79209 (1e:5209) + +AnimationShakeScreenVertically: ; 79283 (1e:5283) predef_jump PredefShakeScreenVertically -AnimationShakeScreen: ; 7920e (1e:520e) +AnimationShakeScreen: ; 79288 (1e:5288) ; Shakes the screen for a while. Used in Earthquake/Fissure/etc. animations. ld b, $8 - -AnimationShakeScreenHorizontallyFast: ; 79210 (1e:5210) + +AnimationShakeScreenHorizontallyFast: ; 7928a (1e:528a) predef_jump PredefShakeScreenHorizontally -AnimationWaterDropletsEverywhere: ; 79215 (1e:5215) +AnimationWaterDropletsEverywhere: ; 7928f (1e:528f) ; 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. @@ -1253,18 +1311,33 @@ AnimationWaterDropletsEverywhere: ; 79215 (1e:5215) jr nz, .loop ret -_AnimationWaterDroplets: ; 79246 (1e:5246) +_AnimationWaterDroplets: ; 792c0 (1e:52c0) ld hl, wOAMBuffer .loop + ld a, $1 + ld [wdef5], a ld a, [wBaseCoordY] ld [hli], a ; Y + cp 40 + jr c, .asm_792d7 + ld a, [wdef5] + inc a + ld [wdef5], a +.asm_792d7 ld a, [wBaseCoordX] add 27 ld [wBaseCoordX], a ld [hli], a ; X + cp 88 + jr c, .asm_792ee + ld a, [wdef5] + add $2 + and $3 + ld [wdef5], a +.asm_792ee ld a, [wDropletTile] ld [hli], a ; tile - xor a + ld a, [wdef5] ld [hli], a ; attribute ld a, [wBaseCoordX] cp 144 @@ -1279,7 +1352,7 @@ _AnimationWaterDroplets: ; 79246 (1e:5246) call AnimationCleanOAM jp DelayFrame -AnimationSlideMonUp: ; 7927a (1e:527a) +AnimationSlideMonUp: ; 79314 (1e:5314) ; Slides the mon's sprite upwards. ld c, 7 ld a, [H_WHOSETURN] @@ -1295,7 +1368,7 @@ AnimationSlideMonUp: ; 7927a (1e:527a) ld [wSlideMonUpBottomRowLeftTile], a jp _AnimationSlideMonUp -AnimationSlideMonDown: ; 79297 (1e:5297) +AnimationSlideMonDown: ; 79331 (1e:5331) ; Slides the mon's sprite down out of the screen. xor a call GetTileIDList @@ -1311,20 +1384,20 @@ AnimationSlideMonDown: ; 79297 (1e:5297) dec b jr nz, .loop ret - -AnimationSlideMonOff: ; 792af (1e:52af) + +AnimationSlideMonOff: ; 79349 (1e:5349) ; Slides the mon's sprite off the screen horizontally. ld e, 8 ld a, 3 ld [wSlideMonDelay], a jp _AnimationSlideMonOff - -AnimationSlideEnemyMonOff: ; 792b9 (1e:52b9) + +AnimationSlideEnemyMonOff: ; 79353 (1e:5353) ; Slides the enemy mon off the screen horizontally. ld hl, AnimationSlideMonOff jp CallWithTurnFlipped - -_AnimationSlideMonUp: ; 792bf (1e:52bf) + +_AnimationSlideMonUp: ; 79359 (1e:5359) push de push hl push bc @@ -1375,7 +1448,7 @@ _AnimationSlideMonUp: ; 792bf (1e:52bf) jr nz, _AnimationSlideMonUp ret -ShakeEnemyHUD_WritePlayerMonPicOAM: ; 792fd (1e:52fd) +ShakeEnemyHUD_WritePlayerMonPicOAM: ; 79397 (1e:5397) ; Writes the OAM entries for a copy of the player mon's pic in OAM. ; The top 5 rows are reproduced in OAM, although only 2 are actually needed. ld a, $10 @@ -1403,28 +1476,42 @@ ShakeEnemyHUD_WritePlayerMonPicOAM: ; 792fd (1e:52fd) ld [wBaseCoordX], a jr .loop -BattleAnimWriteOAMEntry: ; 79329 (1e:5329) +BattleAnimWriteOAMEntry: ; 793c3 (1e:53c3) ; Y coordinate = e (increased by 8 each call, before the write to OAM) ; X coordinate = [wBaseCoordX] ; tile = d -; attributes = 0 +; attributes = variable (dependant on coords) + ld a, $1 + ld [wdef5], a ld a, e add 8 ld e, a ld [hli], a + cp 40 + jr c, .asm_793d8 + ld a, [wdef5] + inc a + ld [wdef5], a +.asm_793d8 ld a, [wBaseCoordX] ld [hli], a + cp 88 + jr c, .asm_793e8 + ld a, [wdef5] + add $2 + ld [wdef5], a +.asm_793e8 ld a, d ld [hli], a - xor a + ld a, [wdef5] ld [hli], a ret -AdjustOAMBlockXPos: ; 79337 (1e:5337) +AdjustOAMBlockXPos: ; 793ef (1e:53ef) ld l, e ld h, d -AdjustOAMBlockXPos2: ; 79339 (1e:5339) +AdjustOAMBlockXPos2: ; 793f1 (1e:53f1) ld de, 4 .loop ld a, [wCoordAdjustmentAmount] @@ -1444,11 +1531,11 @@ AdjustOAMBlockXPos2: ; 79339 (1e:5339) jr nz, .loop ret -AdjustOAMBlockYPos: ; 79350 (1e:5350) +AdjustOAMBlockYPos: ; 79408 (1e:5408) ld l, e ld h, d -AdjustOAMBlockYPos2: ; 79352 (1e:5352) +AdjustOAMBlockYPos2: ; 7940d (1e:540d) ld de, 4 .loop ld a, [wCoordAdjustmentAmount] @@ -1466,13 +1553,13 @@ AdjustOAMBlockYPos2: ; 79352 (1e:5352) 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 + +AnimationBlinkEnemyMon: ; 79421 (1e:5421) + ; Make the enemy mon's sprite blink on and off for a second or two ld hl, AnimationBlinkMon jp CallWithTurnFlipped -AnimationBlinkMon: ; 7936f (1e:536f) +AnimationBlinkMon: ; 79427 (1e:5427) ; Make the mon's sprite blink on and off for a second or two. push af ld c, 6 @@ -1490,7 +1577,7 @@ AnimationBlinkMon: ; 7936f (1e:536f) pop af ret -AnimationFlashMonPic: ; 79389 (1e:5389) +AnimationFlashMonPic: ; 79441 (1e:5441) ; Flashes the mon's sprite on and off ld a, [wBattleMonSpecies] ld [wChangeMonPicPlayerTurnSpecies], a @@ -1498,25 +1585,25 @@ AnimationFlashMonPic: ; 79389 (1e:5389) ld [wChangeMonPicEnemyTurnSpecies], a jp ChangeMonPic -AnimationFlashEnemyMonPic: ; 79398 (1e:5398) +AnimationFlashEnemyMonPic: ; 79450 (1e:5450) ; Flashes the enemy mon's sprite on and off ld hl, AnimationFlashMonPic jp CallWithTurnFlipped -AnimationShowMonPic: ; 7939e (1e:539e) +AnimationShowMonPic: ; 79456 (1e:5456) xor a call GetTileIDList call GetMonSpriteTileMapPointerFromRowCount call CopyPicTiles jp Delay3 -AnimationShowEnemyMonPic: ; 793ab (1e:53ab) +AnimationShowEnemyMonPic: ; 79463 (1e:5463) ; 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) +AnimationShakeBackAndForth: ; 79469 (1e:5469) ; 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] @@ -1563,7 +1650,7 @@ AnimationShakeBackAndForth: ; 793b1 (1e:53b1) jr nz, .loop ret -AnimationMoveMonHorizontally: ; 793f9 (1e:53f9) +AnimationMoveMonHorizontally: ; 794b1 (1e:54b1) ; Shifts the mon's sprite horizontally to a fixed location. Used by lots of ; animations like Tackle/Body Slam. call AnimationHideMonPic @@ -1581,7 +1668,7 @@ AnimationMoveMonHorizontally: ; 793f9 (1e:53f9) ld c, 3 jp DelayFrames -AnimationResetMonPosition: ; 79415 (1e:5415) +AnimationResetMonPosition: ; 794cd (1e:54cd) ; Resets the mon's sprites to be located at the normal coordinates. ld a, [H_WHOSETURN] and a @@ -1592,7 +1679,7 @@ AnimationResetMonPosition: ; 79415 (1e:5415) call ClearMonPicFromTileMap jp AnimationShowMonPic -AnimationSpiralBallsInward: ; 79424 (1e:5424) +AnimationSpiralBallsInward: ; 794dc (1e:54dc) ; Creates an effect that looks like energy balls spiralling into the ; player mon's sprite. Used in Focus Energy, for example. ld a, [H_WHOSETURN] @@ -1621,6 +1708,8 @@ AnimationSpiralBallsInward: ; 79424 (1e:5424) ld a, [hl] cp $ff jr z, .done + ld a, $2 + ld [wdef5], a ld a, [wSpiralBallsBaseY] add [hl] ld [de], a ; Y @@ -1629,9 +1718,20 @@ AnimationSpiralBallsInward: ; 79424 (1e:5424) ld a, [wSpiralBallsBaseX] add [hl] ld [de], a ; X + cp 88 + jr c, .asm_79524 + ld a, $3 + ld [wdef5], a +.asm_79524 inc hl inc de inc de + ld a, [de] + and $f0 + ld b, a + ld a, [wdef5] + or b + ld [de], a inc de dec c jr nz, .innerLoop @@ -1646,7 +1746,7 @@ AnimationSpiralBallsInward: ; 79424 (1e:5424) call AnimationCleanOAM jp AnimationFlashScreen -SpiralBallAnimationCoordinates: ; 79476 (1e:5476) +SpiralBallAnimationCoordinates: ; 79545 (1e:5545) ; y, x pairs ; This is the sequence of screen coordinates that the spiralling ; balls are positioned at. @@ -1673,7 +1773,7 @@ SpiralBallAnimationCoordinates: ; 79476 (1e:5476) db $50, $28 db $FF ; list terminator -AnimationSquishMonPic: ; 794a1 (1e:54a1) +AnimationSquishMonPic: ; 79570 (1e:5570) ; Squishes the mon's sprite horizontally making it ; disappear. Used by Teleport/Sky Attack animations. ld c, 4 @@ -1704,7 +1804,7 @@ AnimationSquishMonPic: ; 794a1 (1e:54a1) ld c, 2 jp DelayFrame -_AnimationSquishMonPic: ; 794d4 (1e:54d4) +_AnimationSquishMonPic: ; 795a3 (1e:55a3) ld c, 7 .loop push bc @@ -1729,7 +1829,7 @@ _AnimationSquishMonPic: ; 794d4 (1e:54d4) jr nz, .loop jp Delay3 -AnimationShootBallsUpward: ; 794f9 (1e:54f9) +AnimationShootBallsUpward: ; 795c8 (1e:55c8) ; Shoots one pillar of "energy" balls upwards. Used in Teleport/Sky Attack ; animations. ld a, [H_WHOSETURN] @@ -1748,7 +1848,7 @@ AnimationShootBallsUpward: ; 794f9 (1e:54f9) call _AnimationShootBallsUpward jp AnimationCleanOAM -_AnimationShootBallsUpward: ; 79517 (1e:5517) +_AnimationShootBallsUpward: ; 795e6 (1e:55e6) push bc xor a ld [wWhichBattleAnimTileset], a @@ -1798,7 +1898,7 @@ _AnimationShootBallsUpward: ; 79517 (1e:5517) jr nz, .loop ret -AnimationShootManyBallsUpward: ; 79566 (1e:5566) +AnimationShootManyBallsUpward: ; 79635 (1e:5635) ; Shoots several pillars of "energy" balls upward. ld a, [H_WHOSETURN] and a @@ -1822,31 +1922,31 @@ AnimationShootManyBallsUpward: ; 79566 (1e:5566) pop hl jr .loop -UpwardBallsAnimXCoordinatesPlayerTurn: ; 79591 (1e:5591) +UpwardBallsAnimXCoordinatesPlayerTurn: ; 79660 (1e:5660) ; 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) +UpwardBallsAnimXCoordinatesEnemyTurn: ; 79667 (1e:5667) ; 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) + +AnimationMinimizeMon: ; 7966e (1e:566e) ; 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 + ld bc, 7 * 7 * $10 call FillMemory pop hl ld de, $194 add hl, de ld de, MinimizedMonSprite - ld c, $5 + ld c, MinimizedMonSpriteEnd - MinimizedMonSprite .loop ld a, [de] ld [hli], a @@ -1858,10 +1958,11 @@ AnimationMinimizeMon: ; 7959f (1e:559f) call Delay3 jp AnimationShowMonPic -MinimizedMonSprite: ; 795c4 (1e:55c4) +MinimizedMonSprite: ; 79693 (1e:5693) INCBIN "gfx/minimized_mon_sprite.1bpp" - -AnimationSlideMonDownAndHide: ; 795c9 (1e:55c9) +MinimizedMonSpriteEnd: + +AnimationSlideMonDownAndHide: ; 79698 (1e:5698) ; Slides the mon's sprite down and disappears. Used in Acid Armor. ld a, $1 ld c, $2 @@ -1870,7 +1971,7 @@ AnimationSlideMonDownAndHide: ; 795c9 (1e:55c9) push af call AnimationHideMonPic pop af - push af + push af call GetTileIDList call GetMonSpriteTileMapPointerFromRowCount call CopyPicTiles @@ -1888,7 +1989,7 @@ AnimationSlideMonDownAndHide: ; 795c9 (1e:55c9) call FillMemory jp CopyTempPicToMonPic -_AnimationSlideMonOff: ; 795f8 (1e:55f8) +_AnimationSlideMonOff: ; 796c7 (1e:56c7) ; Slides the mon's sprite off the screen horizontally by e tiles and waits ; [wSlideMonDelay] V-blanks each time the pic is slid by one tile. ld a, [H_WHOSETURN] @@ -1939,18 +2040,16 @@ _AnimationSlideMonOff: ; 795f8 (1e:55f8) ; functions below catch it by checking if the tile number is within the valid ; range and if not, replacing it with a blank tile. -.PlayerNextTile ; 79633 (1e:5633) +.PlayerNextTile ; 79702 (1e:5702) ld a, [hl] add 7 -; This is a bug. The lower right corner tile of the mon back pic is blanked -; while the mon is sliding off the screen. It should compare with the max tile -; plus one instead. - cp $61 +; bugfix: compares against the max tile + 1 as opposed to the max tile + cp $62 ret c ld a, " " ret -.EnemyNextTile ; 7963c (1e:563c) +.EnemyNextTile ; 7970b (1e:570b) ld a, [hl] sub 7 ; This has the same problem as above, but it has no visible effect because @@ -1960,7 +2059,7 @@ _AnimationSlideMonOff: ; 795f8 (1e:55f8) ld a, " " ret -AnimationSlideMonHalfOff: ; 79645 (1e:5645) +AnimationSlideMonHalfOff: ; 79714 (1e:5714) ; Slides the mon's sprite halfway off the screen. It's used in Softboiled. ld e, 4 ld a, 4 @@ -1968,7 +2067,7 @@ AnimationSlideMonHalfOff: ; 79645 (1e:5645) call _AnimationSlideMonOff jp Delay3 -CopyTempPicToMonPic: ; 79652 (1e:5652) +CopyTempPicToMonPic: ; 79721 (1e:5721) ld a, [H_WHOSETURN] and a ld hl, vBackPic ; player turn @@ -1979,7 +2078,7 @@ CopyTempPicToMonPic: ; 79652 (1e:5652) ld bc, 7 * 7 jp CopyVideoData -AnimationWavyScreen: ; 79666 (1e:5666) +AnimationWavyScreen: ; 79735 (1e:5735) ; used in Psywave/Psychic etc. ld hl, vBGMap0 call BattleAnimCopyTileMapToVRAM @@ -2020,7 +2119,7 @@ AnimationWavyScreen: ; 79666 (1e:5666) call BattleAnimCopyTileMapToVRAM ret -WavyScreen_SetSCX: ; 796ae (1e:56ae) +WavyScreen_SetSCX: ; 7977d (1e:577d) ld a, [rSTAT] and $3 ; is it H-blank? jr nz, WavyScreen_SetSCX ; wait until it's H-blank @@ -2033,14 +2132,14 @@ WavyScreen_SetSCX: ; 796ae (1e:56ae) ld hl, WavyScreenLineOffsets ; go back to the beginning if so ret -WavyScreenLineOffsets: ; 796bf (1e:56bf) +WavyScreenLineOffsets: ; 7978e (1e:578e) ; 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) + +AnimationSubstitute: ; 797af (1e:57af) ; Changes the pokemon's sprite to the mini sprite ld hl, wTempPic xor a @@ -2079,21 +2178,27 @@ AnimationSubstitute: ; 796e0 (1e:56e0) call CopyTempPicToMonPic jp AnimationShowMonPic -CopySlowbroSpriteData: ; 7973f (1e:573f) +CopySlowbroSpriteData: ; 7980e (1e:580e) ld bc, $0010 ld a, BANK(SlowbroSprite) jp FarCopyData - -HideSubstituteShowMonAnim: ; 79747 (1e:5747) + +HideSubstituteShowMonAnim: ; 79816 (1e:5816) ld a, [H_WHOSETURN] and a ld hl, wPlayerMonMinimized + ld de, wPlayerBattleStatus1 + ld bc, wPlayerMoveNum ld a, [wPlayerBattleStatus2] jr z, .next1 ld hl, wEnemyMonMinimized + ld de, wEnemyBattleStatus1 + ld bc, wEnemyMoveNum ld a, [wEnemyBattleStatus2] .next1 push hl + push de + push bc ; if the substitute broke, slide it down, else slide it offscreen horizontally bit HasSubstituteUp, a jr nz, .substituteStillUp @@ -2102,19 +2207,72 @@ HideSubstituteShowMonAnim: ; 79747 (1e:5747) .substituteStillUp call AnimationSlideMonOff .next2 + pop bc + pop de + ld a, [de] + bit Invulnerable, a pop hl + jr nz, .invulnerable + ld a, [bc] + cp FLY + jr z, .flyOrDig + cp DIG + jr z, .flyOrDig +.invulnerable ld a, [hl] and a jp nz, AnimationMinimizeMon call AnimationFlashMonPic jp AnimationShowMonPic +.flyOrDig + ld a, [H_WHOSETURN] + and a + jr nz, .enemy + ld a, [wPlayerMonMinimized] + and a + jr nz, .monIsMinimized + ld a, [wBattleMonSpecies] + ld [wcf91], a + ld [wd0b5], a + call GetMonHeader + predef LoadMonBackPic + ret +.enemy + ld a, [wEnemyMonMinimized] + and a + jr nz, .monIsMinimized + ld a, [wEnemyMonSpecies] + ld [wcf91], a + ld [wd0b5], a + call GetMonHeader + ld de, vFrontPic + jp LoadMonFrontSprite +.monIsMinimized + ld hl, wTempPic + push hl + xor a + ld bc, 7 * 7 * $10 + call FillMemory + pop hl + ld de, $194 + add hl, de + ld de, MinimizedMonSprite + ld c, MinimizedMonSpriteEnd - MinimizedMonSprite +.loop + ld a, [de] + ld [hli], a + ld [hli], a + inc de + dec c + jr nz, .loop + jp CopyTempPicToMonPic -ReshowSubstituteAnim: ; 79771 (1e:5771) +ReshowSubstituteAnim: ; 798b2 (1e:58b2) call AnimationSlideMonOff call AnimationSubstitute jp AnimationShowMonPic -AnimationBoundUpAndDown: ; 7977a (1e:577a) +AnimationBoundUpAndDown: ; 798bb (1e:58bb) ; Bounces the mon's sprite up and down several times. It is used ; by Splash's animation. ld c, 5 @@ -2126,15 +2284,15 @@ AnimationBoundUpAndDown: ; 7977a (1e:577a) jr nz, .loop jp AnimationShowMonPic -AnimationTransformMon: ; 79787 (1e:5787) +AnimationTransformMon: ; 798c8 (1e:58c8) ; Redraws this mon's sprite as the back/front sprite of the opposing mon. ; Used in Transform. ld a, [wEnemyMonSpecies] ld [wChangeMonPicPlayerTurnSpecies], a ld a, [wBattleMonSpecies] ld [wChangeMonPicEnemyTurnSpecies], a - -ChangeMonPic: ; 79793 (1e:5793) + +ChangeMonPic: ; 798d4 (1e:58d4) ld a, [H_WHOSETURN] and a jr z, .playerTurn @@ -2165,7 +2323,7 @@ ChangeMonPic: ; 79793 (1e:5793) ld b, SET_PAL_BATTLE jp RunPaletteCommand -AnimationHideEnemyMonPic: ; 797d8 (1e:57d8) +AnimationHideEnemyMonPic: ; 79919 (1e:5919) ; Hides the enemy mon's sprite xor a ld [H_AUTOBGTRANSFERENABLED], a @@ -2174,8 +2332,25 @@ AnimationHideEnemyMonPic: ; 797d8 (1e:57d8) ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a jp Delay3 - -InitMultipleObjectsOAM: ; 797e8 (1e:57e8) + +Func_79929: ; 79929 (1e:5929) + ld hl, wPlayerMonMinimized + ld a, [H_WHOSETURN] + and a + jr z, .playerTurn + ld hl, wEnemyMonMinimized +.playerTurn + ld a, [hl] + and a + jr z, .notMinimized + call AnimationMinimizeMon + ret +.notMinimized + call AnimationFlashMonPic + call AnimationShowMonPic + ret + +InitMultipleObjectsOAM: ; 79943 (1e:5943) ; Writes c OAM entries with tile d. ; Sets their Y coordinates to sequential multiples of 8, starting from 0. ; Sets their X coordinates to 0. @@ -2195,8 +2370,10 @@ InitMultipleObjectsOAM: ; 797e8 (1e:57e8) dec c jr nz, .loop ret - -AnimationHideMonPic: ; 79801 (1e:5801) + + ret ; unreferenced + +AnimationHideMonPic: ; 7995d (1e:595d) ; Hides the mon's sprite. ld a, [H_WHOSETURN] and a @@ -2205,8 +2382,8 @@ AnimationHideMonPic: ; 79801 (1e:5801) jr ClearMonPicFromTileMap .playerTurn ld a, 5 * SCREEN_WIDTH + 1 - -ClearMonPicFromTileMap: ; 7980c (1e:580c) + +ClearMonPicFromTileMap: ; 79968 (1e:5968) push hl push de push bc @@ -2220,11 +2397,11 @@ ClearMonPicFromTileMap: ; 7980c (1e:580c) 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) +GetMonSpriteTileMapPointerFromRowCount: ; 7997c (1e:597c) push de ld a, [H_WHOSETURN] and a @@ -2257,7 +2434,7 @@ GetMonSpriteTileMapPointerFromRowCount: ; 79820 (1e:5820) ; de = tile ID list pointer ; b = number of rows ; c = number of columns -GetTileIDList: ; 79842 (1e:5842) +GetTileIDList: ; 7999e (1e:599e) ld hl, TileIDListPointerTable ld e, a ld d, 0 @@ -2278,7 +2455,7 @@ GetTileIDList: ; 79842 (1e:5842) ld b, a ret -AnimCopyRowLeft: ; 7985b (1e:585b) +AnimCopyRowLeft: ; 798b7 (1e:58b7) ; copy a row of c tiles 1 tile left ld a, [hld] ld [hli], a @@ -2287,7 +2464,7 @@ AnimCopyRowLeft: ; 7985b (1e:585b) jr nz, AnimCopyRowLeft ret -AnimCopyRowRight: ; 79862 (1e:5862) +AnimCopyRowRight: ; 799be (1e:59be) ; copy a row of c tiles 1 tile right ld a, [hli] ld [hld], a @@ -2296,15 +2473,14 @@ AnimCopyRowRight: ; 79862 (1e:5862) jr nz, AnimCopyRowRight ret -; get the sound of the move id in b -GetMoveSoundB: ; 79869 (1e:5869) +; get the sound of the move id in b +GetMoveSoundB: ; 799c5 (1e:59c5) ld a, b call GetMoveSound ld b, a ret -; get the sound of the (move id - 1) in a -GetMoveSound: ; 7986f (1e:586f) +GetMoveSound: ; 799cb (1e:59cb) ld hl,MoveSoundTable ld e,a ld d,0 @@ -2344,7 +2520,7 @@ GetMoveSound: ; 7986f (1e:586f) ld a,b ret -IsCryMove: ; 798ad (1e:58ad) +IsCryMove: ; 79a09 (1e:5a09) ; set carry if the move animation involves playing a monster cry ld a,[wAnimationID] cp a,GROWL @@ -2357,7 +2533,7 @@ IsCryMove: ; 798ad (1e:58ad) scf ret -MoveSoundTable: ; 798bc (1e:58bc) +MoveSoundTable: ; 79a18 (1e:5a18) db SFX_POUND, $00,$80 ; POUND db SFX_BATTLE_0C, $10,$80 ; KARATE_CHOP db SFX_DOUBLESLAP, $00,$80 ; DOUBLESLAP @@ -2525,7 +2701,7 @@ MoveSoundTable: ; 798bc (1e:58bc) db SFX_BATTLE_0B, $00,$80 ; STRUGGLE db SFX_BATTLE_0B, $00,$80 -CopyPicTiles: ; 79aae (1e:5aae) +CopyPicTiles: ; 79c0a (1e:5c0a) ld a, [H_WHOSETURN] and a ld a, $31 ; base tile ID of player mon sprite @@ -2537,7 +2713,7 @@ CopyPicTiles: ; 79aae (1e:5aae) jr CopyTileIDs_NoBGTransfer ; copy the tiles used when a mon is being sent out of or into a pokeball -CopyDownscaledMonTiles: ; 79aba (1e:5aba) +CopyDownscaledMonTiles: ; 79c16 (1e:5c16) call GetPredefRegisters ld a, [wDownscaledMonSize] and a @@ -2580,22 +2756,22 @@ CopyTileIDs: ; 79ace (1e:5ace) pop hl ret -TileIDListPointerTable: ; 79aea (1e:5aea) - dw Unknown_79b24 +TileIDListPointerTable: ; 79c46 (1e:5c46) + dw DownscaledMonTiles_7x7 db $77 - dw Unknown_79b55 + dw DownscaledMonTiles_5x7 db $57 - dw Unknown_79b78 + dw DownscaledMonTiles_3x7 db $37 - dw Unknown_79b8d + dw DownscaledMonTiles_79ce9 db $77 - dw Unknown_79bbe + dw DownscaledMonTiles_79d1a db $77 - dw Unknown_79bef + dw DownscaledMonTiles_79d4b db $77 - dw Unknown_79c20 + dw DownscaledMonTiles_79d7c db $86 - dw Unknown_79c50 + dw DownscaledMonTiles_79dac db $3C DownscaledMonTiles_5x5: ; 79b02 (1e:5b02) @@ -2610,7 +2786,7 @@ DownscaledMonTiles_3x3: ; 79b1b (1e:5b1b) db $34,$49,$5E db $37,$4C,$61 -Unknown_79b24: ; 79b24 (1e:5b24) +DownscaledMonTiles_7x7: ; 79c80 (1e:5c80) db $00,$07,$0E,$15,$1C,$23,$2A db $01,$08,$0F,$16,$1D,$24,$2B db $02,$09,$10,$17,$1E,$25,$2C @@ -2619,19 +2795,19 @@ Unknown_79b24: ; 79b24 (1e:5b24) db $05,$0C,$13,$1A,$21,$28,$2F db $06,$0D,$14,$1B,$22,$29,$30 -Unknown_79b55: ; 79b55 (1e:5b55) +DownscaledMonTiles_5x7: ; 79cb1 (1e:5cb1) 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) +DownscaledMonTiles_3x7: ; 79cd4 (1e:5cd4) 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) +DownscaledMonTiles_79ce9: ; 79ce9 (1e:5ce9) db $00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$19,$00 db $02,$06,$0B,$10,$14,$1A,$00 @@ -2640,7 +2816,7 @@ Unknown_79b8d: ; 79b8d (1e:5b8d) db $04,$09,$0E,$13,$17,$1D,$1F db $05,$0A,$0F,$01,$18,$1E,$20 -Unknown_79bbe: ; 79bbe (1e:5bbe) +DownscaledMonTiles_79d1a: ; 79d1a (1e:5d1a) db $00,$00,$00,$30,$00,$37,$00 db $00,$00,$2B,$31,$34,$38,$3D db $21,$26,$2C,$01,$35,$39,$3E @@ -2649,7 +2825,7 @@ Unknown_79bbe: ; 79bbe (1e:5bbe) db $24,$29,$2F,$01,$01,$3B,$00 db $25,$2A,$01,$01,$01,$3C,$00 -Unknown_79bef: ; 79bef (1e:5bef) +DownscaledMonTiles_79d4b: ; 79d4b (1e:5d4b) db $00,$00,$00,$00,$00,$00,$00 db $00,$00,$47,$4D,$00,$00,$00 db $00,$00,$48,$4E,$52,$56,$5B @@ -2658,7 +2834,7 @@ Unknown_79bef: ; 79bef (1e:5bef) db $41,$45,$4B,$51,$4C,$59,$5D db $42,$46,$4C,$4C,$55,$5A,$5E -Unknown_79c20: ; 79c20 (1e:5c20) +DownscaledMonTiles_79d7c: ; 79d7c (1e:5d7c) db $31,$32,$32,$32,$32,$33 db $34,$35,$36,$36,$37,$38 db $34,$39,$3A,$3A,$3B,$38 @@ -2668,27 +2844,23 @@ Unknown_79c20: ; 79c20 (1e:5c20) db $41,$43,$4B,$4C,$4D,$4E db $4F,$50,$50,$50,$51,$52 -Unknown_79c50: ; 79c50 (1e:5c50) +DownscaledMonTiles_79dac: ; 79dac (1e:5dac) 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) +AnimationLeavesFalling: ; 79dd0 (1e:5dd0) ; 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, [wAnimPalette] ld [rOBP0], a + call UpdateGBCPal_OBP0 ld d, $37 ; leaf tile ld a, 3 ; number of leaves ld [wNumFallingObjects], a - call AnimationFallingObjects - pop af - ld [rOBP0], a - ret - -AnimationPetalsFalling: ; 79c8a (1e:5c8a) + jp AnimationFallingObjects + +AnimationPetalsFalling: ; 79de2 (1e:5de2) ; Makes lots of petals fall down from the top of the screen. It's used in ; the animation for Petal Dance. ld d, $71 ; petal tile @@ -2697,7 +2869,7 @@ AnimationPetalsFalling: ; 79c8a (1e:5c8a) call AnimationFallingObjects jp ClearSprites -AnimationFallingObjects: ; 79c97 (1e:5c97) +AnimationFallingObjects: ; 79def (1e:5def) ld c, a ld a, 1 call InitMultipleObjectsOAM @@ -2741,6 +2913,8 @@ FallingObjects_UpdateOAMEntry: ; 79cdb (1e:5cdb) ; movement byte. ld hl, wOAMBuffer add hl, de + ld a, $1 + ld [wdef5], a ld a, [hl] inc a inc a @@ -2749,6 +2923,12 @@ FallingObjects_UpdateOAMEntry: ; 79cdb (1e:5cdb) ld a, 160 ; if Y >= 112, put it off-screen .next ld [hli], a ; Y + cp 40 + jr c, .asm_79e51 + ld a, [wdef5] + inc a + ld [wdef5], a +.asm_79e51 ld a, [wFallingObjectMovementByte] ld b, a ld de, FallingObjects_DeltaXs @@ -2765,6 +2945,13 @@ FallingObjects_UpdateOAMEntry: ; 79cdb (1e:5cdb) ld a, [de] add [hl] ld [hli], a ; X + cp 88 + jr c, .asm_79e75 + ld a, [wdef5] + add $2 + and $3 + ld [wdef5], a +.asm_79e75 inc hl xor a ; no horizontal flip jr .next2 @@ -2774,16 +2961,26 @@ FallingObjects_UpdateOAMEntry: ; 79cdb (1e:5cdb) ld a, [hl] sub b ld [hli], a ; X + cp 88 + jr c, .asm_79e5c + ld a, [wdef5] + add $2 + and $3 + ld [wdef5], a +.asm_79e5c inc hl ld a, (1 << OAM_X_FLIP) .next2 + ld b, a + ld a, [wdef5] + or b ld [hl], a ; attribute ret -FallingObjects_DeltaXs: ; 79d0d (1e:5d0d) +FallingObjects_DeltaXs: ; 79e96 (1e:5e96) db 0, 1, 3, 5, 7, 9, 11, 13, 15 -FallingObjects_UpdateMovementByte: ; 79d16 (1e:5d16) +FallingObjects_UpdateMovementByte: ; 79e9f (1e:5e9f) ld a, [wFallingObjectMovementByte] inc a ld b, a @@ -2799,7 +2996,7 @@ FallingObjects_UpdateMovementByte: ; 79d16 (1e:5d16) ld [wFallingObjectMovementByte], a ret -FallingObjects_InitXCoords: ; 79d2a (1e:5d2a) +FallingObjects_InitXCoords: ; 79eb3 (1e:5eb3) ld hl, wOAMBuffer + $01 ld de, FallingObjects_InitialXCoords ld a, [wNumFallingObjects] @@ -2815,10 +3012,10 @@ FallingObjects_InitXCoords: ; 79d2a (1e:5d2a) jr nz, .loop ret -FallingObjects_InitialXCoords: ; 79d3e (1e:5d3e) +FallingObjects_InitialXCoords: ; 79ec7 (1e:5ec7) db $38,$40,$50,$60,$70,$88,$90,$56,$67,$4A,$77,$84,$98,$32,$22,$5C,$6C,$7D,$8E,$99 -FallingObjects_InitMovementData: ; 79d52 (1e:5d52) +FallingObjects_InitMovementData: ; 79edb (1e:5edb) ld hl, wFallingObjectsMovementData ld de, FallingObjects_InitialMovementData ld a, [wNumFallingObjects] @@ -2831,10 +3028,10 @@ FallingObjects_InitMovementData: ; 79d52 (1e:5d52) jr nz, .loop ret -FallingObjects_InitialMovementData: ; 79d63 (1e:5d63) +FallingObjects_InitialMovementData: ; 79eec (1e:5eec) 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) +AnimationShakeEnemyHUD: ; 79f00 (1e:5f00) ; Shakes the enemy HUD. ; Make a copy of the back pic's tile patterns in sprite tile pattern VRAM. @@ -2861,6 +3058,14 @@ AnimationShakeEnemyHUD: ; 79d77 (1e:5d77) ld hl, vBGMap1 - $20 * 7 call BattleAnimCopyTileMapToVRAM +; update BGMap attributes + ld a, [hGBC] + and a + jr z, .notGBC + ld c, 13 + callba LoadBGMapAttributes +.notGBC + ; Move the window so that the row below the enemy HUD (in BG map 0) lines up ; with the top row of the window on the screen. This makes it so that the window ; covers everything below the enemy HD with a copy that looks just like what @@ -2894,20 +3099,25 @@ AnimationShakeEnemyHUD: ; 79d77 (1e:5d77) ld [hWY], a ld hl, vBGMap1 call BattleAnimCopyTileMapToVRAM +; update BGMap attributes + ld a, [hGBC] + and a + jr z, .notGBC2 + ld c, 11 + callba LoadBGMapAttributes +.notGBC2 xor a ld [hWY], a call SaveScreenTilesToBuffer1 ld hl, vBGMap0 call BattleAnimCopyTileMapToVRAM - call ClearScreen - call Delay3 call LoadScreenTilesFromBuffer1 ld hl, vBGMap1 jp BattleAnimCopyTileMapToVRAM ; b = tile ID list index ; c = base tile ID -CopyTileIDsFromList: ; 79dda (1e:5dda) +CopyTileIDsFromList: ; 79f7b (1e:5f7b) call GetPredefRegisters ld a, c ld [hBaseTileID], a @@ -2917,7 +3127,7 @@ CopyTileIDsFromList: ; 79dda (1e:5dda) pop hl jp CopyTileIDs -ShakeEnemyHUD_ShakeBG: ; 79de9 (1e:5de9) +ShakeEnemyHUD_ShakeBG: ; 79f8a (1e:5f8a) ld a, [hSCX] ld [wTempSCX], a .loop @@ -2937,14 +3147,14 @@ ShakeEnemyHUD_ShakeBG: ; 79de9 (1e:5de9) ld [hSCX], a ret -BattleAnimCopyTileMapToVRAM: ; 79e0d (1e:5e0d) +BattleAnimCopyTileMapToVRAM: ; 79fae (1e:5fae) ld a, h ld [H_AUTOBGTRANSFERDEST + 1], a ld a, l ld [H_AUTOBGTRANSFERDEST], a jp Delay3 - -TossBallAnimation: ; 79e16 (1e:5e16) + +TossBallAnimation: ; 79fb7 (1e:5fb7) ld a,[wIsInBattle] cp a,2 jr z,.BlockBall ; if in trainer battle, play different animation @@ -2987,11 +3197,11 @@ TossBallAnimation: ; 79e16 (1e:5e16) jr nz,.PlayNextAnimation ret -.PokeBallAnimations: ; 79e50 (1e:5e50) +.PokeBallAnimations: ; 79ff1 (1e:5ff1) ; sequence of animations that make up the Poké Ball toss db POOF_ANIM,HIDEPIC_ANIM,SHAKE_ANIM,POOF_ANIM,SHOWPIC_ANIM -.BlockBall ; 5E55 +.BlockBall ; 79ff6 (1e:5ff6) ld a,TOSS_ANIM ld [wAnimationID],a call PlayAnimation @@ -3000,8 +3210,8 @@ TossBallAnimation: ; 79e16 (1e:5e16) ld a,BLOCKBALL_ANIM ld [wAnimationID],a jp PlayAnimation - -PlayApplyingAttackSound: ; 79e6a (1e:5e6a) + +PlayApplyingAttackSound: ; 7a00b (1e:600b) ; 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 @@ -3025,4 +3235,4 @@ PlayApplyingAttackSound: ; 79e6a (1e:5e6a) ld a, b ld [wTempoModifier], a ld a, c - jp PlaySound + jp PlaySound
\ No newline at end of file diff --git a/engine/battle/animations_.asm b/engine/battle/animations_.asm deleted file mode 100644 index d07e0b42..00000000 --- a/engine/battle/animations_.asm +++ /dev/null @@ -1,3238 +0,0 @@ -; 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 [wNumFBTiles],a - ld a,[wFBDestAddr + 1] - ld e,a - ld a,[wFBDestAddr] - ld d,a - xor a - ld [wFBTileCounter],a ; loop counter -.loop - ld a,[wFBTileCounter] - inc a - ld [wFBTileCounter],a - ld a, $2 - ld [wdef5], a - ld a,[wSubAnimTransform] - dec a - jr z,.flipHorizontalAndVertical ; 1 - dec a - jp z,.flipHorizontalTranslateDown ; 2 - dec a - jr z,.flipBaseCoords ; 3 -.noTransformation - ld a,[wBaseCoordY] - add [hl] - ld [de],a ; store Y - inc hl - inc de - ld a,[wBaseCoordX] - jr .finishCopying -.flipBaseCoords - ld a,[wBaseCoordY] - 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,[wBaseCoordX] - ld b,a - ld a,168 - sub b ; flip X base coordinate -.finishCopying ; finish copying values to OAM (when [wSubAnimTransform] not 1 or 2) - add [hl] ; X offset - ld [de],a ; store X - cp 88 - jr c, .asm_78056 - ld a, [wdef5] - inc a - ld [wdef5], a -.asm_78056 - 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 b, a - ld a, [wdef5] - or b - ld [de],a ; store flags - inc de - jp .nextTile -.flipHorizontalAndVertical - ld a,[wBaseCoordY] - 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,[wBaseCoordX] - add [hl] ; X offset - ld b,a - ld a,168 - sub b ; flip X coordinate - ld [de],a ; store X - cp 88 - jr c, .asm_78087 - ld a, [wdef5] - inc a - ld [wdef5], a -.asm_78087 - 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, [wdef5] - or b - ld [de],a - inc de - jp .nextTile -.flipHorizontalTranslateDown - ld a,[wBaseCoordY] - add [hl] - add a,40 ; translate Y coordinate downwards - ld [de],a ; store Y - inc hl - inc de - ld a,[wBaseCoordX] - add [hl] - ld b,a - ld a,168 - sub b ; flip X coordinate - ld [de],a ; store X - cp 88 - jr c, .asm_780c8 - ld a, [wdef5] - inc a - ld [wdef5], a -.asm_780c8 - 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 b, a - ld a, [wdef5] - or b - ld [de],a - inc de -.nextTile - ld a,[wFBTileCounter] - ld c,a - ld a,[wNumFBTiles] - cp c - jp nz,.loop ; go back up if there are more tiles to draw -.afterDrawingTiles - ld a,[wFBMode] - cp a,2 - jr z,.advanceFrameBlockDestAddr; skip delay and don't clean OAM buffer - ld a,[wSubAnimFrameDelay] - ld c,a - call DelayFrames - ld a,[wFBMode] - 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,[wAnimationID] - cp a,GROWL - jr z,.resetFrameBlockDestAddr - call AnimationCleanOAM -.resetFrameBlockDestAddr - ld hl,wOAMBuffer ; OAM buffer - ld a,l - ld [wFBDestAddr + 1],a - ld a,h - ld [wFBDestAddr],a ; set destination address to beginning of OAM buffer - ret -.advanceFrameBlockDestAddr - ld a,e - ld [wFBDestAddr + 1],a - ld a,d - ld [wFBDestAddr],a -.done - ret - -PlayAnimation: ; 78124 (1e:4124) - xor a - ld [$FF8B],a ; it looks like nothing reads this - ld [wSubAnimTransform],a - ld a,[wAnimationID] ; 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 [wSubAnimFrameDelay],a - xor a - sla c - rla - sla c - rla - ld [wWhichBattleAnimTileset],a - 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 [wSubAnimAddrPtr],a - ld a,h - ld [wSubAnimAddrPtr + 1],a - ld l,c - ld h,b - push hl - ld a,[rOBP0] - push af - ld a,[wAnimPalette] - ld [rOBP0],a - call UpdateGBCPal_OBP0 - call LoadAnimationTileset - call LoadSubanimation - call PlaySubanimation - pop af - ld [rOBP0],a - call UpdateGBCPal_OBP0 -.nextAnimationCommand - pop hl - jr .animationLoop -.AnimationOver ; 417B - ret - -LoadSubanimation: ; 781b5 (1e:41b5) - ld a,[wSubAnimAddrPtr + 1] - ld h,a - ld a,[wSubAnimAddrPtr] - 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 [wSubAnimCounter],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 [wSubAnimTransform],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,[wSubAnimCounter] - dec a - ld bc,3 -.loop - add hl,bc - dec a - jr nz,.loop -.storeSubentryAddr - inc de - add hl,de - ld a,l - ld [wSubAnimSubEntryAddr],a - ld a,h - ld [wSubAnimSubEntryAddr + 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: ; 781fb (1e:41fb) - 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: ; 78203 (1e:4203) - ld a,[H_WHOSETURN] - and a - ld a,2 << 5 - ret z - xor a - ret - -; loads tile patterns for battle animations -LoadAnimationTileset: ; 7820b (1e:420b) - ld a,[wWhichBattleAnimTileset] - 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: ; 7822b (1e:422b) - 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: ; 78237 (1e:4237) - INCBIN "gfx/attack_anim_1.2bpp" - -AnimationTileset2: ; 78757 (1e:4757) - INCBIN "gfx/attack_anim_2.2bpp" - -SlotMachineTiles2: ; 78bde (1e:4c17) - INCBIN "gfx/slotmachine2.2bpp" - -MoveAnimation: ; 78d97 (1e:4d97) - push hl - push de - push bc - push af - call WaitForSoundToFinish - call SetAnimationPalette - ld a,[wAnimationID] - 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,[wOptions] - 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 [wSubAnimSubEntryAddr],a - ld [wUnusedD09B],a - ld [wSubAnimTransform],a - dec a - ld [wAnimSoundID],a - pop af - pop bc - pop de - pop hl - ret - -ShareMoveAnimations: ; 78ddf (1e:4ddf) -; some moves just reuse animations from status conditions - ld a,[H_WHOSETURN] - and a - ret z - - ; opponent’s turn - - ld a,[wAnimationID] - - cp a,AMNESIA - ld b,CONF_ANIM - jr z, .replaceAnim - - cp a,REST - ld b,SLP_ANIM - ret nz - -.replaceAnim - ld a,b - ld [wAnimationID],a - ret - -PlayApplyingAttackAnimation: ; 78df6 (1e:4df6) -; 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: ; 78e08 (1e:4e08) - 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: ; 78e14 (1e:4e14) - call PlayApplyingAttackSound - ld b, 8 - jp AnimationShakeScreenVertically - -ShakeScreenHorizontallyHeavy: ; 78e1c (1e:4e1c) - call PlayApplyingAttackSound - ld b, 8 - jp AnimationShakeScreenHorizontallyFast - -ShakeScreenHorizontallySlow: ; 78e24 (1e:4e24) - lb bc, 6, 2 - jr AnimationShakeScreenHorizontallySlow - -BlinkEnemyMonSprite: ; 78e29 (1e:4e29) - call PlayApplyingAttackSound - jp AnimationBlinkEnemyMon - -ShakeScreenHorizontallyLight: ; 78e2f (1e:4e2f) - call PlayApplyingAttackSound - ld b, 2 - jp AnimationShakeScreenHorizontallyFast - -ShakeScreenHorizontallySlow2: ; 78e37 (1e:4e37) - lb bc, 3, 2 - -AnimationShakeScreenHorizontallySlow: ; 78e3a (1e:4e3a) - push bc - push bc -.loop1 - ld a, [rWX] - inc a - ld [rWX], a - ld c, 2 - call DelayFrames - dec b - jr nz, .loop1 - pop bc -.loop2 - ld a, [rWX] - dec a - ld [rWX], a - ld c, 2 - call DelayFrames - dec b - jr nz, .loop2 - pop bc - dec c - jr nz, AnimationShakeScreenHorizontallySlow - ret - -SetAnimationPalette: ; 78e5c (1e:4e5c) - ld a, [wOnSGB] - and a - ld a, $e4 - jr z, .notSGB - ld a, $f0 - ld [wAnimPalette], a - ld b, $e4 - ld a, [wAnimationID] - cp TRADE_BALL_DROP_ANIM - jr c, .next - cp TRADE_BALL_POOF_ANIM + 1 - jr nc, .next - ld b, $f0 -.next - ld a, b - ld [rOBP0], a - ld a, $6c - ld [rOBP1], a - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret -.notSGB - ld a, $e4 - ld [wAnimPalette], a - ld [rOBP0], a - ld a, $6c - ld [rOBP1], a - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -Func_78e98: ; 78e98 (1e:4e98) - call SaveScreenTilesToBuffer2 - xor a - ld [H_AUTOBGTRANSFERENABLED], a - call ClearScreen - ld h, vBGMap0 / $100 - call WriteLowerByteOfBGMapAndEnableBGTransfer - call Delay3 - xor a - ld [H_AUTOBGTRANSFERENABLED], a - call LoadScreenTilesFromBuffer2 - ld h, vBGMap1 / $100 - -WriteLowerByteOfBGMapAndEnableBGTransfer: ; 78eb1 (1e:4eb1) - ld l, vBGMap0 & $ff - call BattleAnimCopyTileMapToVRAM - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a - ret - -PlaySubanimation: ; 78ebb (1e:4ebb) - 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 [wFBDestAddr + 1],a - ld a,h - ld [wFBDestAddr],a - ld a,[wSubAnimSubEntryAddr + 1] - ld h,a - ld a,[wSubAnimSubEntryAddr] - 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 [wBaseCoordY],a - ld a,[hl] - ld [wBaseCoordX],a - pop hl - inc hl - ld a,[hl] ; frame block mode - ld [wFBMode],a - call DrawFrameBlock - call DoSpecialEffectByAnimationId ; run animation-specific function (if there is one) - ld a,[wSubAnimCounter] - dec a - ld [wSubAnimCounter],a - ret z - ld a,[wSubAnimSubEntryAddr + 1] - ld h,a - ld a,[wSubAnimSubEntryAddr] - ld l,a - ld a,[wSubAnimTransform] - cp a,4 ; is the animation reversed? - ld bc,3 - jr nz,.nextSubanimationSubentry - ld bc,-3 -.nextSubanimationSubentry - add hl,bc - ld a,h - ld [wSubAnimSubEntryAddr + 1],a - ld a,l - ld [wSubAnimSubEntryAddr],a - jp .loop - -AnimationCleanOAM: ; 78f30 (1e:4f30) - 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: ; 78f3f (1e:4f3f) - push hl - push de - push bc - ld a,[wAnimationID] - 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: ; 78f5d (1e:4f5d) - 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 FlashScreenEveryFourFrameBlocks - - 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: ; 78fa6 (1e:4fa6) - 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 - call UpdateGBCPal_OBP0 -.skipFlashingEffect - ld a,[wSubAnimCounter] - 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_BALL_TOSS - call PlaySound -.skipPlayingSound - ld a,[wIsInBattle] - 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,[wSubAnimCounter] - cp a,3 - jr z,.moveGhostMarowakLeft - cp a,2 - jr z,.moveGhostMarowakLeft - cp a,1 - ret nz -.moveGhostMarowakLeft - coord hl, 17, 0 - ld de,20 - lb bc, 7, 7 -.loop - push hl - push bc - call AnimCopyRowRight ; move row of tiles left - pop bc - pop hl - add hl,de - dec b - jr nz,.loop - ld a,%00001000 - ld [rNR10],a ; Channel 1 sweep register - ret -.isTrainerBattle ; if it's a trainer battle, shorten the animation by one frame - ld a,[wSubAnimCounter] - cp a,3 - ret nz - dec a - ld [wSubAnimCounter],a - ret - -DoBallShakeSpecialEffects: ; 79001 (1e:5001) - ld a,[wSubAnimCounter] - 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_TINK - call PlaySound - ld c,40 - call DelayFrames -.skipPlayingSound - ld a,[wSubAnimCounter] - 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,[wNumShakes] ; number of shakes - dec a ; decrement number of shakes - ld [wNumShakes],a - ret z -; if there are shakes left, restart the subanimation - ld a,[wSubAnimSubEntryAddr] - ld l,a - ld a,[wSubAnimSubEntryAddr + 1] - ld h,a - ld de,-(4 * 3) ; 4 subentries and 3 bytes per subentry - add hl,de - ld a,l - ld [wSubAnimSubEntryAddr],a - ld a,h - ld [wSubAnimSubEntryAddr + 1],a - ld a,5 ; number of subentries in the ball shaking subanimation plus one - ld [wSubAnimCounter],a - ret - -; plays a sound after the second frame of the poof animation -DoPoofSpecialEffects: ; 79039 (1e:5039) - ld a,[wSubAnimCounter] - cp a,5 - ret nz - ld a,SFX_BALL_POOF - jp PlaySound - -DoRockSlideSpecialEffects: ; 79044 (1e:5044) - ld a,[wSubAnimCounter] - 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: ; 79062 (1e:5062) - ld a,[wSubAnimCounter] - 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: ; 7906b (1e:506b) - ld a,[wSubAnimCounter] - and a,3 - call z,AnimationFlashScreen - ret - -; used for Explosion and Selfdestruct -DoExplodeSpecialEffects: ; 79074 (1e:5074) - ld a,[wSubAnimCounter] - 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 - coord hl, 1, 5 - jp AnimationHideMonPic ; make pokemon disappear - -; flashes the screen when subanimation counter is 1 modulo 4 -DoBlizzardSpecialEffects: ; 79081 (1e:5081) - ld a,[wSubAnimCounter] - 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: ; 79099 (1e:5099) - ld a,[wSubAnimCounter] - 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: ; 790ac (1e:50ac) - ld a,[wSubAnimCounter] - cp a,6 - ret nz - ld a,2 * SCREEN_WIDTH + 7 - jp ClearMonPicFromTileMap ; make pokemon disappear - -; function to make a shaking pokeball jump up at the end of the animation -TradeShakePokeball: ; 790b7 (1e:50b7) - ld a,[wSubAnimCounter] - 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_TRADE_MACHINE - jp PlaySound - -BallMoveDistances1: ; 790e3 (1e:50e3) - db -12,-12,-8 - db $ff ; terminator - -; function to make the pokeball jump up -TradeJumpPokeball: ; 790e7 (1e:50e7) - 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_BATTLE_18 - 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: ; 7911f (1e:511f) - 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: ; 79127 (1e:5127) - ld hl,wOAMBuffer ; OAM buffer - ld de,wOAMBuffer + $10 - ld bc,$10 - call CopyData ; copy the musical note graphic - ld a,[wSubAnimCounter] - 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: ; 7913b (1e:513b) - ld a,1 - ld [wSubAnimCounter],a - ld c,20 - jp DelayFrames - -SpecialEffectPointers: ; 79145 (1e:5145) - 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_OFF ; $F4 - dw AnimationSlideMonOff - 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_OFF ; $E5 - dw AnimationSlideMonHalfOff - 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_OFF ; $DB - dw AnimationSlideEnemyMonOff - 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: ; 791bb (1e:51bb) - 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: ; 791c0 (1e:51c0) - 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: ; 791d0 (1e:51d0) - ld a,3 ; cycle through the palettes 3 times - ld [wFlashScreenLongCounter],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 UpdateGBCPal_BGP - call FlashScreenLongDelay - jr .innerLoop -.endOfPalettes - ld a,[wFlashScreenLongCounter] - dec a - ld [wFlashScreenLongCounter],a - pop hl - jr nz,.loop - ret - -; BG palettes -FlashScreenLongMonochrome: ; 791fc (1e:51fc) - 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: ; 79209 (1e:5209) - 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: ; 79216 (1e:5216) - ld a,[wFlashScreenLongCounter] - cp a,4 ; never true since [wFlashScreenLongCounter] 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: ; 7922c (1e:522c) - ld a,[rBGP] - push af ; save initial palette - ld a,%00011011 ; 0, 1, 2, 3 (inverted colors) - ld [rBGP],a - call UpdateGBCPal_BGP - ld c,2 - call DelayFrames - xor a ; white out background - ld [rBGP],a - call UpdateGBCPal_BGP - ld c,2 - call DelayFrames - pop af - ld [rBGP],a ; restore initial palette - call UpdateGBCPal_BGP - ret - -AnimationDarkScreenPalette: ; 7924d (1e:524d) -; Changes the screen's palette to a dark palette. - lb bc, $6f, $6f - jr SetAnimationBGPalette - -AnimationDarkenMonPalette: ; 79252 (1e:5252) -; Darkens the mon sprite's palette. - lb bc, $f9, $f4 - jr SetAnimationBGPalette - -AnimationUnusedPalette1: ; 79257 (1e:5257) - lb bc, $fe, $f8 - jr SetAnimationBGPalette - -AnimationUnusedPalette2: ; 7925c (1e:525c) - lb bc, $ff, $ff - jr SetAnimationBGPalette - -AnimationResetScreenPalette: ; 79261 (1e:5261) -; Restores the screen's palette to the normal palette. - lb bc, $e4, $e4 - jr SetAnimationBGPalette - -AnimationUnusedPalette3: ; 79266 (1e:5266) - lb bc, $00, $00 - jr SetAnimationBGPalette - -AnimationLightScreenPalette: ; 7926b (1e:526b) -; Changes the screen to use a palette with light colors. - lb bc, $90, $90 - jr SetAnimationBGPalette - -AnimationUnusedPalette4: ; 79270 (1e:5270) - lb bc, $40, $40 - -SetAnimationBGPalette: ; 79273 (1e:5273) - ld a, [wOnSGB] - and a - ld a, b - jr z, .next - ld a, c -.next - ld [rBGP], a - call UpdateGBCPal_BGP - ret - - ld b, $5 - -AnimationShakeScreenVertically: ; 79283 (1e:5283) - predef_jump PredefShakeScreenVertically - -AnimationShakeScreen: ; 79288 (1e:5288) -; Shakes the screen for a while. Used in Earthquake/Fissure/etc. animations. - ld b, $8 - -AnimationShakeScreenHorizontallyFast: ; 7928a (1e:528a) - predef_jump PredefShakeScreenHorizontally - -AnimationWaterDropletsEverywhere: ; 7928f (1e:528f) -; 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 [wWhichBattleAnimTileset], a - call LoadAnimationTileset - ld d, 32 - ld a, -16 - ld [wBaseCoordX], a - ld a, $71 - ld [wDropletTile], a -.loop - ld a, 16 - ld [wBaseCoordY], a - ld a, 0 - ld [wUnusedD08A], a - call _AnimationWaterDroplets - ld a, 24 - ld [wBaseCoordY], a - ld a, 32 - ld [wUnusedD08A], a - call _AnimationWaterDroplets - dec d - jr nz, .loop - ret - -_AnimationWaterDroplets: ; 792c0 (1e:52c0) - ld hl, wOAMBuffer -.loop - ld a, $1 - ld [wdef5], a - ld a, [wBaseCoordY] - ld [hli], a ; Y - cp 40 - jr c, .asm_792d7 - ld a, [wdef5] - inc a - ld [wdef5], a -.asm_792d7 - ld a, [wBaseCoordX] - add 27 - ld [wBaseCoordX], a - ld [hli], a ; X - cp 88 - jr c, .asm_792ee - ld a, [wdef5] - add $2 - and $3 - ld [wdef5], a -.asm_792ee - ld a, [wDropletTile] - ld [hli], a ; tile - ld a, [wdef5] - ld [hli], a ; attribute - ld a, [wBaseCoordX] - cp 144 - jr c, .loop - sub 168 - ld [wBaseCoordX], a - ld a, [wBaseCoordY] - add 16 - ld [wBaseCoordY], a - cp 112 - jr c, .loop - call AnimationCleanOAM - jp DelayFrame - -AnimationSlideMonUp: ; 79314 (1e:5314) -; Slides the mon's sprite upwards. - ld c, 7 - ld a, [H_WHOSETURN] - and a - coord hl, 1, 6 - coord de, 1, 5 - ld a, $30 - jr z, .next - coord hl, 12, 1 - coord de, 12, 0 - ld a, $ff -.next - ld [wSlideMonUpBottomRowLeftTile], a - jp _AnimationSlideMonUp - -AnimationSlideMonDown: ; 79331 (1e:5331) -; Slides the mon's sprite down out of the screen. - xor a - call GetTileIDList -.loop - call GetMonSpriteTileMapPointerFromRowCount - push bc - push de - call CopyPicTiles - call Delay3 - call AnimationHideMonPic - pop de - pop bc - dec b - jr nz, .loop - ret - -AnimationSlideMonOff: ; 79349 (1e:5349) -; Slides the mon's sprite off the screen horizontally. - ld e, 8 - ld a, 3 - ld [wSlideMonDelay], a - jp _AnimationSlideMonOff - -AnimationSlideEnemyMonOff: ; 79353 (1e:5353) -; Slides the enemy mon off the screen horizontally. - ld hl, AnimationSlideMonOff - jp CallWithTurnFlipped - -_AnimationSlideMonUp: ; 79359 (1e:5359) - push de - push hl - push bc - -; In each iteration, slide up all rows but the top one (which is overwritten). - ld b, 6 -.slideLoop - push bc - push de - push hl - ld bc, 7 - call CopyData -; Note that de and hl are popped in the same order they are pushed, swapping -; their values. When CopyData is called, hl points to a tile 1 row below -; the one de points to. To maintain this relationship, after swapping, we add 2 -; rows to hl so that it is 1 row below again. - pop de - pop hl - ld bc, SCREEN_WIDTH * 2 - add hl, bc - pop bc - dec b - jr nz, .slideLoop - -; Fill in the bottom row of the mon pic with the next row's tile IDs. - ld a, [H_WHOSETURN] - and a - coord hl, 1, 11 - jr z, .next - coord hl, 12, 6 -.next - ld a, [wSlideMonUpBottomRowLeftTile] - inc a - ld [wSlideMonUpBottomRowLeftTile], a - ld c, 7 -.fillBottomRowLoop - ld [hli], a - add 7 - dec c - jr nz, .fillBottomRowLoop - - ld c, 2 - call DelayFrames - pop bc - pop hl - pop de - dec c - jr nz, _AnimationSlideMonUp - ret - -ShakeEnemyHUD_WritePlayerMonPicOAM: ; 79397 (1e:5397) -; Writes the OAM entries for a copy of the player mon's pic in OAM. -; The top 5 rows are reproduced in OAM, although only 2 are actually needed. - ld a, $10 - ld [wBaseCoordX], a - ld a, $30 - ld [wBaseCoordY], a - ld hl, wOAMBuffer - ld d, 0 - ld c, 7 -.loop - ld a, [wBaseCoordY] - ld e, a - ld b, 5 -.innerLoop - call BattleAnimWriteOAMEntry - inc d - dec b - jr nz, .innerLoop - dec c - ret z - inc d - inc d - ld a, [wBaseCoordX] - add 8 - ld [wBaseCoordX], a - jr .loop - -BattleAnimWriteOAMEntry: ; 793c3 (1e:53c3) -; Y coordinate = e (increased by 8 each call, before the write to OAM) -; X coordinate = [wBaseCoordX] -; tile = d -; attributes = variable (dependant on coords) - ld a, $1 - ld [wdef5], a - ld a, e - add 8 - ld e, a - ld [hli], a - cp 40 - jr c, .asm_793d8 - ld a, [wdef5] - inc a - ld [wdef5], a -.asm_793d8 - ld a, [wBaseCoordX] - ld [hli], a - cp 88 - jr c, .asm_793e8 - ld a, [wdef5] - add $2 - ld [wdef5], a -.asm_793e8 - ld a, d - ld [hli], a - ld a, [wdef5] - ld [hli], a - ret - -AdjustOAMBlockXPos: ; 793ef (1e:53ef) - ld l, e - ld h, d - -AdjustOAMBlockXPos2: ; 793f1 (1e:53f1) - ld de, 4 -.loop - ld a, [wCoordAdjustmentAmount] - ld b, a - ld a, [hl] - add b - cp 168 - jr c, .skipPuttingEntryOffScreen -; put off-screen if X >= 168 - dec hl - ld a, 160 - ld [hli], a -.skipPuttingEntryOffScreen - ld [hl], a - add hl, de - dec c - jr nz, .loop - ret - -AdjustOAMBlockYPos: ; 79408 (1e:5408) - ld l, e - ld h, d - -AdjustOAMBlockYPos2: ; 7940d (1e:540d) - ld de, 4 -.loop - ld a, [wCoordAdjustmentAmount] - ld b, a - ld a, [hl] - add b - cp 112 - jr c, .skipSettingPreviousEntrysAttribute - dec hl - ld a, 160 ; bug, sets previous OAM entry's attribute - ld [hli], a -.skipSettingPreviousEntrysAttribute - ld [hl], a - add hl, de - dec c - jr nz, .loop - ret - -AnimationBlinkEnemyMon: ; 79421 (1e:5421) - ; Make the enemy mon's sprite blink on and off for a second or two - ld hl, AnimationBlinkMon - jp CallWithTurnFlipped - -AnimationBlinkMon: ; 79427 (1e:5427) -; Make the mon's sprite blink on and off for a second or two. - push af - ld c, 6 -.loop - push bc - call AnimationHideMonPic - ld c, 5 - call DelayFrames - call AnimationShowMonPic - ld c, 5 - call DelayFrames - pop bc - dec c - jr nz, .loop - pop af - ret - -AnimationFlashMonPic: ; 79441 (1e:5441) -; Flashes the mon's sprite on and off - ld a, [wBattleMonSpecies] - ld [wChangeMonPicPlayerTurnSpecies], a - ld a, [wEnemyMonSpecies] - ld [wChangeMonPicEnemyTurnSpecies], a - jp ChangeMonPic - -AnimationFlashEnemyMonPic: ; 79450 (1e:5450) -; Flashes the enemy mon's sprite on and off - ld hl, AnimationFlashMonPic - jp CallWithTurnFlipped - -AnimationShowMonPic: ; 79456 (1e:5456) - xor a - call GetTileIDList - call GetMonSpriteTileMapPointerFromRowCount - call CopyPicTiles - jp Delay3 - -AnimationShowEnemyMonPic: ; 79463 (1e:5463) -; 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: ; 79469 (1e:5469) -; 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 - coord hl, 0, 5 - coord de, 2, 5 - jr z, .next - coord hl, 11, 0 - coord de, 13, 0 - -.next - xor a - ld c, $10 -.loop - 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 - lb bc, 7, 9 - call ClearScreenArea - pop af - call GetTileIDList - pop hl - call CopyPicTiles - call Delay3 - pop hl - lb bc, 7, 9 - call ClearScreenArea - pop hl - pop de - pop bc - pop af - dec c - jr nz, .loop - ret - -AnimationMoveMonHorizontally: ; 794b1 (1e:54b1) -; 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 - coord hl, 2, 5 - jr z, .next - coord hl, 11, 0 -.next - xor a - push hl - call GetTileIDList - pop hl - call CopyPicTiles - ld c, 3 - jp DelayFrames - -AnimationResetMonPosition: ; 794cd (1e:54cd) -; Resets the mon's sprites to be located at the normal coordinates. - ld a, [H_WHOSETURN] - and a - ld a, 5 * SCREEN_WIDTH + 2 - jr z, .next - ld a, 11 -.next - call ClearMonPicFromTileMap - jp AnimationShowMonPic - -AnimationSpiralBallsInward: ; 794dc (1e:54dc) -; Creates an effect that looks like energy balls spiralling into the -; player mon's sprite. Used in Focus Energy, for example. - ld a, [H_WHOSETURN] - and a - jr z, .playerTurn - ld a, -40 - ld [wSpiralBallsBaseY], a - ld a, 80 - ld [wSpiralBallsBaseX], a - jr .next -.playerTurn - xor a - ld [wSpiralBallsBaseY], a - ld [wSpiralBallsBaseX], a -.next - ld d, $7a ; ball tile - ld c, 3 ; number of balls - xor a - call InitMultipleObjectsOAM - ld hl, SpiralBallAnimationCoordinates -.loop - push hl - ld c, 3 - ld de, wOAMBuffer -.innerLoop - ld a, [hl] - cp $ff - jr z, .done - ld a, $2 - ld [wdef5], a - ld a, [wSpiralBallsBaseY] - add [hl] - ld [de], a ; Y - inc de - inc hl - ld a, [wSpiralBallsBaseX] - add [hl] - ld [de], a ; X - cp 88 - jr c, .asm_79524 - ld a, $3 - ld [wdef5], a -.asm_79524 - inc hl - inc de - inc de - ld a, [de] - and $f0 - ld b, a - ld a, [wdef5] - or b - ld [de], a - inc de - dec c - jr nz, .innerLoop - ld c, 5 - call DelayFrames - pop hl - inc hl - inc hl - jr .loop -.done - pop hl - call AnimationCleanOAM - jp AnimationFlashScreen - -SpiralBallAnimationCoordinates: ; 79545 (1e:5545) -; y, x pairs -; This is the sequence of screen coordinates that the spiralling -; 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: ; 79570 (1e:5570) -; Squishes the mon's sprite horizontally making it -; disappear. Used by Teleport/Sky Attack animations. - ld c, 4 -.loop - push bc - ld a, [H_WHOSETURN] - and a - jr z, .playerTurn - coord hl, 16, 0 - coord de, 14, 0 - jr .next -.playerTurn - coord hl, 5, 5 - coord de, 3, 5 -.next - push de - xor a ; left - ld [wSquishMonCurrentDirection], a - call _AnimationSquishMonPic - pop hl - ld a, 1 ; right - ld [wSquishMonCurrentDirection], a - call _AnimationSquishMonPic - pop bc - dec c - jr nz, .loop - call AnimationHideMonPic - ld c, 2 - jp DelayFrame - -_AnimationSquishMonPic: ; 795a3 (1e:55a3) - ld c, 7 -.loop - push bc - push hl - ld c, 3 - ld a, [wSquishMonCurrentDirection] - cp 0 - jr nz, .right - call AnimCopyRowLeft - dec hl - jr .next -.right - call AnimCopyRowRight - inc hl -.next - ld [hl], " " - pop hl - ld de, SCREEN_WIDTH - add hl, de - pop bc - dec c - jr nz, .loop - jp Delay3 - -AnimationShootBallsUpward: ; 795c8 (1e:55c8) -; Shoots one pillar of "energy" balls upwards. Used in Teleport/Sky Attack -; animations. - ld a, [H_WHOSETURN] - and a - jr z, .playerTurn - lb bc, 0, 16 * 8 - jr .next -.playerTurn - lb bc, 6 * 8, 5 * 8 -.next - ld a, b - ld [wBaseCoordY], a - ld a, c - ld [wBaseCoordX], a - lb bc, 5, 1 - call _AnimationShootBallsUpward - jp AnimationCleanOAM - -_AnimationShootBallsUpward: ; 795e6 (1e:55e6) - push bc - xor a - ld [wWhichBattleAnimTileset], a - call LoadAnimationTileset - pop bc - ld d, $7a ; ball tile - ld hl, wOAMBuffer - push bc - ld a, [wBaseCoordY] - ld e, a -.initOAMLoop - call BattleAnimWriteOAMEntry - dec b - jr nz, .initOAMLoop - call DelayFrame - pop bc - ld a, b - ld [wNumShootingBalls], a -.loop - push bc - ld hl, wOAMBuffer -.innerLoop - ld a, [wBaseCoordY] - add 8 - ld e, a - ld a, [hl] - cp e ; has the ball reached the top? - jr z, .reachedTop - add -4 ; ball hasn't reached the top. move it up 4 pixels - ld [hl], a - jr .next -.reachedTop -; remove the ball once it has reached the top - ld [hl], 0 ; put it off-screen - ld a, [wNumShootingBalls] - dec a - ld [wNumShootingBalls], a -.next - ld de, 4 - add hl, de ; next OAM entry - dec b - jr nz, .innerLoop - call DelayFrames - pop bc - ld a, [wNumShootingBalls] - and a - jr nz, .loop - ret - -AnimationShootManyBallsUpward: ; 79635 (1e:5635) -; 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 [wSavedY], a -.loop - ld a, [wSavedY] - ld [wBaseCoordY], a - ld a, [hli] - cp $ff - jp z, AnimationCleanOAM - ld [wBaseCoordX], a - lb bc, 4, 1 - push hl - call _AnimationShootBallsUpward - pop hl - jr .loop - -UpwardBallsAnimXCoordinatesPlayerTurn: ; 79660 (1e:5660) -; 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: ; 79667 (1e:5667) -; 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: ; 7966e (1e:566e) -; Changes the mon's sprite to a mini black sprite. Used by the -; Minimize animation. - ld hl, wTempPic - push hl - xor a - ld bc, 7 * 7 * $10 - call FillMemory - pop hl - ld de, $194 - add hl, de - ld de, MinimizedMonSprite - ld c, MinimizedMonSpriteEnd - MinimizedMonSprite -.loop - ld a, [de] - ld [hli], a - ld [hli], a - inc de - dec c - jr nz, .loop - call CopyTempPicToMonPic - call Delay3 - jp AnimationShowMonPic - -MinimizedMonSprite: ; 79693 (1e:5693) - INCBIN "gfx/minimized_mon_sprite.1bpp" -MinimizedMonSpriteEnd: - -AnimationSlideMonDownAndHide: ; 79698 (1e:5698) -; Slides the mon's sprite down and disappears. Used in Acid Armor. - ld a, $1 - ld c, $2 -.loop - 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, .loop - call AnimationHideMonPic - ld hl, wTempPic - ld bc, $0310 - xor a - call FillMemory - jp CopyTempPicToMonPic - -_AnimationSlideMonOff: ; 796c7 (1e:56c7) -; Slides the mon's sprite off the screen horizontally by e tiles and waits -; [wSlideMonDelay] V-blanks each time the pic is slid by one tile. - ld a, [H_WHOSETURN] - and a - jr z, .playerTurn - coord hl, 12, 0 - jr .next -.playerTurn - coord hl, 0, 5 -.next - ld d, 8 ; d's value is unused -.slideLoop ; iterates once for each time the pic slides by one tile - push hl - ld b, 7 -.rowLoop ; iterates once for each row - ld c, 8 -.tileLoop ; iterates once for each tile in the row - ld a, [H_WHOSETURN] - and a - jr z, .playerTurn2 - call .EnemyNextTile - jr .next2 -.playerTurn2 - call .PlayerNextTile -.next2 - ld [hli], a - dec c - jr nz, .tileLoop - push de - ld de, SCREEN_WIDTH - 8 - add hl, de - pop de - dec b - jr nz, .rowLoop - ld a, [wSlideMonDelay] - ld c, a - call DelayFrames - pop hl - dec d - dec e - jr nz, .slideLoop - ret - -; Since mon pic tile numbers go from top to bottom, left to right in order, -; adding the height of the mon pic in tiles to a tile number gives the tile -; number of the tile one column to the right (and thus subtracting the height -; gives the reverse). If the next tile would be past the edge of the pic, the 2 -; functions below catch it by checking if the tile number is within the valid -; range and if not, replacing it with a blank tile. - -.PlayerNextTile ; 79702 (1e:5702) - ld a, [hl] - add 7 -; bugfix: compares against the max tile + 1 as opposed to the max tile - cp $62 - ret c - ld a, " " - ret - -.EnemyNextTile ; 7970b (1e:570b) - ld a, [hl] - sub 7 -; This has the same problem as above, but it has no visible effect because -; the lower right tile is in the first column to slide off the screen. - cp $30 - ret c - ld a, " " - ret - -AnimationSlideMonHalfOff: ; 79714 (1e:5714) -; Slides the mon's sprite halfway off the screen. It's used in Softboiled. - ld e, 4 - ld a, 4 - ld [wSlideMonDelay], a - call _AnimationSlideMonOff - jp Delay3 - -CopyTempPicToMonPic: ; 79721 (1e:5721) - ld a, [H_WHOSETURN] - and a - ld hl, vBackPic ; player turn - jr z, .next - ld hl, vFrontPic ; enemy turn -.next - ld de, wTempPic - ld bc, 7 * 7 - jp CopyVideoData - -AnimationWavyScreen: ; 79735 (1e:5735) -; used in Psywave/Psychic etc. - ld hl, vBGMap0 - call BattleAnimCopyTileMapToVRAM - call Delay3 - xor a - ld [H_AUTOBGTRANSFERENABLED], a - ld a, SCREEN_HEIGHT_PIXELS - ld [hWY], a - ld d, $80 ; terminator - ld e, SCREEN_HEIGHT_PIXELS - 1 - ld c, $ff - ld hl, WavyScreenLineOffsets -.loop - push hl -.innerLoop - call WavyScreen_SetSCX - ld a, [rLY] - cp e ; is it the last visible line in the frame? - jr nz, .innerLoop ; keep going if not - pop hl - inc hl - ld a, [hl] - cp d ; have we reached the end? - jr nz, .next - ld hl, WavyScreenLineOffsets ; go back to the beginning if so -.next - dec c - jr nz, .loop - xor a - ld [hWY], a - call SaveScreenTilesToBuffer2 - call ClearScreen - ld a, 1 - ld [H_AUTOBGTRANSFERENABLED], a - call Delay3 - call LoadScreenTilesFromBuffer2 - ld hl, vBGMap1 - call BattleAnimCopyTileMapToVRAM - ret - -WavyScreen_SetSCX: ; 7977d (1e:577d) - ld a, [rSTAT] - and $3 ; is it H-blank? - jr nz, WavyScreen_SetSCX ; wait until it's H-blank - ld a, [hl] - ld [rSCX], a - inc hl - ld a, [hl] - cp d ; have we reached the end? - ret nz - ld hl, WavyScreenLineOffsets ; go back to the beginning if so - ret - -WavyScreenLineOffsets: ; 7978e (1e:578e) -; 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: ; 797af (1e:57af) -; Changes the pokemon's sprite to the mini sprite - ld hl, wTempPic - xor a - ld bc, $0310 - call FillMemory - ld a, [H_WHOSETURN] - and a - jr z, .playerTurn - 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 .next -.playerTurn - 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 -.next - call CopyTempPicToMonPic - jp AnimationShowMonPic - -CopySlowbroSpriteData: ; 7980e (1e:580e) - ld bc, $0010 - ld a, BANK(SlowbroSprite) - jp FarCopyData - -HideSubstituteShowMonAnim: ; 79816 (1e:5816) - ld a, [H_WHOSETURN] - and a - ld hl, wPlayerMonMinimized - ld de, wPlayerBattleStatus1 - ld bc, wPlayerMoveNum - ld a, [wPlayerBattleStatus2] - jr z, .next1 - ld hl, wEnemyMonMinimized - ld de, wEnemyBattleStatus1 - ld bc, wEnemyMoveNum - ld a, [wEnemyBattleStatus2] -.next1 - push hl - push de - push bc -; if the substitute broke, slide it down, else slide it offscreen horizontally - bit HasSubstituteUp, a - jr nz, .substituteStillUp - call AnimationSlideMonDown - jr .next2 -.substituteStillUp - call AnimationSlideMonOff -.next2 - pop bc - pop de - ld a, [de] - bit Invulnerable, a - pop hl - jr nz, .invulnerable - ld a, [bc] - cp FLY - jr z, .flyOrDig - cp DIG - jr z, .flyOrDig -.invulnerable - ld a, [hl] - and a - jp nz, AnimationMinimizeMon - call AnimationFlashMonPic - jp AnimationShowMonPic -.flyOrDig - ld a, [H_WHOSETURN] - and a - jr nz, .enemy - ld a, [wPlayerMonMinimized] - and a - jr nz, .monIsMinimized - ld a, [wBattleMonSpecies] - ld [wcf91], a - ld [wd0b5], a - call GetMonHeader - predef LoadMonBackPic - ret -.enemy - ld a, [wEnemyMonMinimized] - and a - jr nz, .monIsMinimized - ld a, [wEnemyMonSpecies] - ld [wcf91], a - ld [wd0b5], a - call GetMonHeader - ld de, vFrontPic - jp LoadMonFrontSprite -.monIsMinimized - ld hl, wTempPic - push hl - xor a - ld bc, 7 * 7 * $10 - call FillMemory - pop hl - ld de, $194 - add hl, de - ld de, MinimizedMonSprite - ld c, MinimizedMonSpriteEnd - MinimizedMonSprite -.loop - ld a, [de] - ld [hli], a - ld [hli], a - inc de - dec c - jr nz, .loop - jp CopyTempPicToMonPic - -ReshowSubstituteAnim: ; 798b2 (1e:58b2) - call AnimationSlideMonOff - call AnimationSubstitute - jp AnimationShowMonPic - -AnimationBoundUpAndDown: ; 798bb (1e:58bb) -; Bounces the mon's sprite up and down several times. It is used -; by Splash's animation. - ld c, 5 -.loop - push bc - call AnimationSlideMonDown - pop bc - dec c - jr nz, .loop - jp AnimationShowMonPic - -AnimationTransformMon: ; 798c8 (1e:58c8) -; Redraws this mon's sprite as the back/front sprite of the opposing mon. -; Used in Transform. - ld a, [wEnemyMonSpecies] - ld [wChangeMonPicPlayerTurnSpecies], a - ld a, [wBattleMonSpecies] - ld [wChangeMonPicEnemyTurnSpecies], a - -ChangeMonPic: ; 798d4 (1e:58d4) - ld a, [H_WHOSETURN] - and a - jr z, .playerTurn - ld a, [wChangeMonPicEnemyTurnSpecies] - ld [wcf91], a - ld [wd0b5], a - xor a - ld [W_SPRITEFLIPPED], a - call GetMonHeader - coord hl, 12, 0 - call LoadFrontSpriteByMonIndex - jr .done -.playerTurn - ld a, [wBattleMonSpecies2] - push af - ld a, [wChangeMonPicPlayerTurnSpecies] - ld [wBattleMonSpecies2], a - ld [wd0b5], a - call GetMonHeader - predef LoadMonBackPic - xor a - call GetTileIDList - call GetMonSpriteTileMapPointerFromRowCount - call CopyPicTiles - pop af - ld [wBattleMonSpecies2], a -.done - ld b, SET_PAL_BATTLE - jp RunPaletteCommand - -AnimationHideEnemyMonPic: ; 79919 (1e:5919) -; 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_79929: ; 79929 (1e:5929) - ld hl, wPlayerMonMinimized - ld a, [H_WHOSETURN] - and a - jr z, .playerTurn - ld hl, wEnemyMonMinimized -.playerTurn - ld a, [hl] - and a - jr z, .notMinimized - call AnimationMinimizeMon - ret -.notMinimized - call AnimationFlashMonPic - call AnimationShowMonPic - ret - -InitMultipleObjectsOAM: ; 79943 (1e:5943) -; Writes c OAM entries with tile d. -; Sets their Y coordinates to sequential multiples of 8, starting from 0. -; Sets their X coordinates to 0. -; Loads animation tileset a. - push bc - push de - ld [wWhichBattleAnimTileset], a - call LoadAnimationTileset - pop de - pop bc - xor a - ld e, a - ld [wBaseCoordX], a - ld hl, wOAMBuffer -.loop - call BattleAnimWriteOAMEntry - dec c - jr nz, .loop - ret - - ret ; unreferenced - -AnimationHideMonPic: ; 7995d (1e:595d) -; Hides the mon's sprite. - ld a, [H_WHOSETURN] - and a - jr z, .playerTurn - ld a, 12 - jr ClearMonPicFromTileMap -.playerTurn - ld a, 5 * SCREEN_WIDTH + 1 - -ClearMonPicFromTileMap: ; 79968 (1e:5968) - push hl - push de - push bc - ld e, a - ld d, 0 - coord hl, 0, 0 - add hl, de - lb bc, 7, 7 - 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: ; 7997c (1e:597c) - push de - ld a, [H_WHOSETURN] - and a - jr nz, .enemyTurn - ld a, 20 * 5 + 1 - jr .next -.enemyTurn - ld a, 12 -.next - coord hl, 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: ; 7999e (1e:599e) - 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 - -AnimCopyRowLeft: ; 798b7 (1e:58b7) -; copy a row of c tiles 1 tile left - ld a, [hld] - ld [hli], a - inc hl - dec c - jr nz, AnimCopyRowLeft - ret - -AnimCopyRowRight: ; 799be (1e:59be) -; copy a row of c tiles 1 tile right - ld a, [hli] - ld [hld], a - dec hl - dec c - jr nz, AnimCopyRowRight - ret - -; get the sound of the move id in b -GetMoveSoundB: ; 799c5 (1e:59c5) - ld a, b - call GetMoveSound - ld b, a - ret - -GetMoveSound: ; 799cb (1e:59cb) - 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,[wFrequencyModifier] - add [hl] - ld [wFrequencyModifier],a - inc hl - ld a,[wTempoModifier] - add [hl] - ld [wTempoModifier],a - jr .done -.NotCryMove - ld a,[hli] - ld [wFrequencyModifier],a - ld a,[hli] - ld [wTempoModifier],a -.done - ld a,b - ret - -IsCryMove: ; 79a09 (1e:5a09) -; set carry if the move animation involves playing a monster cry - ld a,[wAnimationID] - cp a,GROWL - jr z,.CryMove - cp a,ROAR - jr z,.CryMove - and a ; clear carry - ret -.CryMove - scf - ret - -MoveSoundTable: ; 79a18 (1e:5a18) - db SFX_POUND, $00,$80 ; POUND - db SFX_BATTLE_0C, $10,$80 ; KARATE_CHOP - db SFX_DOUBLESLAP, $00,$80 ; DOUBLESLAP - db SFX_BATTLE_0B, $01,$80 ; COMET_PUNCH - db SFX_BATTLE_0D, $00,$40 ; MEGA_PUNCH - db SFX_SILPH_SCOPE, $00,$ff ; PAY_DAY - db SFX_BATTLE_0D, $10,$60 ; FIRE_PUNCH - db SFX_BATTLE_0D, $20,$80 ; ICE_PUNCH - db SFX_BATTLE_0D, $00,$a0 ; THUNDERPUNCH - db SFX_DAMAGE, $00,$80 ; SCRATCH - db SFX_BATTLE_0F, $20,$40 ; VICEGRIP - db SFX_BATTLE_0F, $00,$80 ; GUILLOTINE - db SFX_BATTLE_0E, $00,$a0 ; RAZOR_WIND - db SFX_NOT_VERY_EFFECTIVE,$10,$c0 ; SWORDS_DANCE - db SFX_NOT_VERY_EFFECTIVE,$00,$a0 ; CUT - db SFX_BATTLE_12, $00,$c0 ; GUST - db SFX_BATTLE_12, $10,$a0 ; WING_ATTACK - db SFX_BATTLE_13, $00,$e0 ; WHIRLWIND - db SFX_NOT_VERY_EFFECTIVE,$20,$c0 ; FLY - db SFX_BATTLE_14, $00,$80 ; BIND - db SFX_BATTLE_22, $00,$80 ; SLAM - db SFX_VINE_WHIP, $01,$80 ; VINE_WHIP - db SFX_BATTLE_20, $00,$80 ; STOMP - db SFX_BATTLE_17, $f0,$40 ; DOUBLE_KICK - db SFX_SUPER_EFFECTIVE, $00,$80 ; MEGA_KICK - db SFX_BATTLE_17, $00,$80 ; JUMP_KICK - db SFX_BATTLE_21, $10,$80 ; ROLLING_KICK - db SFX_BATTLE_1B, $01,$a0 ; SAND_ATTACK - db SFX_BATTLE_18, $00,$80 ; HEADBUTT - db SFX_BATTLE_1E, $00,$60 ; HORN_ATTACK - db SFX_BATTLE_1E, $01,$40 ; FURY_ATTACK - db SFX_HORN_DRILL, $00,$a0 ; HORN_DRILL - db SFX_SUPER_EFFECTIVE, $10,$a0 ; TACKLE - db SFX_BATTLE_20, $00,$c0 ; BODY_SLAM - db SFX_BATTLE_14, $10,$60 ; WRAP - db SFX_SUPER_EFFECTIVE, $00,$a0 ; TAKE_DOWN - db SFX_BATTLE_22, $11,$c0 ; THRASH - db SFX_SUPER_EFFECTIVE, $20,$c0 ; DOUBLE_EDGE - db SFX_BATTLE_21, $00,$80 ; TAIL_WHIP - db SFX_BATTLE_1B, $00,$80 ; POISON_STING - db SFX_BATTLE_1B, $20,$c0 ; TWINEEDLE - db SFX_BATTLE_19, $00,$80 ; PIN_MISSILE - db SFX_BATTLE_31, $ff,$40 ; LEER - db SFX_BATTLE_1E, $00,$80 ; BITE - db SFX_BATTLE_0B, $00,$c0 ; GROWL - db SFX_BATTLE_0B, $00,$40 ; ROAR - db SFX_BATTLE_35, $00,$80 ; SING - db SFX_BATTLE_27, $40,$60 ; SUPERSONIC - db SFX_BATTLE_27, $00,$80 ; SONICBOOM - db SFX_BATTLE_27, $ff,$40 ; DISABLE - db SFX_BATTLE_2A, $80,$c0 ; ACID - db SFX_BATTLE_19, $10,$a0 ; EMBER - db SFX_BATTLE_19, $21,$e0 ; FLAMETHROWER - db SFX_BATTLE_29, $00,$80 ; MIST - db SFX_BATTLE_24, $20,$60 ; WATER_GUN - db SFX_BATTLE_2A, $00,$80 ; HYDRO_PUMP - db SFX_BATTLE_2C, $00,$80 ; SURF - db SFX_BATTLE_28, $40,$80 ; ICE_BEAM - db SFX_BATTLE_29, $f0,$e0 ; BLIZZARD - db SFX_PSYBEAM, $00,$80 ; PSYBEAM - db SFX_BATTLE_2A, $f0,$60 ; BUBBLEBEAM - db SFX_BATTLE_28, $00,$80 ; AURORA_BEAM - db SFX_BATTLE_36, $00,$80 ; HYPER_BEAM - db SFX_PECK,$01, $a0 ; PECK - db SFX_BATTLE_13, $f0,$20 ; DRILL_PECK - db SFX_BATTLE_23, $01,$c0 ; SUBMISSION - db SFX_BATTLE_23, $00,$80 ; LOW_KICK - db SFX_SUPER_EFFECTIVE, $00,$e0 ; COUNTER - db SFX_BATTLE_26, $01,$60 ; SEISMIC_TOSS - db SFX_BATTLE_26, $20,$40 ; STRENGTH - db SFX_BATTLE_24, $00,$80 ; ABSORB - db SFX_BATTLE_24, $40,$c0 ; MEGA_DRAIN - db SFX_BATTLE_1B, $03,$60 ; LEECH_SEED - db SFX_BATTLE_25, $11,$e0 ; GROWTH - db SFX_BATTLE_12, $20,$e0 ; RAZOR_LEAF - db SFX_BATTLE_2E, $00,$80 ; SOLARBEAM - db SFX_BATTLE_1C, $00,$80 ; POISONPOWDER - db SFX_BATTLE_1C, $11,$a0 ; STUN_SPORE - db SFX_BATTLE_1C, $01,$c0 ; SLEEP_POWDER - db SFX_BATTLE_13, $14,$c0 ; PETAL_DANCE - db SFX_BATTLE_1B, $02,$a0 ; STRING_SHOT - db SFX_BATTLE_29, $f0,$80 ; DRAGON_RAGE - db SFX_BATTLE_29, $20,$c0 ; FIRE_SPIN - db SFX_BATTLE_2F, $00,$20 ; THUNDERSHOCK - db SFX_BATTLE_2F, $20,$80 ; THUNDERBOLT - db SFX_BATTLE_2E, $12,$60 ; THUNDER_WAVE - db SFX_BATTLE_26, $00,$80 ; THUNDER - db SFX_BATTLE_14, $01,$e0 ; ROCK_THROW - db SFX_BATTLE_29, $0f,$e0 ; EARTHQUAKE - db SFX_BATTLE_29, $11,$20 ; FISSURE - db SFX_DAMAGE, $10,$40 ; DIG - db SFX_BATTLE_0F, $10,$c0 ; TOXIC - db SFX_BATTLE_14, $00,$20 ; CONFUSION - db SFX_PSYCHIC_M, $00,$80 ; PSYCHIC_M - db SFX_BATTLE_35, $11,$18 ; HYPNOSIS - db SFX_BATTLE_09, $20,$c0 ; MEDITATE - db SFX_FAINT_FALL, $20,$c0 ; AGILITY - db SFX_BATTLE_25, $00,$10 ; QUICK_ATTACK - db SFX_BATTLE_26, $f0,$20 ; RAGE - db SFX_BATTLE_33, $f0,$c0 ; TELEPORT - db SFX_NOT_VERY_EFFECTIVE,$f0,$e0 ; NIGHT_SHADE - db SFX_BATTLE_09, $f0,$40 ; MIMIC - db SFX_BATTLE_31, $00,$80 ; SCREECH - db SFX_BATTLE_33, $80,$40 ; DOUBLE_TEAM - db SFX_BATTLE_33, $00,$80 ; RECOVER - db SFX_BATTLE_14, $11,$20 ; HARDEN - db SFX_BATTLE_14, $22,$10 ; MINIMIZE - db SFX_BATTLE_1B, $f1,$ff ; SMOKESCREEN - db SFX_BATTLE_13, $f1,$ff ; CONFUSE_RAY - db SFX_BATTLE_14, $33,$30 ; WITHDRAW - db SFX_BATTLE_32, $40,$c0 ; DEFENSE_CURL - db SFX_BATTLE_0E, $20,$20 ; BARRIER - db SFX_BATTLE_0E, $f0,$10 ; LIGHT_SCREEN - db SFX_BATTLE_0F, $f8,$10 ; HAZE - db SFX_NOT_VERY_EFFECTIVE,$f0,$10 ; REFLECT - db SFX_BATTLE_25, $00,$80 ; FOCUS_ENERGY - db SFX_BATTLE_18, $00,$c0 ; BIDE - db SFX_BATTLE_32, $c0,$ff ; METRONOME - db SFX_BATTLE_09, $f2,$20 ; MIRROR_MOVE - db SFX_BATTLE_34, $00,$80 ; SELFDESTRUCT - db SFX_BATTLE_34, $00,$40 ; EGG_BOMB - db SFX_BATTLE_09, $00,$40 ; LICK - db SFX_NOT_VERY_EFFECTIVE,$10,$ff ; SMOG - db SFX_BATTLE_2A, $20,$20 ; SLUDGE - db SFX_BATTLE_32, $00,$80 ; BONE_CLUB - db SFX_BATTLE_29, $1f,$20 ; FIRE_BLAST - db SFX_BATTLE_25, $2f,$80 ; WATERFALL - db SFX_BATTLE_0F, $1f,$ff ; CLAMP - db SFX_BATTLE_2B, $1f,$60 ; SWIFT - db SFX_BATTLE_26, $1e,$20 ; SKULL_BASH - db SFX_BATTLE_26, $1f,$18 ; SPIKE_CANNON - db SFX_BATTLE_14, $0f,$80 ; CONSTRICT - db SFX_BATTLE_09, $f8,$10 ; AMNESIA - db SFX_FAINT_FALL, $18,$20 ; KINESIS - db SFX_BATTLE_32, $08,$40 ; SOFTBOILED - db SFX_BATTLE_17, $01,$e0 ; HI_JUMP_KICK - db SFX_NOT_VERY_EFFECTIVE,$09,$ff ; GLARE - db SFX_BATTLE_35, $42,$01 ; DREAM_EATER - db SFX_BATTLE_1C, $00,$ff ; POISON_GAS - db SFX_BATTLE_32, $08,$e0 ; BARRAGE - db SFX_BATTLE_24, $00,$80 ; LEECH_LIFE - db SFX_BATTLE_09, $88,$10 ; LOVELY_KISS - db SFX_BATTLE_25, $48,$ff ; SKY_ATTACK - db SFX_FAINT_FALL, $ff,$ff ; TRANSFORM - db SFX_BATTLE_24, $ff,$10 ; BUBBLE - db SFX_FAINT_FALL, $ff,$04 ; DIZZY_PUNCH - db SFX_BATTLE_1C, $01,$ff ; SPORE - db SFX_BATTLE_13, $f8,$ff ; FLASH - db SFX_BATTLE_0C, $f0,$f0 ; PSYWAVE - db SFX_BATTLE_0F, $08,$10 ; SPLASH - db SFX_BATTLE_0D, $f0,$ff ; ACID_ARMOR - db SFX_SUPER_EFFECTIVE, $f0,$ff ; CRABHAMMER - db SFX_BATTLE_34, $10,$ff ; EXPLOSION - db SFX_BATTLE_0E, $f0,$20 ; FURY_SWIPES - db SFX_BATTLE_2B, $f0,$60 ; BONEMERANG - db SFX_BATTLE_21, $12,$10 ; REST - db SFX_BATTLE_36, $f0,$20 ; ROCK_SLIDE - db SFX_BATTLE_1E, $12,$ff ; HYPER_FANG - db SFX_BATTLE_31, $80,$04 ; SHARPEN - db SFX_BATTLE_33, $f0,$10 ; CONVERSION - db SFX_BATTLE_29, $f8,$ff ; TRI_ATTACK - db SFX_BATTLE_26, $f0,$ff ; SUPER_FANG - db SFX_NOT_VERY_EFFECTIVE,$01,$ff ; SLASH - db SFX_BATTLE_2C, $d8,$04 ; SUBSTITUTE - db SFX_BATTLE_0B, $00,$80 ; STRUGGLE - db SFX_BATTLE_0B, $00,$80 - -CopyPicTiles: ; 79c0a (1e:5c0a) - ld a, [H_WHOSETURN] - and a - ld a, $31 ; base tile ID of player mon sprite - jr z, .next -; enemy turn - xor a ; base tile ID of enemy mon sprite -.next - ld [hBaseTileID], a - jr CopyTileIDs_NoBGTransfer - -; copy the tiles used when a mon is being sent out of or into a pokeball -CopyDownscaledMonTiles: ; 79c16 (1e:5c16) - call GetPredefRegisters - ld a, [wDownscaledMonSize] - and a - jr nz, .smallerSize - ld de, DownscaledMonTiles_5x5 - jr CopyTileIDs_NoBGTransfer -.smallerSize - ld de, DownscaledMonTiles_3x3 -; fall through - -CopyTileIDs_NoBGTransfer: ; 79acb (1e:5acb) - xor a - ld [H_AUTOBGTRANSFERENABLED], a -; fall through - -; 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: ; 79c46 (1e:5c46) - dw DownscaledMonTiles_7x7 - db $77 - dw DownscaledMonTiles_5x7 - db $57 - dw DownscaledMonTiles_3x7 - db $37 - dw DownscaledMonTiles_79ce9 - db $77 - dw DownscaledMonTiles_79d1a - db $77 - dw DownscaledMonTiles_79d4b - db $77 - dw DownscaledMonTiles_79d7c - db $86 - dw DownscaledMonTiles_79dac - db $3C - -DownscaledMonTiles_5x5: ; 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 - -DownscaledMonTiles_3x3: ; 79b1b (1e:5b1b) - db $31,$46,$5B - db $34,$49,$5E - db $37,$4C,$61 - -DownscaledMonTiles_7x7: ; 79c80 (1e:5c80) - 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 - -DownscaledMonTiles_5x7: ; 79cb1 (1e:5cb1) - 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 - -DownscaledMonTiles_3x7: ; 79cd4 (1e:5cd4) - db $00,$07,$0E,$15,$1C,$23,$2A - db $02,$09,$10,$17,$1E,$25,$2C - db $04,$0B,$12,$19,$20,$27,$2E - -DownscaledMonTiles_79ce9: ; 79ce9 (1e:5ce9) - 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 - -DownscaledMonTiles_79d1a: ; 79d1a (1e:5d1a) - 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 - -DownscaledMonTiles_79d4b: ; 79d4b (1e:5d4b) - 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 - -DownscaledMonTiles_79d7c: ; 79d7c (1e:5d7c) - 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 - -DownscaledMonTiles_79dac: ; 79dac (1e:5dac) - 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: ; 79dd0 (1e:5dd0) -; Makes leaves float down from the top of the screen. This is used -; in Razor Leaf's animation. - ld a, [wAnimPalette] - ld [rOBP0], a - call UpdateGBCPal_OBP0 - ld d, $37 ; leaf tile - ld a, 3 ; number of leaves - ld [wNumFallingObjects], a - jp AnimationFallingObjects - -AnimationPetalsFalling: ; 79de2 (1e:5de2) -; Makes lots of petals fall down from the top of the screen. It's used in -; the animation for Petal Dance. - ld d, $71 ; petal tile - ld a, 20 ; number of petals - ld [wNumFallingObjects], a - call AnimationFallingObjects - jp ClearSprites - -AnimationFallingObjects: ; 79def (1e:5def) - ld c, a - ld a, 1 - call InitMultipleObjectsOAM - call FallingObjects_InitXCoords - call FallingObjects_InitMovementData - ld hl, wOAMBuffer - ld [hl], 0 -.loop - ld hl, wFallingObjectsMovementData - ld de, 0 - ld a, [wNumFallingObjects] - ld c, a -.innerLoop - push bc - push hl - push de - ld a, [hl] - ld [wFallingObjectMovementByte], a - call FallingObjects_UpdateMovementByte - call FallingObjects_UpdateOAMEntry - pop de - ld hl, 4 - add hl, de - ld e, l - ld d, h - pop hl - ld a, [wFallingObjectMovementByte] - ld [hli], a - pop bc - dec c - jr nz, .innerLoop - call Delay3 - ld hl, wOAMBuffer - ld a, [hl] ; Y - cp 104 ; has the top falling object reached 104 yet? - jr nz, .loop ; keep moving the falling objects down until it does - ret - -FallingObjects_UpdateOAMEntry: ; 79cdb (1e:5cdb) -; Increases Y by 2 pixels and adjusts X and X flip based on the falling object's -; movement byte. - ld hl, wOAMBuffer - add hl, de - ld a, $1 - ld [wdef5], a - ld a, [hl] - inc a - inc a - cp 112 - jr c, .next - ld a, 160 ; if Y >= 112, put it off-screen -.next - ld [hli], a ; Y - cp 40 - jr c, .asm_79e51 - ld a, [wdef5] - inc a - ld [wdef5], a -.asm_79e51 - ld a, [wFallingObjectMovementByte] - ld b, a - ld de, FallingObjects_DeltaXs - and $7f - add e - jr nc, .noCarry - inc d -.noCarry - ld e, a - ld a, b - and $80 - jr nz, .movingLeft -; moving right - ld a, [de] - add [hl] - ld [hli], a ; X - cp 88 - jr c, .asm_79e75 - ld a, [wdef5] - add $2 - and $3 - ld [wdef5], a -.asm_79e75 - inc hl - xor a ; no horizontal flip - jr .next2 -.movingLeft - ld a, [de] - ld b, a - ld a, [hl] - sub b - ld [hli], a ; X - cp 88 - jr c, .asm_79e5c - ld a, [wdef5] - add $2 - and $3 - ld [wdef5], a -.asm_79e5c - inc hl - ld a, (1 << OAM_X_FLIP) -.next2 - ld b, a - ld a, [wdef5] - or b - ld [hl], a ; attribute - ret - -FallingObjects_DeltaXs: ; 79e96 (1e:5e96) - db 0, 1, 3, 5, 7, 9, 11, 13, 15 - -FallingObjects_UpdateMovementByte: ; 79e9f (1e:5e9f) - ld a, [wFallingObjectMovementByte] - inc a - ld b, a - and $7f - cp 9 ; have we reached the end of the delta-Xs? - ld a, b - jr nz, .next -; We've reached the end of the delta-Xs, so wrap to the start and change -; direction from right to left or vice versa. - and $80 - xor $80 -.next - ld [wFallingObjectMovementByte], a - ret - -FallingObjects_InitXCoords: ; 79eb3 (1e:5eb3) - ld hl, wOAMBuffer + $01 - ld de, FallingObjects_InitialXCoords - ld a, [wNumFallingObjects] - ld c, a -.loop - ld a, [de] - ld [hli], a - inc hl - inc hl - inc hl - inc de - dec c - jr nz, .loop - ret - -FallingObjects_InitialXCoords: ; 79ec7 (1e:5ec7) - db $38,$40,$50,$60,$70,$88,$90,$56,$67,$4A,$77,$84,$98,$32,$22,$5C,$6C,$7D,$8E,$99 - -FallingObjects_InitMovementData: ; 79edb (1e:5edb) - ld hl, wFallingObjectsMovementData - ld de, FallingObjects_InitialMovementData - ld a, [wNumFallingObjects] - ld c, a -.loop - ld a, [de] - ld [hli], a - inc de - dec c - jr nz, .loop - ret - -FallingObjects_InitialMovementData: ; 79eec (1e:5eec) - db $00,$84,$06,$81,$02,$88,$01,$83,$05,$89,$09,$80,$07,$87,$03,$82,$04,$85,$08,$86 - -AnimationShakeEnemyHUD: ; 79f00 (1e:5f00) -; Shakes the enemy HUD. - -; Make a copy of the back pic's tile patterns in sprite tile pattern VRAM. - ld de, vBackPic - ld hl, vSprites - ld bc, 7 * 7 - call CopyVideoData - - xor a - ld [hSCX], a - -; Copy wTileMap to BG map 0. The regular BG (not the window) is set to use -; map 0 and can be scrolled with SCX, which allows a shaking effect. - ld hl, vBGMap0 - call BattleAnimCopyTileMapToVRAM - -; Now that the regular BG is showing the same thing the window was, move the -; window off the screen so that we can modify its contents below. - ld a, SCREEN_HEIGHT_PIXELS - ld [hWY], a - -; Copy wTileMap to VRAM such that the row below the enemy HUD (in wTileMap) is -; lined up with row 0 of the window. - ld hl, vBGMap1 - $20 * 7 - call BattleAnimCopyTileMapToVRAM - -; update BGMap attributes - ld a, [hGBC] - and a - jr z, .notGBC - ld c, 13 - callba LoadBGMapAttributes -.notGBC - -; Move the window so that the row below the enemy HUD (in BG map 0) lines up -; with the top row of the window on the screen. This makes it so that the window -; covers everything below the enemy HD with a copy that looks just like what -; was there before. - ld a, 7 * 8 - ld [hWY], a - -; Write OAM entries so that the copy of the back pic from the top of this -; function shows up on screen. We need this because the back pic's Y coordinates -; range overlaps with that of the enemy HUD and we don't want to shake the top -; of the back pic when we shake the enemy HUD. The OAM copy won't be affected -; by SCX. - call ShakeEnemyHUD_WritePlayerMonPicOAM - - ld hl, vBGMap0 - call BattleAnimCopyTileMapToVRAM - -; Remove the back pic from the BG map. - call AnimationHideMonPic - call Delay3 - -; Use SCX to shake the regular BG. The window and the back pic OAM copy are -; not affected. - lb de, 2, 8 - call ShakeEnemyHUD_ShakeBG - -; Restore the original graphics. - call AnimationShowMonPic - call ClearSprites - ld a, SCREEN_HEIGHT_PIXELS - ld [hWY], a - ld hl, vBGMap1 - call BattleAnimCopyTileMapToVRAM -; update BGMap attributes - ld a, [hGBC] - and a - jr z, .notGBC2 - ld c, 11 - callba LoadBGMapAttributes -.notGBC2 - xor a - ld [hWY], a - call SaveScreenTilesToBuffer1 - ld hl, vBGMap0 - call BattleAnimCopyTileMapToVRAM - call LoadScreenTilesFromBuffer1 - ld hl, vBGMap1 - jp BattleAnimCopyTileMapToVRAM - -; b = tile ID list index -; c = base tile ID -CopyTileIDsFromList: ; 79f7b (1e:5f7b) - call GetPredefRegisters - ld a, c - ld [hBaseTileID], a - ld a, b - push hl - call GetTileIDList - pop hl - jp CopyTileIDs - -ShakeEnemyHUD_ShakeBG: ; 79f8a (1e:5f8a) - ld a, [hSCX] - ld [wTempSCX], a -.loop - ld a, [wTempSCX] - add d - ld [hSCX], a - ld c, 2 - call DelayFrames - ld a, [wTempSCX] - sub d - ld [hSCX], a - ld c, 2 - call DelayFrames - dec e - jr nz, .loop - ld a, [wTempSCX] - ld [hSCX], a - ret - -BattleAnimCopyTileMapToVRAM: ; 79fae (1e:5fae) - ld a, h - ld [H_AUTOBGTRANSFERDEST + 1], a - ld a, l - ld [H_AUTOBGTRANSFERDEST], a - jp Delay3 - -TossBallAnimation: ; 79fb7 (1e:5fb7) - ld a,[wIsInBattle] - cp a,2 - jr z,.BlockBall ; if in trainer battle, play different animation - ld a,[wPokeBallAnimData] - 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 [wNumShakes],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 [wAnimationID],a - push bc - push hl - call PlayAnimation - pop hl - ld a,[hli] - pop bc - dec c - jr nz,.PlayNextAnimation - ret - -.PokeBallAnimations: ; 79ff1 (1e:5ff1) -; sequence of animations that make up the Poké Ball toss - db POOF_ANIM,HIDEPIC_ANIM,SHAKE_ANIM,POOF_ANIM,SHOWPIC_ANIM - -.BlockBall ; 79ff6 (1e:5ff6) - ld a,TOSS_ANIM - ld [wAnimationID],a - call PlayAnimation - ld a,SFX_FAINT_THUD - call PlaySound - ld a,BLOCKBALL_ANIM - ld [wAnimationID],a - jp PlayAnimation - -PlayApplyingAttackSound: ; 7a00b (1e:600b) -; 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 10 - ld a, $20 - ld b, $30 - ld c, SFX_DAMAGE - jr z, .playSound - ld a, $e0 - ld b, $ff - ld c, SFX_SUPER_EFFECTIVE - jr nc, .playSound - ld a, $50 - ld b, $1 - ld c, SFX_NOT_VERY_EFFECTIVE -.playSound - ld [wFrequencyModifier], a - ld a, b - ld [wTempoModifier], a - ld a, c - jp PlaySound
\ No newline at end of file diff --git a/yellow/main.asm b/yellow/main.asm index f631db46..1f5492f4 100755 --- a/yellow/main.asm +++ b/yellow/main.asm @@ -809,7 +809,7 @@ PKMNLeaguePC: ; 75dfe (1d:5dfe) SECTION "bank1E",ROMX,BANK[$1E] -INCLUDE "engine/battle/animations_.asm" +INCLUDE "engine/battle/animations.asm" AnimCut: ; 7a037 (1e:6037) dr $7a037,$7a0fb |