aboutsummaryrefslogtreecommitdiffstats
path: root/engine/battle/animations_.asm
diff options
context:
space:
mode:
authorluckytyphlosion <alan.rj.huang@gmail.com>2016-03-17 18:22:37 -0400
committerluckytyphlosion <alan.rj.huang@gmail.com>2016-03-17 18:22:37 -0400
commit29b6c60cb7801a4b240f398dd85938f020190234 (patch)
tree5715b7675a9576513b7e716886bbef27703d7c4e /engine/battle/animations_.asm
parentSplit bank3 up. (diff)
downloadpokeyellow-29b6c60cb7801a4b240f398dd85938f020190234.tar.gz
pokeyellow-29b6c60cb7801a4b240f398dd85938f020190234.tar.xz
pokeyellow-29b6c60cb7801a4b240f398dd85938f020190234.zip
Replaced some wram labels before committing, need to commit now.
Diffstat (limited to 'engine/battle/animations_.asm')
-rw-r--r--engine/battle/animations_.asm394
1 files changed, 394 insertions, 0 deletions
diff --git a/engine/battle/animations_.asm b/engine/battle/animations_.asm
new file mode 100644
index 00000000..f9260802
--- /dev/null
+++ b/engine/battle/animations_.asm
@@ -0,0 +1,394 @@
+; Draws a "frame block". Frame blocks are blocks of tiles that are put
+; together to form frames in battle animations.
+DrawFrameBlock: ; 78000 (1e:4000)
+ ld l,c
+ ld h,b
+ ld a,[hli]
+ ld [W_NUMFBTILES],a
+ ld a,[W_FBDESTADDR + 1]
+ ld e,a
+ ld a,[W_FBDESTADDR]
+ ld d,a
+ xor a
+ ld [W_FBTILECOUNTER],a ; loop counter
+.loop
+ ld a,[W_FBTILECOUNTER]
+ inc a
+ ld [W_FBTILECOUNTER],a
+ ld a,[W_SUBANIMTRANSFORM]
+ dec a
+ jr z,.flipHorizontalAndVertical ; 1
+ dec a
+ jp z,.flipHorizontalTranslateDown ; 2
+ dec a
+ jr z,.flipBaseCoords ; 3
+.noTransformation
+ ld a,[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 [W_SUBANIMTRANSFORM] not 1 or 2)
+ add [hl] ; X offset
+ ld [de],a ; store X
+ inc hl
+ inc de
+ ld a,[hli]
+ add a,$31 ; base tile ID for battle animations
+ ld [de],a ; store tile ID
+ inc de
+ ld a,[hli]
+ ld [de],a ; store flags
+ inc de
+ jp .nextTile
+.flipHorizontalAndVertical
+ ld a,[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
+ inc hl
+ inc de
+ ld a,[hli]
+ add a,$31 ; base tile ID for battle animations
+ ld [de],a ; store tile ID
+ inc de
+; toggle horizontal and vertical flip
+ ld a,[hli] ; flags
+ and a
+ ld b,OAM_VFLIP | OAM_HFLIP
+ jr z,.storeFlags1
+ cp a,OAM_HFLIP
+ ld b,OAM_VFLIP
+ jr z,.storeFlags1
+ cp a,OAM_VFLIP
+ ld b,OAM_HFLIP
+ jr z,.storeFlags1
+ ld b,0
+.storeFlags1
+ ld a,b
+ ld [de],a
+ inc de
+ jp .nextTile
+.flipHorizontalTranslateDown
+ ld a,[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
+ inc hl
+ inc de
+ ld a,[hli]
+ add a,$31 ; base tile ID for battle animations
+ ld [de],a ; store tile ID
+ inc de
+ ld a,[hli]
+ bit 5,a ; is horizontal flip enabled?
+ jr nz,.disableHorizontalFlip
+.enableHorizontalFlip
+ set 5,a
+ jr .storeFlags2
+.disableHorizontalFlip
+ res 5,a
+.storeFlags2
+ ld [de],a
+ inc de
+.nextTile
+ ld a,[W_FBTILECOUNTER]
+ ld c,a
+ ld a,[W_NUMFBTILES]
+ cp c
+ jp nz,.loop ; go back up if there are more tiles to draw
+.afterDrawingTiles
+ ld a,[W_FBMODE]
+ cp a,2
+ jr z,.advanceFrameBlockDestAddr; skip delay and don't clean OAM buffer
+ ld a,[W_SUBANIMFRAMEDELAY]
+ ld c,a
+ call DelayFrames
+ ld a,[W_FBMODE]
+ cp a,3
+ jr z,.advanceFrameBlockDestAddr ; skip cleaning OAM buffer
+ cp a,4
+ jr z,.done ; skip cleaning OAM buffer and don't advance the frame block destination address
+ ld a,[wAnimationID]
+ cp a,GROWL
+ jr z,.resetFrameBlockDestAddr
+ call AnimationCleanOAM
+.resetFrameBlockDestAddr
+ ld hl,wOAMBuffer ; OAM buffer
+ ld a,l
+ ld [W_FBDESTADDR + 1],a
+ ld a,h
+ ld [W_FBDESTADDR],a ; set destination address to beginning of OAM buffer
+ ret
+.advanceFrameBlockDestAddr
+ ld a,e
+ ld [W_FBDESTADDR + 1],a
+ ld a,d
+ ld [W_FBDESTADDR],a
+.done
+ ret
+
+PlayAnimation: ; 78124 (1e:4124)
+ xor a
+ ld [$FF8B],a ; it looks like nothing reads this
+ ld [W_SUBANIMTRANSFORM],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 [W_SUBANIMFRAMEDELAY],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 [W_SUBANIMADDRPTR],a
+ ld a,h
+ ld [W_SUBANIMADDRPTR + 1],a
+ ld l,c
+ ld h,b
+ push hl
+ ld a,[rOBP0]
+ push af
+ ld a,[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,[W_SUBANIMADDRPTR + 1]
+ ld h,a
+ ld a,[W_SUBANIMADDRPTR]
+ ld l,a
+ ld a,[hli]
+ ld e,a
+ ld a,[hl]
+ ld d,a ; de = address of subanimation
+ ld a,[de]
+ ld b,a
+ and a,31
+ ld [W_SUBANIMCOUNTER],a ; number of frame blocks
+ ld a,b
+ and a,%11100000
+ cp a,5 << 5 ; is subanimation type 5?
+ jr nz,.isNotType5
+.isType5
+ call GetSubanimationTransform2
+ jr .saveTransformation
+.isNotType5
+ call GetSubanimationTransform1
+.saveTransformation
+; place the upper 3 bits of a into bits 0-2 of a before storing
+ srl a
+ swap a
+ ld [W_SUBANIMTRANSFORM],a
+ cp a,4 ; is the animation reversed?
+ ld hl,0
+ jr nz,.storeSubentryAddr
+; if the animation is reversed, then place the initial subentry address at the end of the list of subentries
+ ld a,[W_SUBANIMCOUNTER]
+ dec a
+ ld bc,3
+.loop
+ add hl,bc
+ dec a
+ jr nz,.loop
+.storeSubentryAddr
+ inc de
+ add hl,de
+ ld a,l
+ ld [W_SUBANIMSUBENTRYADDR],a
+ ld a,h
+ ld [W_SUBANIMSUBENTRYADDR + 1],a
+ ret
+
+; called if the subanimation type is not 5
+; sets the transform to 0 (i.e. no transform) if it's the player's turn
+; sets the transform to the subanimation type if it's the enemy's turn
+GetSubanimationTransform1: ; 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"
+
+ dr $78d97,$78e98
+Func_78e98: ; 78e98 (1e:4e98)
+ dr $78e98,$79349
+AnimationSlideMonOff: ; 79349 (1e:5349)
+ dr $79349,$79353
+AnimationSlideEnemyMonOff: ; 79353 (1e:5353)
+ dr $79353,$7966e
+AnimationMinimizeMon: ; 7966e (1e:566e)
+ dr $7966e,$797af
+AnimationSubstitute: ; 797af (1e:57af)
+ dr $797af,$79816
+HideSubstituteShowMonAnim: ; 79816 (1e:5816)
+ dr $79816,$798b2
+ReshowSubstituteAnim: ; 798b2 (1e:58b2)
+ dr $798b2,$798c8
+AnimationTransformMon: ; 798c8 (1e:58c8)
+ dr $798c8,$798d4
+ChangeMonPic: ; 798d4 (1e:58d4)
+ dr $798d4,$79929
+Func_79929: ; 79929 (1e:5929)
+ dr $79929,$7a037 \ No newline at end of file