diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/constants/animation_constants.asm | 34 | ||||
-rw-r--r-- | src/constants/duel_interface_constants.asm | 2 | ||||
-rw-r--r-- | src/data/attack_animations.asm | 32 | ||||
-rw-r--r-- | src/data/palettes1.asm | 2 | ||||
-rw-r--r-- | src/engine/bank01.asm | 42 | ||||
-rw-r--r-- | src/engine/bank03.asm | 2 | ||||
-rw-r--r-- | src/engine/bank04.asm | 6 | ||||
-rw-r--r-- | src/engine/bank06.asm | 279 | ||||
-rw-r--r-- | src/engine/bank07.asm | 375 | ||||
-rw-r--r-- | src/engine/bank20.asm | 23 | ||||
-rw-r--r-- | src/engine/home.asm | 31 | ||||
-rw-r--r-- | src/macros/wram.asm | 10 | ||||
-rw-r--r-- | src/wram.asm | 62 |
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 |