summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorElectroDeoxys <ElectroDeoxys@gmail.com>2021-02-03 00:01:13 +0000
committerElectroDeoxys <ElectroDeoxys@gmail.com>2021-02-03 00:04:40 +0000
commit68b8291b1920bcae99750f4bb97b7c01b73f786c (patch)
tree134e5ee49f29c266789de1d00ce679b78153e891 /src
parentdc57997f0e3268e6c9a621429f01c55a96e21bc8 (diff)
parentab9b857e68af66e8bc37628bd76dbba337971a15 (diff)
Merge branch 'anims' of https://github.com/ElectroDeoxys/poketcg
Diffstat (limited to 'src')
-rw-r--r--src/constants/animation_constants.asm34
-rw-r--r--src/constants/duel_interface_constants.asm2
-rw-r--r--src/data/attack_animations.asm32
-rw-r--r--src/data/palettes1.asm2
-rw-r--r--src/engine/bank01.asm42
-rw-r--r--src/engine/bank03.asm2
-rw-r--r--src/engine/bank04.asm6
-rw-r--r--src/engine/bank06.asm279
-rw-r--r--src/engine/bank07.asm375
-rw-r--r--src/engine/bank20.asm23
-rw-r--r--src/engine/home.asm31
-rw-r--r--src/macros/wram.asm10
-rw-r--r--src/wram.asm62
13 files changed, 534 insertions, 366 deletions
diff --git a/src/constants/animation_constants.asm b/src/constants/animation_constants.asm
index 44faa75..80c425d 100644
--- a/src/constants/animation_constants.asm
+++ b/src/constants/animation_constants.asm
@@ -113,8 +113,42 @@
const DUEL_ANIM_DUEL_DRAW ; $5f
const DUEL_ANIM_96 ; $60
+; animations passed this point are treated differently
+DUEL_SPECIAL_ANIMS EQU const_value
+
+DUEL_SCREEN_ANIMS EQU const_value
+ const DUEL_ANIM_SMALL_SHAKE_X ; $61
+ const DUEL_ANIM_BIG_SHAKE_X ; $62
+ const DUEL_ANIM_SMALL_SHAKE_Y ; $63
+ const DUEL_ANIM_BIG_SHAKE_Y ; $64
+ const DUEL_ANIM_FLASH ; $65
+ const DUEL_ANIM_DISTORT ; $66
+
+ const_def $96
+ const DUEL_ANIM_150 ; $96
+ const DUEL_ANIM_PRINT_DAMAGE ; $97
+ const DUEL_ANIM_UPDATE_HUD ; $98
+ const DUEL_ANIM_153 ; $99
+ const DUEL_ANIM_154 ; $9a
+ const DUEL_ANIM_155 ; $9b
+ const DUEL_ANIM_156 ; $9c
+ const DUEL_ANIM_157 ; $9d
+ const DUEL_ANIM_158 ; $9e
+
; Special animations
const_def $fa
const DUEL_ANIM_SHAKE1 ; $fa
const DUEL_ANIM_SHAKE2 ; $fb
const DUEL_ANIM_SHAKE3 ; $fc
+
+ ; Duel Anim Struct constants
+ const_def
+ const DUEL_ANIM_STRUCT_ID ; $0
+ const DUEL_ANIM_STRUCT_SCREEN ; $1
+ const DUEL_ANIM_STRUCT_DUELIST_SIDE ; $2
+ const DUEL_ANIM_STRUCT_LOCATION_PARAM ; $3
+ const DUEL_ANIM_STRUCT_DAMAGE ; $4
+const_value = const_value + 1
+ const DUEL_ANIM_STRUCT_UNKNOWN_2 ; $6
+ const DUEL_ANIM_STRUCT_BANK ; $7
+DUEL_ANIM_STRUCT_SIZE EQU const_value
diff --git a/src/constants/duel_interface_constants.asm b/src/constants/duel_interface_constants.asm
index baf0a4c..6add375 100644
--- a/src/constants/duel_interface_constants.asm
+++ b/src/constants/duel_interface_constants.asm
@@ -37,6 +37,8 @@ HEADER_POKEMON EQU $02
; wDuelDisplayedScreen constants
DUEL_MAIN_SCENE EQU $01
PLAY_AREA_CARD_LIST EQU $02
+UNKNOWN_SCREEN_4 EQU $04 ; used for some animations
+UNKNOWN_SCREEN_5 EQU $05 ; used for some animations
COIN_TOSS EQU $06
DRAW_CARDS EQU $07
LARGE_CARD_PICTURE EQU $08
diff --git a/src/data/attack_animations.asm b/src/data/attack_animations.asm
index d0bc93b..d0ad4aa 100644
--- a/src/data/attack_animations.asm
+++ b/src/data/attack_animations.asm
@@ -200,7 +200,7 @@ AttackAnimation_Thunderbolt:
AttackAnimation_BigLightning:
anim_player DUEL_ANIM_GLOW
- anim_normal $65
+ anim_normal DUEL_ANIM_FLASH
anim_normal DUEL_ANIM_BIG_LIGHTNING
anim_opponent DUEL_ANIM_HIT
anim_normal DUEL_ANIM_SHAKE1
@@ -461,7 +461,7 @@ AttackAnimation_544e:
AttackAnimation_Goo:
anim_player DUEL_ANIM_GLOW
anim_opponent DUEL_ANIM_GOO
- anim_normal $66
+ anim_normal DUEL_ANIM_DISTORT
anim_opponent DUEL_ANIM_HIT
anim_normal DUEL_ANIM_SHAKE1
anim_opponent DUEL_ANIM_SHOW_DAMAGE
@@ -470,7 +470,7 @@ AttackAnimation_Goo:
AttackAnimation_SpitPoisonFail:
anim_player DUEL_ANIM_GLOW
anim_opponent DUEL_ANIM_GOO
- anim_normal $66
+ anim_normal DUEL_ANIM_DISTORT
anim_end
AttackAnimation_Bubbles:
@@ -500,12 +500,12 @@ AttackAnimation_Boyfriends:
AttackAnimation_Lure:
anim_player DUEL_ANIM_GLOW
anim_player DUEL_ANIM_LURE
- anim_normal $66
+ anim_normal DUEL_ANIM_DISTORT
anim_end
AttackAnimation_Toxic:
anim_player DUEL_ANIM_GLOW
- anim_normal $66
+ anim_normal DUEL_ANIM_DISTORT
anim_opponent DUEL_ANIM_TOXIC
anim_opponent DUEL_ANIM_HIT
anim_normal DUEL_ANIM_SHAKE1
@@ -514,7 +514,7 @@ AttackAnimation_Toxic:
AttackAnimation_ConfuseRay:
anim_player DUEL_ANIM_GLOW
- anim_normal $65
+ anim_normal DUEL_ANIM_FLASH
anim_opponent DUEL_ANIM_CONFUSE_RAY
anim_opponent DUEL_ANIM_HIT
anim_normal DUEL_ANIM_SHAKE1
@@ -597,7 +597,7 @@ AttackAnimation_Selfdestruct:
AttackAnimation_BigSelfdestruct:
anim_player DUEL_ANIM_GLOW
anim_player DUEL_ANIM_BIG_SELFDESTRUCT_1
- anim_normal $65
+ anim_normal DUEL_ANIM_FLASH
anim_player DUEL_ANIM_BIG_SELFDESTRUCT_2
anim_opponent DUEL_ANIM_HIT
anim_normal DUEL_ANIM_SHAKE1
@@ -627,18 +627,18 @@ AttackAnimation_DarkGas:
AttackAnimation_GlowEffect:
anim_player DUEL_ANIM_GLOW
- anim_normal $65
+ anim_normal DUEL_ANIM_FLASH
anim_end
AttackAnimation_MirrorMove:
anim_player DUEL_ANIM_GLOW
- anim_normal $65
+ anim_normal DUEL_ANIM_FLASH
anim_opponent DUEL_ANIM_GLOW
anim_end
AttackAnimation_DevolutionBeam:
anim_player DUEL_ANIM_GLOW
- anim_normal $65
+ anim_normal DUEL_ANIM_FLASH
anim_unknown $04
anim_unknown2 DUEL_ANIM_70
anim_end
@@ -646,13 +646,13 @@ AttackAnimation_DevolutionBeam:
AttackAnimation_5543:
anim_unknown $04
anim_unknown2 DUEL_ANIM_70
- anim_normal $65
+ anim_normal DUEL_ANIM_FLASH
anim_end
AttackAnimation_Firegiver:
anim_unknown $04
anim_unknown2 DUEL_ANIM_70
- anim_normal $65
+ anim_normal DUEL_ANIM_FLASH
anim_unknown2 DUEL_ANIM_71
anim_unknown2 DUEL_ANIM_71
anim_end
@@ -692,7 +692,7 @@ AttackAnimation_BigThunder:
AttackAnimation_SolarPower:
anim_player DUEL_ANIM_GLOW
- anim_normal $65
+ anim_normal DUEL_ANIM_FLASH
anim_end
AttackAnimation_PoisonFang:
@@ -757,7 +757,7 @@ AttackAnimation_Hypnosis:
AttackAnimation_EnergyConversion:
anim_player DUEL_ANIM_GLOW
- anim_normal $65
+ anim_normal DUEL_ANIM_FLASH
anim_end
AttackAnimation_Leer:
@@ -866,7 +866,7 @@ AttackAnimation_Gale:
anim_opponent DUEL_ANIM_HIT
anim_normal DUEL_ANIM_SHAKE1
anim_opponent DUEL_ANIM_SHOW_DAMAGE
- anim_normal $65
+ anim_normal DUEL_ANIM_FLASH
anim_end
AttackAnimation_Expand:
@@ -895,7 +895,7 @@ AttackAnimation_5659:
AttackAnimation_SpitPoisonSuccess:
anim_player DUEL_ANIM_GLOW
anim_opponent DUEL_ANIM_GOO
- anim_normal $66
+ anim_normal DUEL_ANIM_DISTORT
anim_end
AttackAnimation_GustOfWind:
diff --git a/src/data/palettes1.asm b/src/data/palettes1.asm
index 75b7c10..8514090 100644
--- a/src/data/palettes1.asm
+++ b/src/data/palettes1.asm
@@ -1,4 +1,4 @@
-; palette data are read by Func_80418, expected to be structured as so:
+; palette data are read by LoadPaletteData, expected to be structured as so:
; the first byte has possible values of 0, 1 or 2
; - if 0, nothing is done;
; - if 1, then the next byte is written to OBP0 (or to OBP1 if wd4ca == $1);
diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm
index 4936cbc..03c5e96 100644
--- a/src/engine/bank01.asm
+++ b/src/engine/bank01.asm
@@ -218,7 +218,7 @@ MainDuelLoop: ; 40ee (1:40ee)
ldtx hl, LostDuelText
.handle_duel_finished
- call Func_3b6a
+ call PlayDuelAnimation
ld a, c
call PlaySong
ld a, OPPONENT_TURN
@@ -1523,7 +1523,7 @@ PlayTurnDuelistDrawAnimation: ; 49a8 (1:49a8)
ld e, DUEL_ANIM_OPP_DRAW
.got_duelist
ld a, e
- call Func_3b6a
+ call PlayDuelAnimation
.loop_anim
call DoFrame
@@ -2229,11 +2229,11 @@ PlayShuffleAndDrawCardsAnimation: ; 4e98 (1:4e98)
ld hl, sp+$03
; play animation 3 times
ld a, [hl]
- call Func_3b6a
+ call PlayDuelAnimation
ld a, [hl]
- call Func_3b6a
+ call PlayDuelAnimation
ld a, [hl]
- call Func_3b6a
+ call PlayDuelAnimation
.loop_shuffle_anim
call DoFrame
@@ -2255,7 +2255,7 @@ PlayShuffleAndDrawCardsAnimation: ; 4e98 (1:4e98)
; get the draw animation from input value of c
ld hl, sp+$00
ld a, [hl]
- call Func_3b6a
+ call PlayDuelAnimation
.loop_drawing_anim
call DoFrame
@@ -2328,11 +2328,11 @@ Func_4f2d: ; 4f2d (1:4f2d)
.load_anim
; play animation 3 times
ld a, e
- call Func_3b6a
+ call PlayDuelAnimation
ld a, e
- call Func_3b6a
+ call PlayDuelAnimation
ld a, e
- call Func_3b6a
+ call PlayDuelAnimation
.loop_anim
call DoFrame
@@ -7054,23 +7054,23 @@ Func_6cab: ; 6cab (1:6cab)
jr z, .store_duelist_turn
call SwapTurn
ldh a, [hWhoseTurn]
- ld [wd4af], a
+ ld [wDuelAnimDuelistSide], a
call SwapTurn
jr .asm_6ccb
.store_duelist_turn
ldh a, [hWhoseTurn]
- ld [wd4af], a
+ ld [wDuelAnimDuelistSide], a
.asm_6ccb
xor a
- ld [wd4b0], a
+ ld [wDuelAnimLocationParam], a
ld a, DUEL_ANIM_SCREEN_MAIN_SCENE
ld [wDuelAnimationScreen], a
pop af
; play animation
- call Func_3b6a
+ call PlayDuelAnimation
.loop_anim
call DoFrame
call CheckAnyAnimationPlaying
@@ -7156,9 +7156,9 @@ HandlePoisonDamage: ; 6d3f (1:6d3f)
.not_double_poisoned
push af
- ld [wd4b1], a
+ ld [wDuelAnimDamage], a
xor a
- ld [wd4b2], a
+ ld [wDuelAnimDamage + 1], a
push hl
call Func_6c7e
@@ -7972,7 +7972,7 @@ _TossCoin: ; 71ad (1:71ad)
.asm_7223
call Func_3b21
ld a, DUEL_ANIM_COIN_SPIN
- call Func_3b6a
+ call PlayDuelAnimation
ld a, [wCoinTossDuelistType]
or a
@@ -7999,7 +7999,7 @@ _TossCoin: ; 71ad (1:71ad)
; load the correct tossing animation
; and wait for it to finish
ld a, d
- call Func_3b6a
+ call PlayDuelAnimation
ld a, [wCoinTossDuelistType]
or a
jr z, .wait_anim
@@ -8029,7 +8029,7 @@ _TossCoin: ; 71ad (1:71ad)
.show_result
ld a, b
- call Func_3b6a
+ call PlayDuelAnimation
; load correct sound effect
; the sound of the coin toss result
@@ -8322,9 +8322,9 @@ Func_741a: ; 741a (1:741a)
ld a, e
ld [wLoadedMoveAnimation], a
xor a
- ld [wd4b0], a
+ ld [wDuelAnimLocationParam], a
push hl
- farcall Func_18f9c
+ farcall PlayAttackAnimationCommands
pop hl
jr .loop
.done
@@ -8406,7 +8406,7 @@ PlayMoveAnimation: ; 7494 (1:7494)
ld [wLoadedMoveAnimation], a
.got_anim
- farcall Func_18f9c
+ farcall PlayAttackAnimationCommands
pop bc
pop de
pop hl
diff --git a/src/engine/bank03.asm b/src/engine/bank03.asm
index 7a5884e..87c9401 100644
--- a/src/engine/bank03.asm
+++ b/src/engine/bank03.asm
@@ -683,7 +683,7 @@ Func_c4b9: ; c4b9 (3:44b9)
ld [wVRAMTileOffset], a
ld [wd4cb], a
ld a, $1d
- farcall Func_80418
+ farcall LoadPaletteData
ld b, $0
ld a, [wConsole]
cp CONSOLE_CGB
diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm
index 65bf179..b8a40a6 100644
--- a/src/engine/bank04.asm
+++ b/src/engine/bank04.asm
@@ -1466,7 +1466,7 @@ Func_129fd: ; 129fd (4:69fd)
ret
; 0x12a13
-Func_12a13: ; 12a13 (4:6a13)
+GetSpriteAnimCounter: ; 12a13 (4:6a13)
ld a, [wWhichSprite]
push hl
push bc
@@ -1683,11 +1683,11 @@ HandleAnimationFrame: ; 12b13 (4:6b13)
adc 0
ld [hl], a
- ld de, wd23e
+ ld de, wLoadedPalData
ld bc, SPRITE_FRAME_OFFSET_SIZE
call CopyBankedDataToDE
pop hl ; beginning of current sprite_anim_buffer
- ld de, wd23e
+ ld de, wLoadedPalData
ld a, [de]
call GetAnimFramePointerFromOffset
inc de
diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm
index f314b48..5c8fbda 100644
--- a/src/engine/bank06.asm
+++ b/src/engine/bank06.asm
@@ -1051,7 +1051,9 @@ Func_18661: ; 18661 (6:4661)
; (6:46f7)
INCLUDE "data/effect_commands.asm"
-Func_18f9c: ; 18f9c (6:4f9c)
+; reads the animation commands from PointerTable_AttackAnimation
+; of attack in wLoadedMoveAnimation and plays them
+PlayAttackAnimationCommands: ; 18f9c (6:4f9c)
ld a, [wLoadedMoveAnimation]
or a
ret z
@@ -1060,126 +1062,137 @@ Func_18f9c: ; 18f9c (6:4f9c)
ld h, 0
add hl, hl
ld de, PointerTable_AttackAnimation
-.asm_4fa8
add hl, de
ld e, [hl]
inc hl
ld d, [hl]
+
push de
ld hl, wce7e
ld a, [hl]
or a
- jr nz, .asm_4fd3
+ jr nz, .read_command
ld [hl], $01
call Func_3b21
pop de
+
push de
ld a, DUEL_ANIM_SCREEN_MAIN_SCENE
ld [wDuelAnimationScreen], a
ld a, $01
ld [wd4b3], a
xor a
- ld [wd4b0], a
+ ld [wDuelAnimLocationParam], a
ld a, [de]
cp $04
- jr z, .asm_4fd3
- ld a, $96
- call Func_3b6a
-.asm_4fd3
+ jr z, .read_command
+ ld a, DUEL_ANIM_150
+ call PlayDuelAnimation
+.read_command
pop de
-.asm_4fd4
+ ; fallthrough
+
+PlayAttackAnimationCommands_NextCommand: ; 18fd4 (6:4fd4)
ld a, [de]
inc de
- ld hl, PointerTable_006_508f
+ ld hl, AnimationCommandPointerTable
jp JumpToFunctionInTable
-Func_18fdc: ; 18fdc (6:4fdc)
+AnimationCommand_AnimEnd: ; 18fdc (6:4fdc)
ret
-Func_18fdd: ; 18fdd (6:4fdd)
+AnimationCommand_AnimPlayer: ; 18fdd (6:4fdd)
ldh a, [hWhoseTurn]
- ld [wd4af], a
+ ld [wDuelAnimDuelistSide], a
ld a, [wDuelType]
cp $00
- jr nz, Func_19014
- ld a, $c2
- ld [wd4af], a
- jr Func_19014
+ jr nz, AnimationCommand_AnimNormal
+ ld a, PLAYER_TURN
+ ld [wDuelAnimDuelistSide], a
+ jr AnimationCommand_AnimNormal
-Func_18ff0: ; 18ff0 (6:4ff0)
+AnimationCommand_AnimOpponent: ; 18ff0 (6:4ff0)
call SwapTurn
ldh a, [hWhoseTurn]
- ld [wd4af], a
+ ld [wDuelAnimDuelistSide], a
call SwapTurn
ld a, [wDuelType]
cp $00
- jr nz, Func_19014
- ld a, $c3
- ld [wd4af], a
- jr Func_19014
+ jr nz, AnimationCommand_AnimNormal
+ ld a, OPPONENT_TURN
+ ld [wDuelAnimDuelistSide], a
+ jr AnimationCommand_AnimNormal
-Func_19009: ; 19009 (6:5009)
+AnimationCommand_AnimUnknown2: ; 19009 (6:5009)
ld a, [wce82]
and $7f
- ld [wd4b0], a
- jr Func_19014
+ ld [wDuelAnimLocationParam], a
+ jr AnimationCommand_AnimNormal
-Func_19013: ; 19013 (6:5013)
+AnimationCommand_AnimEnd2: ; 19013 (6:5013)
ret
-Func_19014: ; 19014 (6:5014)
+AnimationCommand_AnimNormal: ; 19014 (6:5014)
ld a, [de]
inc de
cp DUEL_ANIM_SHOW_DAMAGE
- jr z, .asm_502b
+ jr z, .show_damage
cp DUEL_ANIM_SHAKE1
- jr z, .asm_5057
+ jr z, .shake_1
cp DUEL_ANIM_SHAKE2
- jr z, .asm_505d
+ jr z, .shake_2
cp DUEL_ANIM_SHAKE3
- jr z, .asm_5063
+ jr z, .shake_3
.play_anim
- call Func_3b6a
- jr Func_18f9c.asm_4fd4
+ call PlayDuelAnimation
+ jr PlayAttackAnimationCommands_NextCommand
-.asm_502b
- ld a, $97
- call Func_3b6a
+.show_damage
+ ld a, DUEL_ANIM_PRINT_DAMAGE
+ call PlayDuelAnimation
ld a, [wce81]
ld [wd4b3], a
+
push de
ld hl, wce7f
- ld de, wd4b1
+ ld de, wDuelAnimDamage
ld a, [hli]
ld [de], a
inc de
ld a, [hli]
ld [de], a
pop de
+
ld a, $8c
- call Func_3b6a
+ call PlayDuelAnimation
ld a, [wDuelDisplayedScreen]
- cp $01
- jr nz, .asm_5054
- ld a, $98
- call Func_3b6a
-.asm_5054
- jp Func_18f9c.asm_4fd4
-.asm_5057
- ld c, $61
- ld b, $63
- jr .asm_5067
-.asm_505d
- ld c, $62
- ld b, $64
- jr .asm_5067
-.asm_5063
- ld c, $63
- ld b, $61
-.asm_5067
+ cp DUEL_MAIN_SCENE
+ jr nz, .skip_update_hud
+ ld a, DUEL_ANIM_UPDATE_HUD
+ call PlayDuelAnimation
+.skip_update_hud
+ jp PlayAttackAnimationCommands_NextCommand
+
+; screen shake happens differently
+; depending on whose turn it is
+.shake_1
+ ld c, DUEL_ANIM_SMALL_SHAKE_X
+ ld b, DUEL_ANIM_SMALL_SHAKE_Y
+ jr .check_duelist
+
+.shake_2
+ ld c, DUEL_ANIM_BIG_SHAKE_X
+ ld b, DUEL_ANIM_BIG_SHAKE_Y
+ jr .check_duelist
+
+.shake_3
+ ld c, DUEL_ANIM_SMALL_SHAKE_Y
+ ld b, DUEL_ANIM_SMALL_SHAKE_X
+
+.check_duelist
ldh a, [hWhoseTurn]
- cp $c2
+ cp PLAYER_TURN
ld a, c
jr z, .play_anim
ld a, [wDuelType]
@@ -1189,85 +1202,97 @@ Func_19014: ; 19014 (6:5014)
ld a, b
jr .play_anim
-Func_19079: ; 19079 (6:5079)
+AnimationCommand_AnimUnknown: ; 19079 (6:5079)
ld a, [de]
inc de
ld [wd4b3], a
ld a, [wce82]
- ld [wd4b0], a
- call Func_1909d
- ld a, $96
- call Func_3b6a
- jp Func_18f9c.asm_4fd4
-
-PointerTable_006_508f: ; 1908f (6:508f)
- dw Func_18fdc
- dw Func_19014
- dw Func_18fdd
- dw Func_18ff0
- dw Func_19079
- dw Func_19009
- dw Func_19013
-
-Func_1909d: ; 1909d (6:509d)
+ ld [wDuelAnimLocationParam], a
+ call SetDuelAnimationScreen
+ ld a, DUEL_ANIM_150
+ call PlayDuelAnimation
+ jp PlayAttackAnimationCommands_NextCommand
+
+AnimationCommandPointerTable: ; 1908f (6:508f)
+ dw AnimationCommand_AnimEnd ; anim_end
+ dw AnimationCommand_AnimNormal ; anim_normal
+ dw AnimationCommand_AnimPlayer ; anim_player
+ dw AnimationCommand_AnimOpponent ; anim_opponent
+ dw AnimationCommand_AnimUnknown ; anim_unknown
+ dw AnimationCommand_AnimUnknown2 ; anim_unknown2
+ dw AnimationCommand_AnimEnd2 ; anim_end2 (unused)
+
+; sets wDuelAnimationScreen according to wd4b3
+; if wd4b3 == $01, set it to Main Scene
+; if wd4b3 == $04, st it to Play Area scene
+SetDuelAnimationScreen: ; 1909d (6:509d)
ld a, [wd4b3]
cp $04
- jr z, .asm_50ad
+ jr z, .set_play_area_screen
cp $01
ret nz
ld a, DUEL_ANIM_SCREEN_MAIN_SCENE
ld [wDuelAnimationScreen], a
ret
-.asm_50ad
- ld a, [wd4b0]
+.set_play_area_screen
+ ld a, [wDuelAnimLocationParam]
ld l, a
ld a, [wWhoseTurn]
ld h, a
- cp $c2
- jr z, .asm_50cc
+ cp PLAYER_TURN
+ jr z, .player
+
+; opponent
ld a, [wDuelType]
cp $00
jr z, .asm_50c6
+
+; link duel or vs. AI
bit 7, l
jr z, .asm_50e2
jr .asm_50d2
+
.asm_50c6
bit 7, l
jr z, .asm_50da
jr .asm_50ea
-.asm_50cc
+
+.player
bit 7, l
jr z, .asm_50d2
jr .asm_50e2
+
.asm_50d2
- ld l, $04
- ld h, $c2
+ ld l, UNKNOWN_SCREEN_4
+ ld h, PLAYER_TURN
ld a, DUEL_ANIM_SCREEN_PLAYER_PLAY_AREA
- jr .asm_50f0
+ jr .ok
.asm_50da
- ld l, $04
- ld h, $c3
+ ld l, UNKNOWN_SCREEN_4
+ ld h, OPPONENT_TURN
ld a, DUEL_ANIM_SCREEN_PLAYER_PLAY_AREA
- jr .asm_50f0
+ jr .ok
.asm_50e2
- ld l, $05
- ld h, $c3
+ ld l, UNKNOWN_SCREEN_5
+ ld h, OPPONENT_TURN
ld a, DUEL_ANIM_SCREEN_OPP_PLAY_AREA
- jr .asm_50f0
+ jr .ok
.asm_50ea
- ld l, $05
- ld h, $c2
+ ld l, UNKNOWN_SCREEN_5
+ ld h, PLAYER_TURN
ld a, DUEL_ANIM_SCREEN_OPP_PLAY_AREA
-.asm_50f0:
+
+.ok:
ld [wDuelAnimationScreen], a
ret
-; this part is not perfectly analyzed.
-; needs some fix.
+Func_190f4: ; 190f4 (6:50f4)
ld a, [wd4b3]
cp $04
- jr z, Func_190fb.asm_510f
+ jr z, Func_1910f
+ ; fallthrough
+
Func_190fb: ; 190fb (6:50fb)
cp $01
jr nz, .asm_510e
@@ -1279,14 +1304,15 @@ Func_190fb: ; 190fb (6:50fb)
bank1call DrawDuelMainScene
.asm_510e
ret
-.asm_510f
- call Func_1909d
+
+Func_1910f: ; 1910f (6:510f)
+ call SetDuelAnimationScreen
ld a, [wDuelDisplayedScreen]
cp l
- jr z, .asm_512e
+ jr z, .skip_change_screen
ld a, l
push af
- ld l, $c2
+ ld l, PLAYER_TURN
ld a, [wDuelType]
cp $00
jr nz, .asm_5127
@@ -1296,27 +1322,30 @@ Func_190fb: ; 190fb (6:50fb)
call DrawYourOrOppPlayAreaScreen_Bank0
pop af
ld [wDuelDisplayedScreen], a
-.asm_512e
+.skip_change_screen
call DrawWideTextBox
ret
-; needs analyze.
+; prints text related to the damage received
+; by card stored in wTempNonTurnDuelistCardID
+; takes into account type effectiveness
+PrintDamageText: ; 19132 (6:5132)
push hl
push bc
push de
ld a, [wLoadedMoveAnimation]
cp ATK_ANIM_HEAL
- jr z, .asm_5164
+ jr z, .skip
cp ATK_ANIM_HEALING_WIND_PLAY_AREA
- jr z, .asm_5164
+ jr z, .skip
ld a, [wTempNonTurnDuelistCardID]
ld e, a
ld d, $00
call LoadCardDataToBuffer1_FromCardID
- ld a, $12
+ ld a, 18
call CopyCardNameAndLevel
- ld [hl], $00
+ ld [hl], TX_END
ld hl, wTxRam2
xor a
ld [hli], a
@@ -1325,50 +1354,54 @@ Func_190fb: ; 190fb (6:50fb)
ld a, [hli]
ld h, [hl]
ld l, a
- call Func_19168
+ call GetDamageText
ld a, l
or h
call nz, DrawWideTextBox_PrintText
-.asm_5164
+.skip
pop de
pop bc
pop hl
ret
-Func_19168: ; 19168 (6:5168)
+; returns in hl the text id associated with
+; the damage in hl and its effectiveness
+GetDamageText: ; 19168 (6:5168)
ld a, l
or h
- jr z, .asm_5188
+ jr z, .no_damage
call LoadTxRam3
ld a, [wce81]
ldtx hl, AttackDamageText
- and $06
- ret z
+ and (1 << RESISTANCE) | (1 << WEAKNESS)
+ ret z ; not weak or resistant
ldtx hl, WeaknessMoreDamage2Text
- cp $06
- ret z
- and $02
+ cp (1 << RESISTANCE) | (1 << WEAKNESS)
+ ret z ; weak and resistant
+ and (1 << WEAKNESS)
ldtx hl, WeaknessMoreDamageText
- ret nz
+ ret nz ; weak
ldtx hl, ResistanceLessDamageText
- ret
-.asm_5188
+ ret ; resistant
+
+.no_damage
call CheckNoDamageOrEffect
ret c
ldtx hl, NoDamageText
ld a, [wce81]
- and $04
- ret z
+ and (1 << RESISTANCE)
+ ret z ; not resistant
ldtx hl, ResistanceNoDamageText
- ret
+ ret ; resistant
-; needs analyze.
+UpdateMainSceneHUD: ; 19199 (6:5199)
ld a, [wDuelDisplayedScreen]
- cp $01
+ cp DUEL_MAIN_SCENE
ret nz
bank1call DrawDuelHUDs
ret
+Func_191a3: ; 191a3 (6:51a3)
ret
INCLUDE "data/attack_animations.asm"
diff --git a/src/engine/bank07.asm b/src/engine/bank07.asm
index 81356d3..953defc 100644
--- a/src/engine/bank07.asm
+++ b/src/engine/bank07.asm
@@ -574,17 +574,17 @@ Func_1c8bc: ; 1c8bc (7:48bc)
ld [wd42a], a
ld [wd4c0], a
xor a
- ld [wd4ac], a
- ld [wd4ad], a
+ ld [wDuelAnimBufferCurPos], a
+ ld [wDuelAnimBufferSize], a
ld [wd4b3], a
- call Func_1ccbc
+ call DefaultScreenAnimationUpdate
call Func_3ca0
pop bc
pop hl
ret
; 0x1c8ef
-Func_1c8ef: ; 1c8ef (7:48ef)
+PlayLoadedDuelAnimation: ; 1c8ef (7:48ef)
ld a, [wDoFrameFunction + 0]
cp LOW(Func_3ba2)
jr nz, .error
@@ -598,13 +598,13 @@ Func_1c8ef: ; 1c8ef (7:48ef)
.okay
ld a, [wTempAnimation]
ld [wd4bf], a
- cp $61
+ cp DUEL_SPECIAL_ANIMS
jp nc, Func_1cb5e
push hl
push bc
push de
- call Func_1cab3
+ call GetAnimationData
; hl: pointer
ld a, [wAnimationsDisabled]
@@ -685,7 +685,7 @@ Func_1c8ef: ; 1c8ef (7:48ef)
ld [wd4cb], a
ld a, [hli] ; ANIM_PALETTE_ID
- farcall Func_80418
+ farcall LoadPaletteData
ld a, [hli] ; ANIM_SPRITE_ANIM_ID
push af
@@ -755,7 +755,7 @@ GetAnimCoordsAndFlags: ; 1c9a2 (7:49a2)
add a ; 12 * [wDuelAnimationScreen]
ld c, a
- ld a, [wd4af]
+ ld a, [wDuelAnimDuelistSide]
cp PLAYER_TURN
jr z, .player_side
; opponent side
@@ -763,8 +763,8 @@ GetAnimCoordsAndFlags: ; 1c9a2 (7:49a2)
add c
ld c, a
.player_side
- ld a, [wd4b0]
- add c ; a = [wd4b0] + c
+ ld a, [wDuelAnimLocationParam]
+ add c ; a = [wDuelAnimLocationParam] + c
ld c, a
ld b, 0
ld hl, AnimationCoordinatesIndex
@@ -831,92 +831,97 @@ AnimationCoordinates:
anim_coords 56, 40, $00
anim_coords 24, 40, $00
-Func_1ca31: ; 1ca31 (7:4a31)
+; appends to end of wDuelAnimBuffer
+; the current duel animation
+LoadDuelAnimationToBuffer: ; 1ca31 (7:4a31)
push hl
push bc
- ld a, [wd4ac]
+ ld a, [wDuelAnimBufferCurPos]
ld b, a
- ld hl, wd4ad
+ ld hl, wDuelAnimBufferSize
ld a, [hl]
ld c, a
- add %00001000
+ add DUEL_ANIM_STRUCT_SIZE
and %01111111
cp b
- jp z, .asm_1ca6b
+ jp z, .skip
ld [hl], a
ld b, $00
- ld hl, wd42c
+ ld hl, wDuelAnimBuffer
add hl, bc
ld a, [wTempAnimation]
ld [hli], a
ld a, [wDuelAnimationScreen]
ld [hli], a
- ld a, [wd4af]
+ ld a, [wDuelAnimDuelistSide]
ld [hli], a
- ld a, [wd4b0]
+ ld a, [wDuelAnimLocationParam]
ld [hli], a
- ld a, [wd4b1]
+ ld a, [wDuelAnimDamage]
ld [hli], a
- ld a, [wd4b2]
+ ld a, [wDuelAnimDamage + 1]
ld [hli], a
ld a, [wd4b3]
ld [hli], a
- ld a, [wd4be]
+ ld a, [wDuelAnimReturnBank]
ld [hl], a
-.asm_1ca6b
+.skip
pop bc
pop hl
ret
-Func_1ca6e: ; 1ca6e (7:4a6e)
+; loads the animations from wDuelAnimBuffer
+; in acending order, starting at wDuelAnimBufferCurPos
+PlayBufferedDuelAnimations: ; 1ca6e (7:4a6e)
push hl
push bc
-.asm_1ca70
- ld a, [wd4ad]
+.next_duel_anim
+ ld a, [wDuelAnimBufferSize]
ld b, a
- ld a, [wd4ac]
+ ld a, [wDuelAnimBufferCurPos]
cp b
- jr z, .asm_1cab0
+ jr z, .skip
ld c, a
- add $08
- and $7f
- ld [wd4ac], a
+ add DUEL_ANIM_STRUCT_SIZE
+ and %01111111
+ ld [wDuelAnimBufferCurPos], a
ld b, $00
- ld hl, wd42c
+ ld hl, wDuelAnimBuffer
add hl, bc
ld a, [hli]
ld [wTempAnimation], a
ld a, [hli]
ld [wDuelAnimationScreen], a
ld a, [hli]
- ld [wd4af], a
+ ld [wDuelAnimDuelistSide], a
ld a, [hli]
- ld [wd4b0], a
+ ld [wDuelAnimLocationParam], a
ld a, [hli]
- ld [wd4b1], a
+ ld [wDuelAnimDamage], a
ld a, [hli]
- ld [wd4b2], a
+ ld [wDuelAnimDamage + 1], a
ld a, [hli]
ld [wd4b3], a
ld a, [hl]
- ld [wd4be], a
+ ld [wDuelAnimReturnBank], a
- call Func_1c8ef
+ call PlayLoadedDuelAnimation
call CheckAnyAnimationPlaying
- jr nc, .asm_1ca70
+ jr nc, .next_duel_anim
-.asm_1cab0
+.skip
pop bc
pop hl
ret
; 0x1cab3
; gets data from Animations for anim ID in a
-Func_1cab3: ; 1cab3 (7:4ab3)
+; outputs the pointer to the data in hl
+GetAnimationData: ; 1cab3 (7:4ab3)
push bc
ld a, [wTempAnimation]
ld l, a
@@ -942,36 +947,38 @@ Func_1cac5: ; 1cac5 (7:4ac5)
cp $80
jr z, .asm_1cb11
ld hl, wAnimationQueue
- ld c, $07
-.asm_1cadb
+ ld c, ANIMATION_QUEUE_LENGTH
+.loop_queue
push af
push bc
ld a, [hl]
cp $ff
- jr z, .asm_1caf4
+ jr z, .next
ld [wWhichSprite], a
- farcall Func_12a13
+ farcall GetSpriteAnimCounter
cp $ff
- jr nz, .asm_1caf4
+ jr nz, .next
farcall Func_129fa
ld a, $ff
ld [hl], a
-.asm_1caf4
+
+.next
pop bc
pop af
and [hl]
inc hl
dec c
- jr nz, .asm_1cadb
+ jr nz, .loop_queue
+
.asm_1cafb
cp $ff
- jr nz, .asm_1cb02
- call Func_1ca6e
-.asm_1cb02
+ jr nz, .skip_play_anims
+ call PlayBufferedDuelAnimations
+.skip_play_anims
ret
.asm_1cb03
- ld hl, wd4b9
+ ld hl, wScreenAnimUpdatePtr
ld a, [hli]
ld h, [hl]
ld l, a
@@ -1017,8 +1024,8 @@ Func_1cb18: ; 1cb18 (7:4b18)
dec c
jr nz, .asm_1cb3b
xor a
- ld [wd4ac], a
- ld [wd4ad], a
+ ld [wDuelAnimBufferCurPos], a
+ ld [wDuelAnimBufferSize], a
.asm_1cb57
pop de
pop bc
@@ -1033,13 +1040,13 @@ Func_1cb5e: ; 1cb5e (7:4b5e)
cp $96
jp nc, Func_1ce03
cp $8c
- jp nz, Func_1cc76
+ jp nz, InitScreenAnimation
jr .asm_1cb6a ; redundant
.asm_1cb6a
- ld a, [wd4b2]
+ ld a, [wDuelAnimDamage + 1]
cp $03
jr nz, .asm_1cb76
- ld a, [wd4b1]
+ ld a, [wDuelAnimDamage]
cp $e8
.asm_1cb76
ret nc
@@ -1050,7 +1057,7 @@ Func_1cb5e: ; 1cb5e (7:4b5e)
ld [wd4cb], a
ld a, $25
- farcall Func_80418
+ farcall LoadPaletteData
call Func_1cba6
ld hl, wd4b3
@@ -1111,7 +1118,7 @@ Func_1cbcc: ; 1cbcc (7:4bcc)
call GetAnimCoordsAndFlags
ld a, [wd4b7]
- add $fd
+ add -3
ld e, a
ld a, $4b
adc 0
@@ -1132,9 +1139,9 @@ Func_1cbcc: ; 1cbcc (7:4bcc)
INCROM $1cbfd, $1cc03
Func_1cc03: ; 1cc03 (7:4c03)
- ld a, [wd4b1]
+ ld a, [wDuelAnimDamage]
ld l, a
- ld a, [wd4b2]
+ ld a, [wDuelAnimDamage + 1]
ld h, a
ld de, wd4b4
@@ -1214,13 +1221,16 @@ Func_1cc66: ; 1cc66 (7:4c66)
ret
; 0x1cc76
-Func_1cc76: ; 1cc76 (7:4c76)
+; initializes a screen animation from wTempAnimation
+; loads a function pointer for updating a frame
+; and initializes the duration of the animation.
+InitScreenAnimation: ; 1cc76 (7:4c76)
ld a, [wAnimationsDisabled]
or a
- jr nz, .asm_1cc9e
+ jr nz, .skip
ld a, [wTempAnimation]
ld [wd42a], a
- sub $61
+ sub DUEL_SCREEN_ANIMS
add a
add a
ld c, a
@@ -1228,39 +1238,50 @@ Func_1cc76: ; 1cc76 (7:4c76)
ld hl, Data_1cc9f
add hl, bc
ld a, [hli]
- ld [wd4b9], a
+ ld [wScreenAnimUpdatePtr], a
ld c, a
ld a, [hli]
- ld [wd4b9 + 1], a
+ ld [wScreenAnimUpdatePtr + 1], a
ld b, a
ld a, [hl]
- ld [wd4bb], a
+ ld [wScreenAnimDuration], a
call CallBC
-.asm_1cc9e
+.skip
ret
; 0x1cc9f
-macro_1cc9f: MACRO
- dw \1
- db \2
- db \3
+; for the following animations, these functions
+; are run with the corresponding duration.
+; this duration decides different effects,
+; depending on which function runs
+; and is decreased by one each time.
+; when it is down to 0, the animation is done.
+
+screen_effect: MACRO
+ dw \1 ; function pointer
+ db \2 ; duration
+ db $00 ; padding
ENDM
Data_1cc9f: ; 1cc9f (7:4c9f)
- macro_1cc9f Func_1cce4, $18, $00
- macro_1cc9f Func_1cce9, $20, $00
- macro_1cc9f Func_1cd10, $18, $00
- macro_1cc9f Func_1cd15, $20, $00
- macro_1cc9f Func_1cd76, $08, $00
- macro_1cc9f Func_1cdc3, $3f, $00
-
-Func_1ccb7: ; 1ccb7 (7:4cb7)
- ld a, [wd4bb]
+; function pointer, duration
+ screen_effect ShakeScreenX_Small, 24 ; DUEL_ANIM_SMALL_SHAKE_X
+ screen_effect ShakeScreenX_Big, 32 ; DUEL_ANIM_BIG_SHAKE_X
+ screen_effect ShakeScreenY_Small, 24 ; DUEL_ANIM_SMALL_SHAKE_Y
+ screen_effect ShakeScreenY_Big, 32 ; DUEL_ANIM_BIG_SHAKE_Y
+ screen_effect WhiteFlashScreen, 8 ; DUEL_ANIM_FLASH
+ screen_effect DistortScreen, 63 ; DUEL_ANIM_DISTORT
+
+; checks if screen animation duration is over
+; and if so, loads the default update function
+LoadDefaultScreenAnimationUpdateWhenFinished: ; 1ccb7 (7:4cb7)
+ ld a, [wScreenAnimDuration]
or a
ret nz
; fallthrough
-Func_1ccbc: ; 1ccbc (7:4cbc)
+; function called for the screen animation update when it is over
+DefaultScreenAnimationUpdate: ; 1ccbc (7:4cbc)
ld a, $ff
ld [wd42a], a
call DisableInt_LYCoincidence
@@ -1268,81 +1289,92 @@ Func_1ccbc: ; 1ccbc (7:4cbc)
ldh [hSCX], a
ldh [rSCX], a
ldh [hSCY], a
- ld hl, wd4b9
- ld [hl], LOW(Func_1ccbc)
+ ld hl, wScreenAnimUpdatePtr
+ ld [hl], LOW(DefaultScreenAnimationUpdate)
inc hl
- ld [hl], HIGH(Func_1ccbc)
+ ld [hl], HIGH(DefaultScreenAnimationUpdate)
ret
; 0x1ccd4
Func_1ccd4: ; 1ccd4 (7:4cd4)
- INCROM $1ccd4, $1cce4
+ ld a, 1
+ ld [wScreenAnimDuration], a
+ ld hl, wScreenAnimUpdatePtr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call CallHL2
+ jr DefaultScreenAnimationUpdate
+; 0x1cce4
-Func_1cce4: ; 1cce4 (7:4ce4)
- ld hl, Data_1cd55
- jr Func_1ccee
+ShakeScreenX_Small: ; 1cce4 (7:4ce4)
+ ld hl, SmallShakeOffsets
+ jr ShakeScreenX
-Func_1cce9: ; 1cce9 (7:4ce9)
- ld hl, Data_1cd61
- jr Func_1ccee
+ShakeScreenX_Big: ; 1cce9 (7:4ce9)
+ ld hl, BigShakeOffsets
+ jr ShakeScreenX
-Func_1ccee: ; 1ccee (7:4cee)
+ShakeScreenX: ; 1ccee (7:4cee)
ld a, l
ld [wd4bc], a
ld a, h
ld [wd4bc + 1], a
- ld hl, wd4b9
- ld [hl], LOW(.asm_1ccff)
+ ld hl, wScreenAnimUpdatePtr
+ ld [hl], LOW(.update)
inc hl
- ld [hl], HIGH(.asm_1ccff)
+ ld [hl], HIGH(.update)
ret
-.asm_1ccff
- call Func_1cd71
- call Func_1cd3c
- jp nc, Func_1ccb7
+.update
+ call DecrementScreenAnimDuration
+ call UpdateShakeOffset
+ jp nc, LoadDefaultScreenAnimationUpdateWhenFinished
ldh a, [hSCX]
add [hl]
ldh [hSCX], a
- jp Func_1ccb7
+ jp LoadDefaultScreenAnimationUpdateWhenFinished
; 0x1cd10
-Func_1cd10: ; 1cd10 (7:4d10)
- ld hl, Data_1cd55
- jr Func_1cd1a
+ShakeScreenY_Small: ; 1cd10 (7:4d10)
+ ld hl, SmallShakeOffsets
+ jr ShakeScreenY
-Func_1cd15: ; 1cd15 (7:4d15)
- ld hl, Data_1cd61
- jr Func_1cd1a
+ShakeScreenY_Big: ; 1cd15 (7:4d15)
+ ld hl, BigShakeOffsets
+ jr ShakeScreenY
-Func_1cd1a: ; 1cd1a (7:4d1a)
+ShakeScreenY: ; 1cd1a (7:4d1a)
ld a, l
ld [wd4bc], a
ld a, h
ld [wd4bc + 1], a
- ld hl, wd4b9
- ld [hl], LOW(.asm_1cd2b)
+ ld hl, wScreenAnimUpdatePtr
+ ld [hl], LOW(.update)
inc hl
- ld [hl], HIGH(.asm_1cd2b)
+ ld [hl], HIGH(.update)
ret
-.asm_1cd2b
- call Func_1cd71
- call Func_1cd3c
- jp nc, Func_1ccb7
+.update
+ call DecrementScreenAnimDuration
+ call UpdateShakeOffset
+ jp nc, LoadDefaultScreenAnimationUpdateWhenFinished
ldh a, [hSCY]
add [hl]
ldh [hSCY], a
- jp Func_1ccb7
+ jp LoadDefaultScreenAnimationUpdateWhenFinished
; 0x1cd3c
-Func_1cd3c: ; 1cd3c (7:4d3c)
+; get the displacement of the current frame
+; depending on the value of wScreenAnimDuration
+; returns carry if displacement was updated
+UpdateShakeOffset: ; 1cd3c (7:4d3c)
ld hl, wd4bc
ld a, [hli]
ld h, [hl]
ld l, a
- ld a, [wd4bb]
+ ld a, [wScreenAnimDuration]
cp [hl]
ret nc
inc hl
@@ -1357,103 +1389,132 @@ Func_1cd3c: ; 1cd3c (7:4d3c)
ret
; 0x1cd55
-Data_1cd55: ; 1cd55 (7:4d55)
- db $15, $02, $11, $fe, $0d, $02, $09, $fe, $05, $01, $01, $ff
-
-Data_1cd61: ; 1cd61 (7:4d61)
- db $1d, $04, $19, $fc, $15, $04, $11, $fc, $0d, $03, $09, $fd, $05, $02, $01, $fe
-
-Func_1cd71: ; 1cd71 (7:4d71)
- ld hl, wd4bb
+SmallShakeOffsets: ; 1cd55 (7:4d55)
+ db 21, 2
+ db 17, -2
+ db 13, 2
+ db 9, -2
+ db 5, 1
+ db 1, -1
+
+BigShakeOffsets: ; 1cd61 (7:4d61)
+ db 29, 4
+ db 25, -4
+ db 21, 4
+ db 17, -4
+ db 13, 3
+ db 9, -3
+ db 5, 2
+ db 1, -2
+
+DecrementScreenAnimDuration: ; 1cd71 (7:4d71)
+ ld hl, wScreenAnimDuration
dec [hl]
ret
; 0x1cd76
-Func_1cd76: ; 1cd76 (7:4d76)
- ld hl, wd4b9
- ld [hl], $a3
+WhiteFlashScreen: ; 1cd76 (7:4d76)
+ ld hl, wScreenAnimUpdatePtr
+ ld [hl], LOW(.update)
inc hl
- ld [hl], $4d
+ ld [hl], HIGH(.update)
ld a, [wBGP]
ld [wd4bc], a
+ ; backup the current background pals
ld hl, wBackgroundPalettesCGB
- ld de, wd297
+ ld de, wTempBackgroundPalettesCGB
ld bc, 8 palettes
call CopyDataHLtoDE_SaveRegisters
- ld de, $7fff
+ ld de, $7fff ; rgb 31, 31, 31
ld hl, wBackgroundPalettesCGB
- ld bc, $20
+ ld bc, (8 palettes) / 2
call FillMemoryWithDE
xor a
call SetBGP
call FlushAllPalettes
- call Func_1cd71
- ld a, [wd4bb]
+
+.update
+ call DecrementScreenAnimDuration
+ ld a, [wScreenAnimDuration]
or a
ret nz
- ld hl, wd297
+ ; retreive the previous background pals
+ ld hl, wTempBackgroundPalettesCGB
ld de, wBackgroundPalettesCGB
ld bc, 8 palettes
call CopyDataHLtoDE_SaveRegisters
ld a, [wd4bc]
call SetBGP
call FlushAllPalettes
- jp Func_1ccbc
+ jp DefaultScreenAnimationUpdate
; 0x1cdc3
-Func_1cdc3: ; 1cdc3 (7:4dc3)
- ld hl, wd4b9
- ld [hl], $df
+DistortScreen: ; 1cdc3 (7:4dc3)
+ ld hl, wScreenAnimUpdatePtr
+ ld [hl], LOW(.update)
inc hl
- ld [hl], $4d
+ ld [hl], HIGH(.update)
xor a
ld [wApplyBGScroll], a
- ld hl, $cace
- ld [hl], $a6
+ ld hl, wLCDCFunctionTrampoline + 1
+ ld [hl], LOW(ApplyBackgroundScroll)
inc hl
- ld [hl], $3e
- ld a, $01
+ ld [hl], HIGH(ApplyBackgroundScroll)
+ ld a, 1
ld [wBGScrollMod], a
call EnableInt_LYCoincidence
- ld a, [$d4bb]
+
+.update
+ ld a, [wScreenAnimDuration]
srl a
srl a
srl a
- and $07
+ and %00000111
ld c, a
ld b, $00
- ld hl, $4dfb
+ ld hl, .BGScrollModData
add hl, bc
ld a, [hl]
ld [wBGScrollMod], a
- call Func_1cd71
- jp Func_1ccb7
-; 0x1cdfb
+ call DecrementScreenAnimDuration
+ jp LoadDefaultScreenAnimationUpdateWhenFinished
- INCROM $1cdfb, $1ce03
+; each value is applied for 8 "ticks" of wScreenAnimDuration
+; starting from the last and running backwards
+.BGScrollModData
+ db 4, 3, 2, 1, 1, 1, 1, 2
+; 0x1ce03
Func_1ce03: ; 1ce03 (7:4e03)
- cp $9e
+ cp DUEL_ANIM_158
jr z, .asm_1ce17
sub $96
add a
ld c, a
ld b, $00
- ld hl, $4e22
+ ld hl, .pointer_table
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
jp Func_3bb5
+
.asm_1ce17
- ld a, [wd4b1]
+ ld a, [wDuelAnimDamage]
ld l, a
- ld a, [wd4b2]
+ ld a, [wDuelAnimDamage + 1]
ld h, a
jp Func_3bb5
-; 0x1ce22
- INCROM $1ce22, $1ce32
+.pointer_table
+ dw Func_190f4 ; DUEL_ANIM_150
+ dw PrintDamageText ; DUEL_ANIM_PRINT_DAMAGE
+ dw UpdateMainSceneHUD ; DUEL_ANIM_UPDATE_HUD
+ dw Func_191a3 ; DUEL_ANIM_153
+ dw Func_191a3 ; DUEL_ANIM_154
+ dw Func_191a3 ; DUEL_ANIM_155
+ dw Func_191a3 ; DUEL_ANIM_156
+ dw Func_191a3 ; DUEL_ANIM_157
; data for each animation ID (see src/constants/sprite_constants.asm)
Animations: ; 1ce32 (7:4e32)
diff --git a/src/engine/bank20.asm b/src/engine/bank20.asm
index 31e6d91..9e5aa31 100644
--- a/src/engine/bank20.asm
+++ b/src/engine/bank20.asm
@@ -33,7 +33,7 @@ Func_80082: ; 80082 (20:4082)
call Func_803b9
ld a, [wTempPointerBank]
ld [wd23d], a
- ld de, wd23e
+ ld de, wLoadedPalData
ld bc, $0006
call CopyBankedDataToDE
ld l, e
@@ -87,7 +87,7 @@ Func_800e0: ; 800e0 (20:40e0)
sla [hl]
.asm_800f0
ld c, $40
- ld hl, wd23e
+ ld hl, wLoadedPalData
xor a
.asm_800f6
ld [hli], a
@@ -101,13 +101,13 @@ Func_800e0: ; 800e0 (20:40e0)
ld b, $00
ld a, [wd28e]
ld c, a
- ld de, wd23e
+ ld de, wLoadedPalData
call Func_3be4
ld a, [wd12f]
ld b, a
pop de
push de
- ld hl, wd23e
+ ld hl, wLoadedPalData
call Func_8016e
ld a, [wConsole]
cp $02
@@ -116,7 +116,7 @@ Func_800e0: ; 800e0 (20:40e0)
ld a, [wd12f]
ld c, a
ld b, $00
- ld hl, wd23e
+ ld hl, wLoadedPalData
add hl, bc
pop de
push de
@@ -422,7 +422,7 @@ Func_803b9: ; 803b9 (20:43b9)
; b = palette index
; c = palette size
; hl = palette data to copy
-LoadPaletteData: ; 803ec (20:43ec)
+LoadPaletteDataFromHL: ; 803ec (20:43ec)
push hl
push bc
push de
@@ -466,13 +466,14 @@ LoadPaletteData: ; 803ec (20:43ec)
ret
; 0x80418
-Func_80418: ; 80418 (20:4418)
+; loads palette index a
+LoadPaletteData: ; 80418 (20:4418)
push hl
push bc
push de
call CopyPaletteDataToBuffer
- ld hl, wd23e
+ ld hl, wLoadedPalData
ld a, [hli] ; number palettes
ld c, a
or a
@@ -513,7 +514,7 @@ Func_80418: ; 80418 (20:4418)
; ensure it's a palette index starting from wObjectPalettesCGB
or NUM_BACKGROUND_PALETTES
ld b, a
- call LoadPaletteData
+ call LoadPaletteDataFromHL
.done
pop de
@@ -522,7 +523,7 @@ Func_80418: ; 80418 (20:4418)
ret
; 0x80456
-; copies palette data of index in a to wd23e
+; copies palette data of index in a to wLoadedPalData
CopyPaletteDataToBuffer: ; 80456 (20:4456)
push hl
push bc
@@ -545,7 +546,7 @@ CopyPaletteDataToBuffer: ; 80456 (20:4456)
ld c, a
ld b, $00
- ld de, wd23e
+ ld de, wLoadedPalData
call CopyBankedDataToDE
pop de
pop bc
diff --git a/src/engine/home.asm b/src/engine/home.asm
index 6f8ae26..944a99f 100644
--- a/src/engine/home.asm
+++ b/src/engine/home.asm
@@ -11119,36 +11119,39 @@ CheckAnyAnimationPlaying: ; 3b52 (0:3b52)
pop hl
ret
+; plays duel animation
+; the animations are loaded to a buffer
+; and played in order, so they can be stacked
; input:
; - a = animation index
-Func_3b6a: ; 3b6a (0:3b6a)
+PlayDuelAnimation: ; 3b6a (0:3b6a)
ld [wTempAnimation], a ; hold an animation temporarily
ldh a, [hBankROM]
push af
- ld [wd4be], a
+ ld [wDuelAnimReturnBank], a
push hl
push bc
push de
- ld a, BANK(Func_1ca31) ; BANK(Func_1c8ef)
+ ld a, BANK(LoadDuelAnimationToBuffer)
call BankswitchROM
ld a, [wTempAnimation]
- cp $61
- jr nc, .asm_3b90
+ cp DUEL_SPECIAL_ANIMS
+ jr nc, .load_buffer
- ld hl, wd4ad
- ld a, [wd4ac]
+ ld hl, wDuelAnimBufferSize
+ ld a, [wDuelAnimBufferCurPos]
cp [hl]
- jr nz, .asm_3b90
+ jr nz, .load_buffer
call CheckAnyAnimationPlaying
- jr nc, .asm_3b95
+ jr nc, .play_anim
-.asm_3b90
- call Func_1ca31
+.load_buffer
+ call LoadDuelAnimationToBuffer
jr .done
-.asm_3b95
- call Func_1c8ef
+.play_anim
+ call PlayLoadedDuelAnimation
jr .done
.done
@@ -11175,7 +11178,7 @@ Func_3bb5: ; 3bb5 (0:3bb5)
ld [wd4c0], a
ldh a, [hBankROM]
push af
- ld a, [wd4be]
+ ld a, [wDuelAnimReturnBank]
call BankswitchROM
call Func_3cb4
call CallHL2
diff --git a/src/macros/wram.asm b/src/macros/wram.asm
index 7b8456b..d17c505 100644
--- a/src/macros/wram.asm
+++ b/src/macros/wram.asm
@@ -83,3 +83,13 @@ sprite_vram_struct: MACRO
\1TileOffset:: ds 1
\1TileSize:: ds 1
ENDM
+
+duel_anim_struct: MACRO
+\1ID:: ds 1
+\1Screen:: ds 1
+\1DuelistSide:: ds 1
+\1LocationParam:: ds 1
+\1Damage:: ds 2
+\1Unknown2:: ds 1
+\1Bank:: ds 1
+ENDM
diff --git a/src/wram.asm b/src/wram.asm
index 23dea8a..7ea2def 100644
--- a/src/wram.asm
+++ b/src/wram.asm
@@ -2137,10 +2137,9 @@ wd23c:: ; d23c
wd23d:: ; d23d
ds $1
-wd23e:: ; d23e
- ds $1
-
- ds $4f
+; palette loaded from Palette* data
+wLoadedPalData:: ; d23e
+ ds $50
wd28e:: ; d28e
ds $1
@@ -2159,7 +2158,9 @@ wd292:: ; d292
ds $4
-wd297:: ; d297
+; temporarily holds the palettes from
+; wBackgroundPalettesCGB
+wTempBackgroundPalettesCGB:: ; d297
ds 8 palettes
ds $4c
@@ -2376,13 +2377,28 @@ wd42a:: ; d42a
wAnimFlags:: ; d42b
ds $1
-wd42c:: ; d42c
- ds $80
+wDuelAnimBuffer:: ; d42c
+ duel_anim_struct wDuelAnim1
+ duel_anim_struct wDuelAnim2
+ duel_anim_struct wDuelAnim3
+ duel_anim_struct wDuelAnim4
+ duel_anim_struct wDuelAnim5
+ duel_anim_struct wDuelAnim6
+ duel_anim_struct wDuelAnim7
+ duel_anim_struct wDuelAnim8
+ duel_anim_struct wDuelAnim9
+ duel_anim_struct wDuelAnim10
+ duel_anim_struct wDuelAnim11
+ duel_anim_struct wDuelAnim12
+ duel_anim_struct wDuelAnim13
+ duel_anim_struct wDuelAnim14
+ duel_anim_struct wDuelAnim15
+ duel_anim_struct wDuelAnim16
-wd4ac:: ; d4ac
+wDuelAnimBufferCurPos:: ; d4ac
ds $1
-wd4ad:: ; d4ad
+wDuelAnimBufferSize:: ; d4ad
ds $1
; used to know what coordinate offsets to use to place animations
@@ -2393,17 +2409,21 @@ wd4ad:: ; d4ad
wDuelAnimationScreen:: ; d4ae
ds $1
-wd4af:: ; d4af
+; which side to play animation
+; uses PLAYER_TURN and OPPONENT_TURN constants
+wDuelAnimDuelistSide:: ; d4af
ds $1
-wd4b0:: ; d4b0
+; used in GetAnimCoordsAndFlags to determine
+; what coordinates to draw the animation in.
+; e.g. used to know what Play Area card
+; to draw a hit animation in the Play Area screen.
+wDuelAnimLocationParam:: ; d4b0
ds $1
-wd4b1:: ; d4b1
- ds $1
-
-wd4b2:: ; d4b2
- ds $1
+; damage value to display with animation
+wDuelAnimDamage:: ; d4b1
+ ds $2
wd4b3:: ; d4b3
ds $1
@@ -2419,16 +2439,20 @@ wd4b7:: ; d4b7
wd4b8:: ; d4b8
ds $1
-wd4b9:: ; d4b9
+; pointer to a function to update
+; the current screen animation
+wScreenAnimUpdatePtr:: ; d4b9
ds $2
-wd4bb:: ; d4bb
+; duration of the current screen animation
+wScreenAnimDuration:: ; d4bb
ds $1
wd4bc:: ; d4bc
ds $2
-wd4be:: ; d4be
+; bank number to return to after processing animation
+wDuelAnimReturnBank:: ; d4be
ds $1
wd4bf:: ; d4bf