summaryrefslogtreecommitdiff
path: root/src/engine
diff options
context:
space:
mode:
authordannye <33dannye@gmail.com>2021-01-06 22:01:30 -0600
committerdannye <33dannye@gmail.com>2021-01-06 22:01:30 -0600
commit0dc8af64aab2658a882f73d34bd7a5cc6563f7a1 (patch)
treee9b1a552f849a7c4bef055725b018937b3f5c56c /src/engine
parentfec3f3580a54dbaa3dfb138398c92b37d6c58dee (diff)
parenta99feeb46f165fd7c4419811be4b3f591d8f1dad (diff)
Merge branch 'anims' of https://github.com/ElectroDeoxys/poketcg
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/bank01.asm408
-rwxr-xr-xsrc/engine/bank03.asm11
-rw-r--r--src/engine/bank04.asm167
-rw-r--r--src/engine/bank06.asm47
-rw-r--r--src/engine/bank07.asm1529
-rw-r--r--src/engine/bank20.asm930
-rw-r--r--src/engine/home.asm34
7 files changed, 2753 insertions, 373 deletions
diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm
index 572109f..2c2a23f 100644
--- a/src/engine/bank01.asm
+++ b/src/engine/bank01.asm
@@ -183,16 +183,18 @@ MainDuelLoop: ; 40ee (1:40ee)
pop af
ldh [hWhoseTurn], a
call Func_3b21
+
+; animate the duel result screen
+; load the correct music and animation depending on result
ld a, [wDuelFinished]
cp TURN_PLAYER_WON
jr z, .active_duelist_won_battle
cp TURN_PLAYER_LOST
jr z, .active_duelist_lost_battle
- ld a, $5f
+ ld a, DUEL_ANIM_DUEL_DRAW
ld c, MUSIC_MATCH_DRAW
ldtx hl, DuelWasADrawText
jr .handle_duel_finished
-
.active_duelist_won_battle
ldh a, [hWhoseTurn]
cp PLAYER_TURN
@@ -200,11 +202,10 @@ MainDuelLoop: ; 40ee (1:40ee)
.player_won_battle
xor a ; DUEL_WIN
ld [wDuelResult], a
- ld a, $5d
+ ld a, DUEL_ANIM_DUEL_WIN
ld c, MUSIC_MATCH_VICTORY
ldtx hl, WonDuelText
jr .handle_duel_finished
-
.active_duelist_lost_battle
ldh a, [hWhoseTurn]
cp PLAYER_TURN
@@ -212,7 +213,7 @@ MainDuelLoop: ; 40ee (1:40ee)
.opponent_won_battle
ld a, DUEL_LOSS
ld [wDuelResult], a
- ld a, $5e
+ ld a, DUEL_ANIM_DUEL_LOSS
ld c, MUSIC_MATCH_LOSS
ldtx hl, LostDuelText
@@ -1491,7 +1492,7 @@ DisplayDrawNCardsScreen: ; 4935 (1:4935)
call DrawWideTextBox_PrintText
call EnableLCD
.anim_drawing_cards_loop
- call Func_49a8
+ call PlayTurnDuelistDrawAnimation
ld hl, wNumCardsBeingDrawn
inc [hl]
call PrintNumberOfHandAndDeckCards
@@ -1512,23 +1513,26 @@ DisplayDrawNCardsScreen: ; 4935 (1:4935)
pop hl
ret
-Func_49a8: ; 49a8 (1:49a8)
+; animates the screen for Turn Duelist drawing a card
+PlayTurnDuelistDrawAnimation: ; 49a8 (1:49a8)
call Func_3b21
- ld e, $56
+ ld e, DUEL_ANIM_PLAYER_DRAW
ldh a, [hWhoseTurn]
cp PLAYER_TURN
- jr z, .asm_49b5
- ld e, $57
-.asm_49b5
+ jr z, .got_duelist
+ ld e, DUEL_ANIM_OPP_DRAW
+.got_duelist
ld a, e
call Func_3b6a
-.asm_49b9
+
+.loop_anim
call DoFrame
call CheckSkipDelayAllowed
- jr c, .asm_49c6
+ jr c, .done_anim
call CheckAnyAnimationPlaying
- jr c, .asm_49b9
-.asm_49c6
+ jr c, .loop_anim
+
+.done_anim
call Func_3b31
ret
@@ -1749,7 +1753,7 @@ Func_4b60: ; 4b60 (1:4b60)
call SwapTurn
call InitializeDuelVariables
call SwapTurn
- call Func_4e84
+ call PlayShuffleAndDrawCardsAnimation_BothDuelists
call ShuffleDeckAndDrawSevenCards
ldh [hTemp_ffa0], a
call SwapTurn
@@ -1771,7 +1775,7 @@ Func_4b60: ; 4b60 (1:4b60)
.ensure_player_basic_pkmn_loop
call DisplayNoBasicPokemonInHandScreenAndText
call InitializeDuelVariables
- call Func_4e6e
+ call PlayShuffleAndDrawCardsAnimation_TurnDuelist
call ShuffleDeckAndDrawSevenCards
jr c, .ensure_player_basic_pkmn_loop
jr .hand_cards_ok
@@ -1781,7 +1785,7 @@ Func_4b60: ; 4b60 (1:4b60)
.ensure_opp_basic_pkmn_loop
call DisplayNoBasicPokemonInHandScreenAndText
call InitializeDuelVariables
- call Func_4e6e
+ call PlayShuffleAndDrawCardsAnimation_TurnDuelist
call ShuffleDeckAndDrawSevenCards
jr c, .ensure_opp_basic_pkmn_loop
call SwapTurn
@@ -2170,31 +2174,37 @@ DisplayPracticeDuelPlayerHandScreen: ; 4e40 (1:4e40)
call EnableLCD
ret
-Func_4e6e: ; 4e6e (1:4e6e)
- ld b, $51
- ld c, $56
+PlayShuffleAndDrawCardsAnimation_TurnDuelist: ; 4e6e (1:4e6e)
+ ld b, DUEL_ANIM_PLAYER_SHUFFLE
+ ld c, DUEL_ANIM_PLAYER_DRAW
ldh a, [hWhoseTurn]
cp PLAYER_TURN
- jr z, .asm_4e7c
- ld b, $52
- ld c, $57
-.asm_4e7c
+ jr z, .play_anim
+ ld b, DUEL_ANIM_OPP_SHUFFLE
+ ld c, DUEL_ANIM_OPP_DRAW
+.play_anim
ldtx hl, ShufflesTheDeckText
ldtx de, Drew7CardsText
- jr Func_4e98
+ jr PlayShuffleAndDrawCardsAnimation
-Func_4e84: ; 4e84 (1:4e84)
- ld b, $53
- ld c, $55
+PlayShuffleAndDrawCardsAnimation_BothDuelists: ; 4e84 (1:4e84)
+ ld b, DUEL_ANIM_BOTH_SHUFFLE
+ ld c, DUEL_ANIM_BOTH_DRAW
ldtx hl, EachPlayerShuffleOpponentsDeckText
ldtx de, EachPlayerDraw7CardsText
ld a, [wDuelType]
cp DUELTYPE_PRACTICE
- jr nz, Func_4e98
+ jr nz, PlayShuffleAndDrawCardsAnimation
ldtx hl, ThisIsJustPracticeDoNotShuffleText
; fallthrough
-Func_4e98: ; 4e98 (1:4e98)
+; animate the shuffle and drawing screen
+; input:
+; b = shuffling animation index
+; c = drawing animation index
+; hl = text to print while shuffling
+; de = text to print while drawing
+PlayShuffleAndDrawCardsAnimation: ; 4e98 (1:4e98)
push bc
push de
push hl
@@ -2211,63 +2221,75 @@ Func_4e98: ; 4e98 (1:4e98)
cp DUELTYPE_PRACTICE
jr nz, .not_practice
call WaitForWideTextBoxInput
- jr .asm_4ee0
+ jr .print_deck_info
+
.not_practice
+; get the shuffling animation from input value of b
call Func_3b21
ld hl, sp+$03
+ ; play animation 3 times
ld a, [hl]
call Func_3b6a
ld a, [hl]
call Func_3b6a
ld a, [hl]
call Func_3b6a
-.asm_4ed0
+
+.loop_shuffle_anim
call DoFrame
call CheckSkipDelayAllowed
- jr c, .asm_4edd
+ jr c, .done_shuffle
call CheckAnyAnimationPlaying
- jr c, .asm_4ed0
-.asm_4edd
+ jr c, .loop_shuffle_anim
+.done_shuffle
call Func_3b31
-.asm_4ee0
+
+.print_deck_info
xor a
ld [wNumCardsBeingDrawn], a
call PrintDeckAndHandIconsAndNumberOfCards
call Func_3b21
pop hl
call DrawWideTextBox_PrintText
-.asm_4eee
+.draw_card
+; get the draw animation from input value of c
ld hl, sp+$00
ld a, [hl]
call Func_3b6a
-.asm_4ef4
+
+.loop_drawing_anim
call DoFrame
call CheckSkipDelayAllowed
- jr c, .asm_4f28
+ jr c, .done
call CheckAnyAnimationPlaying
- jr c, .asm_4ef4
+ jr c, .loop_drawing_anim
+
ld hl, wNumCardsBeingDrawn
inc [hl]
ld hl, sp+$00
ld a, [hl]
- cp $55
- jr nz, .asm_4f11
+ cp DUEL_ANIM_BOTH_DRAW
+ jr nz, .one_duelist_shuffled
+ ; if both duelists shuffled
call PrintDeckAndHandIconsAndNumberOfCards.not_cgb
- jr .asm_4f14
-.asm_4f11
+ jr .check_num_cards
+.one_duelist_shuffled
call PrintNumberOfHandAndDeckCards
-.asm_4f14
+
+.check_num_cards
ld a, [wNumCardsBeingDrawn]
cp 7
- jr c, .asm_4eee
+ jr c, .draw_card
+
ld c, 30
.wait_loop
call DoFrame
call CheckSkipDelayAllowed
- jr c, .asm_4f28
+ jr c, .done
dec c
jr nz, .wait_loop
-.asm_4f28
+
+.done
call Func_3b31
pop bc
ret
@@ -2282,50 +2304,61 @@ Func_4f2d: ; 4f2d (1:4f2d)
.skip_draw_scene
ld a, SHUFFLE_DECK
ld [wDuelDisplayedScreen], a
+
+; if duelist has only one card in deck,
+; skip shuffling animation
ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK
call GetTurnDuelistVariable
ld a, DECK_SIZE
sub [hl]
cp 2
jr c, .one_card_in_deck
+
ldtx hl, ShufflesTheDeckText
call DrawWideTextBox_PrintText
call EnableLCD
call Func_3b21
- ld e, $51
+
+; load correct animation depending on turn duelist
+ ld e, DUEL_ANIM_PLAYER_SHUFFLE
ldh a, [hWhoseTurn]
cp PLAYER_TURN
- jr z, .asm_4f64
- ld e, $52
-.asm_4f64
+ jr z, .load_anim
+ ld e, DUEL_ANIM_OPP_SHUFFLE
+.load_anim
+; play animation 3 times
ld a, e
call Func_3b6a
ld a, e
call Func_3b6a
ld a, e
call Func_3b6a
-.asm_4f70
+
+.loop_anim
call DoFrame
call CheckSkipDelayAllowed
- jr c, .asm_4f7d
+ jr c, .done_anim
call CheckAnyAnimationPlaying
- jr c, .asm_4f70
-.asm_4f7d
+ jr c, .loop_anim
+
+.done_anim
call Func_3b31
ld a, $01
ret
+
.one_card_in_deck
+; no animation, just print text and delay
ld l, a
ld h, $00
call LoadTxRam3
ldtx hl, DeckHasXCardsText
call DrawWideTextBox_PrintText
call EnableLCD
- ld a, $3c
-.asm_4f94
+ ld a, 60
+.loop_wait
call DoFrame
dec a
- jr nz, .asm_4f94
+ jr nz, .loop_wait
ld a, $01
ret
@@ -6749,6 +6782,7 @@ HandleBetweenTurnsEvents: ; 6baf (1:6baf)
call DiscardAttachedDefenders
call SwapTurn
ret
+
.something_to_handle
; either:
; 1. turn holder's arena Pokemon is paralyzed, asleep, poisoned or double poisoned
@@ -6760,6 +6794,7 @@ HandleBetweenTurnsEvents: ; 6baf (1:6baf)
call DrawDuelBoxMessage
ldtx hl, BetweenTurnsText
call DrawWideTextBox_WaitForInput
+
ld a, DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
call GetCardIDFromDeckIndex
@@ -6768,24 +6803,27 @@ HandleBetweenTurnsEvents: ; 6baf (1:6baf)
ld l, DUELVARS_ARENA_CARD_STATUS
ld a, [hl]
or a
- jr z, .asm_6c1a
- call Func_6d3f
- jr c, .asm_6c1a
- call Func_6cfa
+ jr z, .discard_pluspower
+ ; has status condition
+ call HandlePoisonDamage
+ jr c, .discard_pluspower
+ call HandleSleepCheck
ld a, [hl]
and CNF_SLP_PRZ
cp PARALYZED
- jr nz, .asm_6c1a
+ jr nz, .discard_pluspower
+ ; heal paralysis
ld a, DOUBLE_POISONED
and [hl]
ld [hl], a
call Func_6c7e
ldtx hl, IsCuredOfParalysisText
call Func_6ce4
- ld a, $3e
+ ld a, DUEL_ANIM_HEAL
call Func_6cab
call WaitForWideTextBoxInput
-.asm_6c1a
+
+.discard_pluspower
call DiscardAttachedPluspowers
call SwapTurn
ld a, DUELVARS_ARENA_CARD
@@ -6797,13 +6835,13 @@ HandleBetweenTurnsEvents: ; 6baf (1:6baf)
ld a, [hl]
or a
jr z, .asm_6c3a
- call Func_6d3f
+ call HandlePoisonDamage
jr c, .asm_6c3a
- call Func_6cfa
+ call HandleSleepCheck
.asm_6c3a
call DiscardAttachedDefenders
call SwapTurn
- call $6e4c
+ call Func_6e4c
ret
; discard any PLUSPOWER attached to the turn holder's arena and/or bench Pokemon
@@ -6865,6 +6903,7 @@ Func_6c7e: ; 6c7e (1:6c7e)
call DrawDuelMainScene
call SwapTurn
ret
+
.asm_6c98
ld hl, wWhoseTurn
ldh a, [hWhoseTurn]
@@ -6875,33 +6914,39 @@ Func_6c7e: ; 6c7e (1:6c7e)
call SwapTurn
ret
+; input:
+; a = animation ID
Func_6cab: ; 6cab (1:6cab)
push af
ld a, [wDuelType]
or a
- jr nz, .asm_6cc6
+ jr nz, .store_duelist_turn
ld a, [wWhoseTurn]
cp PLAYER_TURN
- jr z, .asm_6cc6
+ jr z, .store_duelist_turn
call SwapTurn
ldh a, [hWhoseTurn]
ld [wd4af], a
call SwapTurn
jr .asm_6ccb
-.asm_6cc6
+
+.store_duelist_turn
ldh a, [hWhoseTurn]
ld [wd4af], a
+
.asm_6ccb
xor a
ld [wd4b0], a
- ld a, $00
- ld [wd4ae], a
+ ld a, DUEL_ANIM_SCREEN_MAIN_SCENE
+ ld [wDuelAnimationScreen], a
pop af
+
+; play animation
call Func_3b6a
-.asm_6cd8
+.loop_anim
call DoFrame
call CheckAnyAnimationPlaying
- jr c, .asm_6cd8
+ jr c, .loop_anim
call Func_6c7e.asm_6c98
ret
@@ -6920,11 +6965,15 @@ Func_6ce4: ; 6ce4 (1:6ce4)
call DrawWideTextBox_PrintText
ret
-Func_6cfa: ; 6cfa (1:6cfa)
+; handles the sleep check for the NonTurn Duelist
+; heals sleep status if coin is heads, else
+; it plays sleeping animation
+HandleSleepCheck: ; 6cfa (1:6cfa)
ld a, [hl]
and CNF_SLP_PRZ
cp ASLEEP
- ret nz
+ ret nz ; quit if not asleep
+
push hl
ld a, [wTempNonTurnDuelistCardID]
ld e, a
@@ -6938,17 +6987,20 @@ Func_6cfa: ; 6cfa (1:6cfa)
ld [hl], a
ldtx de, PokemonsSleepCheckText
call TossCoin
- ld a, $03
+ ld a, DUEL_ANIM_SLEEP
ldtx hl, IsStillAsleepText
- jr nc, .asm_6d2d
+ jr nc, .tails
+
+; coin toss was heads, cure sleep status
pop hl
push hl
ld a, DOUBLE_POISONED
and [hl]
ld [hl], a
- ld a, $3e
+ ld a, DUEL_ANIM_HEAL
ldtx hl, IsCuredOfSleepText
-.asm_6d2d
+
+.tails
push af
push hl
call Func_6c7e
@@ -6960,10 +7012,12 @@ Func_6cfa: ; 6cfa (1:6cfa)
call WaitForWideTextBoxInput
ret
-Func_6d3f: ; 6d3f (1:6d3f)
+HandlePoisonDamage: ; 6d3f (1:6d3f)
or a
bit POISONED_F , [hl]
- ret z
+ ret z ; quit if not poisoned
+
+; load damage and text according to normal/double poison
push hl
bit DOUBLE_POISONED_F, [hl]
ld a, PSN_DAMAGE
@@ -6971,18 +7025,24 @@ Func_6d3f: ; 6d3f (1:6d3f)
jr z, .not_double_poisoned
ld a, DBLPSN_DAMAGE
ldtx hl, Received20DamageDueToPoisonText
+
.not_double_poisoned
push af
ld [wd4b1], a
xor a
ld [wd4b2], a
+
push hl
call Func_6c7e
pop hl
call Func_6ce4
- ld a, $05
+
+; play animation
+ ld a, DUEL_ANIM_POISON
call Func_6cab
pop af
+
+; deal poison damage
ld e, a
ld d, $00
ld a, DUELVARS_ARENA_CARD_HP
@@ -6992,6 +7052,7 @@ Func_6d3f: ; 6d3f (1:6d3f)
ld a, $8c
call Func_6cab
pop hl
+
call PrintKnockedOutIfHLZero
push af
call WaitForWideTextBoxInput
@@ -7128,6 +7189,9 @@ ApplyStatusConditionToArenaPokemon: ; 6e38 (1:6e38)
Func_6e49: ; 6e49 (1:6e49)
call HandleDestinyBondSubstatus
+ ; fallthrough
+
+Func_6e4c: ; 6e4c (1:6e4c)
call ClearDamageReductionSubstatus2OfKnockedOutPokemon
xor a
ld [wcce8], a
@@ -7714,19 +7778,20 @@ Func_7195: ; 7195 (1:7195)
ret
_TossCoin: ; 71ad (1:71ad)
- ld [wcd9c], a
+ ld [wCoinTossTotalNum], a
ld a, [wDuelDisplayedScreen]
cp COIN_TOSS
- jr z, .asm_71c1
+ jr z, .print_text
xor a
- ld [wcd9f], a
+ ld [wCoinTossNumTossed], a
call EmptyScreen
call LoadDuelCoinTossResultTiles
-.asm_71c1
- ld a, [wcd9f]
+.print_text
+; no need to print text if this is not the first coin toss
+ ld a, [wCoinTossNumTossed]
or a
- jr nz, .asm_71ec
+ jr nz, .clear_text_pointer
ld a, COIN_TOSS
ld [wDuelDisplayedScreen], a
lb de, 0, 12
@@ -7743,125 +7808,144 @@ _TossCoin: ; 71ad (1:71ad)
ld l, a
call PrintText
-.asm_71ec
+.clear_text_pointer
ld hl, wCoinTossScreenTextID
xor a
ld [hli], a
ld [hl], a
+
+; store duelist type and reset number of heads
call EnableLCD
ld a, DUELVARS_DUELIST_TYPE
call GetTurnDuelistVariable
- ld [wcd9e], a
+ ld [wCoinTossDuelistType], a
call ExchangeRNG
xor a
ld [wCoinTossNumHeads], a
-.asm_7204
- ld a, [wcd9c]
- cp $2
+.print_coin_tally
+; skip printing text if it's only one coin toss
+ ld a, [wCoinTossTotalNum]
+ cp 2
jr c, .asm_7223
+
+; write "#coin/#total coins"
lb bc, 15, 11
- ld a, [wcd9f]
- inc a
+ ld a, [wCoinTossNumTossed]
+ inc a ; current coin number is wCoinTossNumTossed + 1
call WriteTwoDigitNumberInTxSymbolFormat
ld b, 17
ld a, SYM_SLASH
call WriteByteToBGMap0
inc b
- ld a, [wcd9c]
+ ld a, [wCoinTossTotalNum]
call WriteTwoDigitNumberInTxSymbolFormat
.asm_7223
call Func_3b21
- ld a, $58
+ ld a, DUEL_ANIM_COIN_SPIN
call Func_3b6a
- ld a, [wcd9e]
+
+ ld a, [wCoinTossDuelistType]
or a
jr z, .asm_7236
- call $7324
+ call Func_7324
jr .asm_723c
.asm_7236
call WaitForWideTextBoxInput
- call $72ff
+ call Func_72ff
.asm_723c
call Func_3b21
- ld d, $5a
- ld e, $0
+ ld d, DUEL_ANIM_COIN_TOSS2
+ ld e, $0 ; heads
call UpdateRNGSources
rra
- jr c, .asm_724d
- ld d, $59
- ld e, $1
-
-.asm_724d
+ jr c, .got_result
+ ld d, DUEL_ANIM_COIN_TOSS1
+ ld e, $1 ; tails
+
+.got_result
+; already decided on coin toss result,
+; load the correct tossing animation
+; and wait for it to finish
ld a, d
call Func_3b6a
- ld a, [wcd9e]
+ ld a, [wCoinTossDuelistType]
or a
- jr z, .asm_725e
+ jr z, .wait_anim
ld a, e
- call $7310
+ call Func_7310
ld e, a
- jr .asm_726c
-
-.asm_725e
+ jr .done_toss_anim
+.wait_anim
push de
call DoFrame
call CheckAnyAnimationPlaying
pop de
- jr c, .asm_725e
+ jr c, .wait_anim
ld a, e
- call $72ff
+ call Func_72ff
-.asm_726c
- ld b, $5c
- ld c, $34
+.done_toss_anim
+ ld b, DUEL_ANIM_COIN_HEADS
+ ld c, $34 ; tile for circle
ld a, e
or a
- jr z, .asm_727c
- ld b, $5b
- ld c, $30
+ jr z, .show_result
+ ld b, DUEL_ANIM_COIN_TAILS
+ ld c, $30 ; tile for cross
ld hl, wCoinTossNumHeads
inc [hl]
-.asm_727c
+.show_result
ld a, b
call Func_3b6a
- ld a, [wcd9e]
+
+; load correct sound effect
+; the sound of the coin toss result
+; is dependant on whether it was the Player
+; or the Opponent to get heads/tails
+ ld a, [wCoinTossDuelistType]
or a
- jr z, .asm_728a
+ jr z, .check_sfx
ld a, $1
- xor e
+ xor e ; invert result in case it's not Player
ld e, a
-
-.asm_728a
+.check_sfx
ld d, SFX_54
ld a, e
or a
- jr nz, .asm_7292
+ jr nz, .got_sfx
ld d, SFX_55
-
-.asm_7292
+.got_sfx
ld a, d
call PlaySFX
- ld a, [wcd9c]
+
+; in case it's a multiple coin toss scenario,
+; then the result needs to be registered on screen
+; with a circle (o) or a cross (x)
+ ld a, [wCoinTossTotalNum]
dec a
- jr z, .asm_72b9
+ jr z, .incr_num_coin_tossed ; skip if not more than 1 coin toss
ld a, c
push af
- ld e, $0
- ld a, [wcd9f]
+ ld e, 0
+ ld a, [wCoinTossNumTossed]
+; calculate the offset to draw the circle/cross
.asm_72a3
- cp $a
- jr c, .asm_72ad
+ ; if < 10, then the offset is simply calculated
+ ; from wCoinTossNumTossed * 2...
+ cp 10
+ jr c, .got_offset
+ ; ...else the y-offset is added for each multiple of 10
inc e
inc e
- sub $a
+ sub 10
jr .asm_72a3
-.asm_72ad
+.got_offset
add a
ld d, a
lb bc, 2, 2
@@ -7869,18 +7953,19 @@ _TossCoin: ; 71ad (1:71ad)
pop af
call FillRectangle
-.asm_72b9
- ld hl, wcd9f
+.incr_num_coin_tossed
+ ld hl, wCoinTossNumTossed
inc [hl]
- ld a, [wcd9e]
+
+ ld a, [wCoinTossDuelistType]
or a
jr z, .asm_72dc
ld a, [hl]
- ld hl, wcd9c
+ ld hl, wCoinTossTotalNum
cp [hl]
call z, WaitForWideTextBoxInput
- call $7324
- ld a, [wcd9c]
+ call Func_7324
+ ld a, [wCoinTossTotalNum]
ld hl, wCoinTossNumHeads
or [hl]
jr nz, .asm_72e2
@@ -7889,17 +7974,19 @@ _TossCoin: ; 71ad (1:71ad)
.asm_72dc
call WaitForWideTextBoxInput
- call $72ff
+ call Func_72ff
.asm_72e2
call Func_3b31
- ld a, [wcd9f]
- ld hl, wcd9c
+ ld a, [wCoinTossNumTossed]
+ ld hl, wCoinTossTotalNum
cp [hl]
- jp c, .asm_7204
+ jp c, .print_coin_tally
call ExchangeRNG
call Func_3b31
call Func_3b21
+
+; return carry if at least 1 heads
ld a, [wCoinTossNumHeads]
or a
ret z
@@ -7922,17 +8009,21 @@ Func_7310: ; 7310 (1:7310)
ldh [hff96], a
ld a, [wDuelType]
cp DUELTYPE_LINK
- jr z, .asm_7338
-.asm_7319
+ jr z, Func_7338
+.loop_anim
call DoFrame
call CheckAnyAnimationPlaying
- jr c, .asm_7319
+ jr c, .loop_anim
ldh a, [hff96]
ret
+
+Func_7324: ; 7324 (1:7324)
ldh [hff96], a
ld a, [wDuelType]
cp DUELTYPE_LINK
- jr z, .asm_7338
+ jr z, Func_7338
+
+; delay coin flip for AI opponent
ld a, 30
.asm_732f
call DoFrame
@@ -7940,10 +8031,11 @@ Func_7310: ; 7310 (1:7310)
jr nz, .asm_732f
ldh a, [hff96]
ret
-.asm_7338
+
+Func_7338: ; 7338 (1:7338)
call DoFrame
call SerialRecvByte
- jr c, .asm_7338
+ jr c, Func_7338
call Func_7344
ret
; 0x7344
diff --git a/src/engine/bank03.asm b/src/engine/bank03.asm
index 8f39e57..2e3f0d9 100755
--- a/src/engine/bank03.asm
+++ b/src/engine/bank03.asm
@@ -268,8 +268,8 @@ Func_c1f8: ; c1f8 (3:41f8)
ld [wd112], a
ld [wd3b8], a
call EnableSRAM
- ld a, [s0a007]
- ld [wd421], a
+ ld a, [sAnimationsDisabled]
+ ld [wAnimationsDisabled], a
ld a, [s0a006]
ld [wTextSpeed], a
call DisableSRAM
@@ -567,7 +567,7 @@ Func_c49c: ; c49c (3:449c)
Func_c4b9: ; c4b9 (3:44b9)
xor a
- ld [wd4ca], a
+ ld [wVRAMTileOffset], a
ld [wd4cb], a
ld a, $1d
farcall Func_80418
@@ -579,10 +579,13 @@ Func_c4b9: ; c4b9 (3:44b9)
.asm_c4d1
ld a, b
ld [wd337], a
- ld a, $0
+
+ ; load Player's sprite for overworld
+ ld a, SPRITE_OW_PLAYER
farcall CreateSpriteAndAnimBufferEntry
ld a, [wWhichSprite]
ld [wPlayerSpriteIndex], a
+
ld b, $2
ld a, [wCurMap]
cp OVERWORLD_MAP
diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm
index dc148ad..e4db318 100644
--- a/src/engine/bank04.asm
+++ b/src/engine/bank04.asm
@@ -494,7 +494,7 @@ LoadOverworldMapSelection: ; 10f61 (4:4f61)
INCLUDE "data/overworld_indexes.asm"
Func_10fbc: ; 10fbc (4:4fbc)
- ld a, $25
+ ld a, SPRITE_OW_MAP_OAM
farcall CreateSpriteAndAnimBufferEntry
ld c, SPRITE_ANIM_COORD_X
call GetSpriteAnimBufferProperty
@@ -517,7 +517,7 @@ Func_10fde: ; 10fde (4:4fde)
ld [wd33d], a
xor a
ld [wd33e], a
- ld a, $25
+ ld a, SPRITE_OW_MAP_OAM
call CreateSpriteAndAnimBufferEntry
ld a, [wWhichSprite]
ld [wd33b], a
@@ -859,7 +859,7 @@ LoadNPCSpriteData: ; 11857 (4:5857)
ld a, [hli]
ld [wTempNPC], a
ld a, [hli]
- ld [wd3b3], a
+ ld [wNPCSpriteID], a
ld a, [hli]
ld [wd3b1], a
ld a, [hli]
@@ -1175,8 +1175,8 @@ MainMenu_NewGame: ; 12704 (4:6704)
call DisplayPlayerNamingScreen
farcall Func_1996e
call EnableSRAM
- ld a, [s0a007]
- ld [wd421], a
+ ld a, [sAnimationsDisabled]
+ ld [wAnimationsDisabled], a
ld a, [s0a006]
ld [wTextSpeed], a
call DisableSRAM
@@ -1288,8 +1288,44 @@ endr
Unknown_128fb: ; 128fb
INCROM $128fb, $1296e
+; disables all sprite animations
+; and clears memory related to sprites
Func_1296e: ; 1296e (4:696e)
- INCROM $1296e, $1299f
+ push af
+ ld a, [wd5d7]
+ or a
+ jr z, .asm_12977
+ pop af
+ ret
+
+.asm_12977
+ pop af
+ push bc
+ push hl
+ xor a
+ ld [wWhichSprite], a
+ call GetFirstSpriteAnimBufferProperty
+ lb bc, 0, SPRITE_ANIM_LENGTH
+
+; disable all sprite animations
+.loop_sprites
+ xor a
+ ld [hl], a ; set SPRITE_ANIM_ENABLED to 0
+ add hl, bc
+ ld a, [wWhichSprite]
+ inc a
+ ld [wWhichSprite], a
+ cp SPRITE_ANIM_BUFFER_CAPACITY
+ jr nz, .loop_sprites
+
+ call Func_12bf3
+ call ZeroObjectPositions
+ ld hl, wVBlankOAMCopyToggle
+ inc [hl]
+ pop hl
+ pop bc
+ ret
+; 0x1299f
; creates a new entry in SpriteAnimBuffer, else loads the sprite if need be
CreateSpriteAndAnimBufferEntry: ; 1299f (4:699f)
@@ -1359,7 +1395,37 @@ FillNewSpriteAnimBufferEntry: ; 129d9 (4:69d9)
ret
; 0x129fa
- INCROM $129fa, $12a21
+Func_129fa: ; 129fa (4:69fa)
+ ld a, [wWhichSprite]
+ push af
+ ld a, [wd5d7]
+ or a
+ jr z, .asm_12a06
+ pop af
+ ret
+.asm_12a06
+ pop af
+ push hl
+ push bc
+ ld c, SPRITE_ANIM_ENABLED
+ call GetSpriteAnimBufferProperty_SpriteInA
+ ld [hl], $00
+ pop bc
+ pop hl
+ ret
+; 0x12a13
+
+Func_12a13: ; 12a13 (4:6a13)
+ ld a, [wWhichSprite]
+ push hl
+ push bc
+ ld c, SPRITE_ANIM_COUNTER
+ call GetSpriteAnimBufferProperty_SpriteInA
+ ld a, [hl]
+ pop bc
+ pop hl
+ ret
+; 0x12a21
HandleAllSpriteAnimations: ; 12a21 (4:6a21)
push af
@@ -1415,7 +1481,7 @@ LoadSpriteDataForAnimationFrame: ; 12a5b (4:6a5b)
ld bc, SPRITE_ANIM_FLAGS - SPRITE_ANIM_TILE_ID
add hl, bc
ld a, [hl]
- and 1 << SPRITE_ANIM_FLAG_SKIP_DRAW
+ and 1 << SPRITE_ANIM_FLAG_UNSKIPPABLE
jr nz, .quit
ld bc, SPRITE_ANIM_FRAME_BANK - SPRITE_ANIM_FLAGS
add hl, bc
@@ -1475,6 +1541,9 @@ StartNewSpriteAnimation: ; 12ab5 (4:6ab5)
cp [hl]
pop hl
ret z
+ ; fallthrough
+
+StartSpriteAnimation: ; 12ac0 (4:6ac0)
push hl
call LoadSpriteAnimPointers
call HandleAnimationFrame
@@ -1482,7 +1551,26 @@ StartNewSpriteAnimation: ; 12ab5 (4:6ab5)
ret
; 0x12ac9
- INCROM $12ac9, $12ae2
+Func_12ac9: ; 12ac9 (4:6ac9)
+ push bc
+ ld b, a
+ ld a, c
+ or a
+ ld a, b
+ pop bc
+ jr z, StartSpriteAnimation
+
+ push hl
+ push bc
+ call LoadSpriteAnimPointers
+ ld a, $ff
+ call GetAnimFramePointerFromOffset
+ pop bc
+ ld a, c
+ call SetAnimationCounterAndLoop
+ pop hl
+ ret
+; 0x12ae2
; Given an animation ID, fills the current sprite's Animation Pointer and Frame Offset Pointer
; a - Animation ID for current sprite
@@ -1508,6 +1596,7 @@ LoadSpriteAnimPointers: ; 12ae2 (4:6ae2)
ld a, [wTempPointer + 1]
ld [hli], a
ld b, a
+ ; offset pointer = pointer + $3
ld a, $3
add c
ld [hli], a
@@ -1531,6 +1620,7 @@ HandleAnimationFrame: ; 12b13 (4:6b13)
add hl, bc
ld a, [hli]
ld [wTempPointerBank], a
+
inc hl
inc hl
ld a, [hl] ; SPRITE_ANIM_FRAME_OFFSET_POINTER
@@ -1541,6 +1631,7 @@ HandleAnimationFrame: ; 12b13 (4:6b13)
ld [wTempPointer + 1], a
adc 0
ld [hl], a
+
ld de, wd23e
ld bc, SPRITE_FRAME_OFFSET_SIZE
call CopyBankedDataToDE
@@ -1582,11 +1673,12 @@ HandleAnimationFrame: ; 12b13 (4:6b13)
pop bc
ret
-; Calls GetAnimationFramePointer after setting up wTempPointerBank and wd4ca
+; Calls GetAnimationFramePointer after setting up wTempPointerBank
+; and wVRAMTileOffset
; a - frame offset from Animation Data
; hl - beginning of Sprite Anim Buffer
GetAnimFramePointerFromOffset: ; 12b6a (4:6b6a)
- ld [wd4ca], a
+ ld [wVRAMTileOffset], a
push hl
push bc
push de
@@ -1619,7 +1711,7 @@ SetAnimationCounterAndLoop: ; 12b89 (4:6b89)
ld bc, SPRITE_ANIM_POINTER - SPRITE_ANIM_COUNTER
add hl, bc
ld a, [hli]
- add 3 ; skip base bank/pointer at beginning of data structure
+ add $3 ; skip base bank/pointer at beginning of data structure
ld c, a
ld a, [hli]
adc 0
@@ -1638,9 +1730,26 @@ Func_12ba7: ; 12ba7 (4:6ba7)
INCROM $12ba7, $12bcd
Func_12bcd: ; 12bcd (4:6bcd)
- INCROM $12bcd, $12c05
+ INCROM $12bcd, $12bf3
-; gets some value based on the sprite in b and wd5d8
+; clears wSpriteVRAMBufferSize and wSpriteVRAMBuffer
+Func_12bf3: ; 12bf3 (4:6bf3)
+ push hl
+ push bc
+ xor a
+ ld [wSpriteVRAMBufferSize], a
+ ld c, $40
+ ld hl, wSpriteVRAMBuffer
+.asm_12bfe
+ ld [hli], a
+ dec c
+ jr nz, .asm_12bfe
+ pop bc
+ pop hl
+ ret
+; 0x12c05
+
+; gets some value based on the sprite in a and wSpriteVRAMBuffer
; loads the sprites data if it doesn't already exist
Func_12c05: ; 12c05 (4:6c05)
push hl
@@ -1648,9 +1757,9 @@ Func_12c05: ; 12c05 (4:6c05)
push de
ld b, a
ld d, $0
- ld a, [wd618]
+ ld a, [wSpriteVRAMBufferSize]
ld c, a
- ld hl, wd5d8
+ ld hl, wSpriteVRAMBuffer
or a
jr z, .tryToAddSprite
@@ -1661,40 +1770,43 @@ Func_12c05: ; 12c05 (4:6c05)
jr z, .foundSpriteMatch
inc hl
ld a, [hli]
- add [hl]
+ add [hl] ; add tile size to tile offset
ld d, a
inc hl
dec c
jr nz, .findSpriteMatchLoop
+
.tryToAddSprite
- ld a, [wd618]
+ ld a, [wSpriteVRAMBufferSize]
cp $10
jr nc, .quitFail
inc a
- ld [wd618], a
+ ld [wSpriteVRAMBufferSize], a ; increase number of entries by 1
inc hl
push hl
ld a, b
- ld [hli], a
+ ld [hli], a ; store sprite index
call Func_12c4f
push af
ld a, d
- ld [hli], a
+ ld [hli], a ; store tile offset
pop af
- ld [hl], a
+ ld [hl], a ; store tile size
pop hl
+
.foundSpriteMatch
dec hl
- inc [hl]
+ inc [hl] ; mark this entry as valid
inc hl
inc hl
ld a, [hli]
add [hl]
cp $81
- jr nc, .quitFail
+ jr nc, .quitFail ; exceeds total tile size
ld a, d
or a
jr .quitSucceed
+
.quitFail
debug_ret
xor a
@@ -1705,12 +1817,17 @@ Func_12c05: ; 12c05 (4:6c05)
pop hl
ret
+; input:
+; a = sprite index within the data map
+; d = tile offset in VRAM
+; output:
+; a = number of tiles in sprite
Func_12c4f: ; 12c4f (4:6c4f)
push af
xor a
ld [wd4cb], a
ld a, d
- ld [wd4ca], a
+ ld [wVRAMTileOffset], a
pop af
farcall Func_8025b
ret
diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm
index 4dcad9d..62e1bbd 100644
--- a/src/engine/bank06.asm
+++ b/src/engine/bank06.asm
@@ -1055,10 +1055,11 @@ Func_18f9c: ; 18f9c (6:4f9c)
ld a, [wLoadedMoveAnimation]
or a
ret z
+
ld l, a
ld h, 0
add hl, hl
- ld de, PointerTable_MoveAnimation
+ ld de, PointerTable_AttackAnimation
.asm_4fa8
add hl, de
ld e, [hl]
@@ -1073,8 +1074,8 @@ Func_18f9c: ; 18f9c (6:4f9c)
call Func_3b21
pop de
push de
- ld a, $00
- ld [wd4ae], a
+ ld a, DUEL_ANIM_SCREEN_MAIN_SCENE
+ ld [wDuelAnimationScreen], a
ld a, $01
ld [$d4b3], a
xor a
@@ -1129,17 +1130,19 @@ Func_19013: ; 19013 (6:5013)
Func_19014: ; 19014 (6:5014)
ld a, [de]
inc de
- cp $09
+ cp DUEL_ANIM_SHOW_DAMAGE
jr z, .asm_502b
- cp $fa
+ cp DUEL_ANIM_SHAKE1
jr z, .asm_5057
- cp $fb
+ cp DUEL_ANIM_SHAKE2
jr z, .asm_505d
- cp $fc
+ cp DUEL_ANIM_SHAKE3
jr z, .asm_5063
-.asm_5026
+
+.play_anim
call Func_3b6a
jr Func_18f9c.asm_4fd4
+
.asm_502b
ld a, $97
call Func_3b6a
@@ -1178,13 +1181,13 @@ Func_19014: ; 19014 (6:5014)
ldh a, [hWhoseTurn]
cp $c2
ld a, c
- jr z, .asm_5026
+ jr z, .play_anim
ld a, [wDuelType]
cp $00
ld a, c
- jr z, .asm_5026
+ jr z, .play_anim
ld a, b
- jr .asm_5026
+ jr .play_anim
Func_19079: ; 19079 (6:5079)
ld a, [de]
@@ -1212,8 +1215,8 @@ Func_1909d: ; 1909d (6:509d)
jr z, .asm_50ad
cp $01
ret nz
- ld a, $00
- ld [wd4ae], a
+ ld a, DUEL_ANIM_SCREEN_MAIN_SCENE
+ ld [wDuelAnimationScreen], a
ret
.asm_50ad
ld a, [wd4b0]
@@ -1239,24 +1242,24 @@ Func_1909d: ; 1909d (6:509d)
.asm_50d2
ld l, $04
ld h, $c2
- ld a, $01
+ ld a, DUEL_ANIM_SCREEN_PLAYER_PLAY_AREA
jr .asm_50f0
.asm_50da
ld l, $04
ld h, $c3
- ld a, $01
+ ld a, DUEL_ANIM_SCREEN_PLAYER_PLAY_AREA
jr .asm_50f0
.asm_50e2
ld l, $05
ld h, $c3
- ld a, $02
+ ld a, DUEL_ANIM_SCREEN_OPP_PLAY_AREA
jr .asm_50f0
.asm_50ea
ld l, $05
ld h, $c2
- ld a, $02
+ ld a, DUEL_ANIM_SCREEN_OPP_PLAY_AREA
.asm_50f0:
- ld [wd4ae], a
+ ld [wDuelAnimationScreen], a
ret
; this part is not perfectly analyzed.
@@ -1267,8 +1270,8 @@ Func_1909d: ; 1909d (6:509d)
Func_190fb: ; 190fb (6:50fb)
cp $01
jr nz, .asm_510e
- ld a, $00
- ld [wd4ae], a
+ ld a, DUEL_ANIM_SCREEN_MAIN_SCENE
+ ld [wDuelAnimationScreen], a
ld a, [wDuelDisplayedScreen]
cp $01
jr z, .asm_510e
@@ -1366,7 +1369,7 @@ Func_19168: ; 19168 (6:5168)
ret
-INCLUDE "data/move_animations.asm"
+INCLUDE "data/attack_animations.asm"
INCROM $19674, $1991f
@@ -1466,7 +1469,7 @@ Func_1996e: ; 1996e (6:596e)
ld [s0a006], a
ld [wTextSpeed], a
xor a
- ld [s0a007], a
+ ld [sAnimationsDisabled], a
ld [s0a009], a
ld [s0a004], a
ld [s0a005], a
diff --git a/src/engine/bank07.asm b/src/engine/bank07.asm
index 375a161..71d0131 100644
--- a/src/engine/bank07.asm
+++ b/src/engine/bank07.asm
@@ -153,7 +153,7 @@ Func_1c485: ; 1c485 (7:4485)
.foundEmptyIndex
ld a, b
ld [wLoadedNPCTempIndex], a
- ld a, [wd3b3]
+ ld a, [wNPCSpriteID]
farcall CreateSpriteAndAnimBufferEntry
jr c, .exit
ld a, [wLoadedNPCTempIndex]
@@ -598,41 +598,48 @@ Func_1c8ef: ; 1c8ef (7:48ef)
ld a, [wTempAnimation]
ld [wd4bf], a
cp $61
- jp nc, $4b5e ; asm_007_4b5e
+ jp nc, Func_1cb5e
+
push hl
push bc
push de
call Func_1cab3
; hl: pointer
- ld a, [wd421]
+
+ ld a, [wAnimationsDisabled]
or a
jr z, .check_to_play_sfx
-
+ ; animations are disabled
push hl
- ld bc, $0003
+ ld bc, ANIM_SPRITE_ANIM_FLAGS
add hl, bc
ld a, [hl]
- and %10000000
+ ; if flag is set, play animation anyway
+ and (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE)
pop hl
-
jr z, .return
+
.check_to_play_sfx
push hl
- ld bc, $0004
+ ld bc, ANIM_SOUND_FX_ID
add hl, bc
ld a, [hl]
pop hl
-
or a
jr z, .calc_addr
call PlaySFX
+
.calc_addr
+; this data field is always $00,
+; so this calculation is unnecessary
+; seems like there was supposed to be
+; more than 1 function to handle animation
push hl
- ld bc, $0005
+ ld bc, ANIM_HANDLER_FUNCTION
add hl, bc
ld a, [hl]
rlca
- add $48
+ add LOW(.address) ; $48
ld l, a ; LO
ld a, HIGH(.address) ; $49
adc 0
@@ -651,12 +658,14 @@ Func_1c8ef: ; 1c8ef (7:48ef)
ret
.address
- dw Func_1c94a
+ dw .handler_func
-Func_1c94a: ; 1c94a (7:494a)
+.handler_func ; 1c94a (7:494a)
+; if any of ANIM_SPRITE_ID, ANIM_PALETTE_ID and ANIM_SPRITE_ANIM_ID
+; are 0, then return
ld e, l
ld d, h
- ld c, 3
+ ld c, ANIM_SPRITE_ANIM_ID + 1
.loop
ld a, [de]
or a
@@ -664,167 +673,164 @@ Func_1c94a: ; 1c94a (7:494a)
inc de
dec c
jr nz, .loop
- ld a, [hli]
+
+ ld a, [hli] ; ANIM_SPRITE_ID
farcall CreateSpriteAndAnimBufferEntry
ld a, [wWhichSprite]
ld [wAnimationQueue], a ; push an animation to the queue
+
xor a
- ld [wd4ca], a
+ ld [wVRAMTileOffset], a
ld [wd4cb], a
- ld a, [hli]
- farcall $20, $4418
- ld a, [hli]
+
+ ld a, [hli] ; ANIM_PALETTE_ID
+ farcall Func_80418
+ ld a, [hli] ; ANIM_SPRITE_ANIM_ID
push af
- ld a, [hli]
- ld [wd42b], a
- call Func_1c980
+ ld a, [hli] ; ANIM_SPRITE_ANIM_FLAGS
+ ld [wAnimFlags], a
+ call LoadAnimCoordsAndFlags
pop af
farcall StartNewSpriteAnimation
or a
- jr .return
+ jr .done
.return_with_carry
scf
-.return
+.done
ret
-Func_1c980: ; 1c980 (7:4980)
+; loads the correct coordinates/flags for
+; sprite animation in wAnimationQueue
+LoadAnimCoordsAndFlags: ; 1c980 (7:4980)
push hl
push bc
ld a, [wAnimationQueue]
ld c, SPRITE_ANIM_ATTRIBUTES
call GetSpriteAnimBufferProperty_SpriteInA
- call Func_1c9a2
+ call GetAnimCoordsAndFlags
push af
- and %01100000
+ and (1 << SPRITE_ANIM_FLAG_6) | (1 << SPRITE_ANIM_FLAG_5)
or [hl]
ld [hli], a
ld a, b
- ld [hli], a
- ld [hl], c
+ ld [hli], a ; SPRITE_ANIM_COORD_X
+ ld [hl], c ; SPRITE_ANIM_COORD_Y
pop af
- ld bc, $000c
+ ld bc, SPRITE_ANIM_FLAGS - SPRITE_ANIM_COORD_Y
add hl, bc
- ld c, a
- and %00000011
+ ld c, a ; useless
+ and (1 << SPRITE_ANIM_FLAG_Y_SUBTRACT) | (1 << SPRITE_ANIM_FLAG_X_SUBTRACT)
or [hl]
ld [hl], a
pop bc
pop hl
ret
-Func_1c9a2: ; 1c9a2 (7:49a2)
+; outputs x and y coordinates for the sprite animation
+; taking into account who the turn duelist is.
+; also returns in a the allowed animation flags of
+; the configuration that is selected.
+; output:
+; a = anim flags
+; b = x coordinate
+; c = y coordinate
+GetAnimCoordsAndFlags: ; 1c9a2 (7:49a2)
push hl
ld c, 0
- ld a, [wd42b]
- and %00000100
+ ld a, [wAnimFlags]
+ and (1 << SPRITE_ANIM_FLAG_SPEED)
jr nz, .calc_addr
- ld a, [wd4ae]
- add a
+ ld a, [wDuelAnimationScreen]
+ add a ; 2 * [wDuelAnimationScreen]
ld c, a
- add a
- add c
- add a
+ add a ; 4 * [wDuelAnimationScreen]
+ add c ; 6 * [wDuelAnimationScreen]
+ add a ; 12 * [wDuelAnimationScreen]
ld c, a
+
ld a, [wd4af]
cp PLAYER_TURN
- jr z, .player_turn
-
- ld a, $06
+ jr z, .player_side
+; opponent side
+ ld a, 6
add c
ld c, a
-.player_turn
+.player_side
ld a, [wd4b0]
add c ; a = [wd4b0] + c
ld c, a
ld b, 0
- ld hl, Data_1c9e0
+ ld hl, AnimationCoordinatesIndex
add hl, bc
ld c, [hl]
+
.calc_addr
ld a, c
add a ; a = c * 2
add c ; a = c * 3
ld c, a
ld b, 0
- ld hl, Data_1ca04
+ ld hl, AnimationCoordinates
add hl, bc
- ld b, [hl]
+ ld b, [hl] ; x coord
inc hl
- ld c, [hl]
+ ld c, [hl] ; y coord
inc hl
- ld a, [wd42b]
- and [hl]
+ ld a, [wAnimFlags]
+ and [hl] ; flags
pop hl
ret
-Data_1c9e0:
- db $01
- db $01
- db $01
- db $01
- db $01
- db $01
- db $02
- db $02
- db $02
- db $02
- db $02
- db $02
- db $03
- db $04
- db $05
- db $06
- db $07
- db $08
- db $03
- db $04
- db $05
- db $06
- db $07
- db $08
- db $09
- db $0a
- db $0b
- db $0c
- db $0d
- db $0e
- db $09
- db $0a
- db $0b
- db $0c
- db $0d
- db $0e
-
-macro_1ca04: MACRO
- dw \1
+AnimationCoordinatesIndex:
+; animations in the Duel Main Scene
+ db $01, $01, $01, $01, $01, $01 ; player
+ db $02, $02, $02, $02, $02, $02 ; opponent
+
+; animations in the Player's Play Area, for each Play Area Pokemon
+ db $03, $04, $05, $06, $07, $08 ; player
+ db $03, $04, $05, $06, $07, $08 ; opponent
+
+; animations in the Opponent's Play Area, for each Play Area Pokemon
+ db $09, $0a, $0b, $0c, $0d, $0e ; player
+ db $09, $0a, $0b, $0c, $0d, $0e ; opponent
+
+anim_coords: MACRO
+ db \1
db \2
+ db \3
ENDM
-Data_1ca04:
-; value(2), flag(1)
- macro_1ca04 $5858, $08
- macro_1ca04 $5028, $00
- macro_1ca04 $3088, $63
- macro_1ca04 $4858, $00
- macro_1ca04 $6018, $00
- macro_1ca04 $6038, $00
- macro_1ca04 $6058, $00
- macro_1ca04 $6078, $00
- macro_1ca04 $6098, $00
- macro_1ca04 $5058, $00
- macro_1ca04 $2898, $00
- macro_1ca04 $2878, $00
- macro_1ca04 $2858, $00
- macro_1ca04 $2838, $00
- macro_1ca04 $2818, $00
-
-Func_1ca31: ; 1ca31 (7:4a6b)
+AnimationCoordinates:
+; x coord, y coord, animation flags
+ anim_coords 88, 88, (1 << SPRITE_ANIM_FLAG_3)
+
+; animations in the Duel Main Scene
+ anim_coords 40, 80, $00
+ anim_coords 136, 48, (1 << SPRITE_ANIM_FLAG_6) | (1 << SPRITE_ANIM_FLAG_5) | (1 << SPRITE_ANIM_FLAG_Y_SUBTRACT) | (1 << SPRITE_ANIM_FLAG_X_SUBTRACT)
+
+; animations in the Player's Play Area, for each Play Area Pokemon
+ anim_coords 88, 72, $00
+ anim_coords 24, 96, $00
+ anim_coords 56, 96, $00
+ anim_coords 88, 96, $00
+ anim_coords 120, 96, $00
+ anim_coords 152, 96, $00
+
+; animations in the Opponent's Play Area, for each Play Area Pokemon
+ anim_coords 88, 80, $00
+ anim_coords 152, 40, $00
+ anim_coords 120, 40, $00
+ anim_coords 88, 40, $00
+ anim_coords 56, 40, $00
+ anim_coords 24, 40, $00
+
+Func_1ca31: ; 1ca31 (7:4a31)
push hl
push bc
ld a, [wd4ac]
@@ -837,32 +843,78 @@ Func_1ca31: ; 1ca31 (7:4a6b)
cp b
jp z, .asm_007_4a6b
ld [hl], a
- ld b, 0
- ld hl, $d42c
+
+ ld b, $00
+ ld hl, wd42c
add hl, bc
ld a, [wTempAnimation]
ld [hli], a
- ld a, [wd4ae]
+ ld a, [wDuelAnimationScreen]
ld [hli], a
ld a, [wd4af]
ld [hli], a
ld a, [wd4b0]
ld [hli], a
- ld a, [$d4b1]
+ ld a, [wd4b1]
ld [hli], a
- ld a, [$d4b2]
+ ld a, [wd4b2]
ld [hli], a
- ld a, [$d4b3]
+ ld a, [wd4b3]
ld [hli], a
ld a, [wd4be]
ld [hl], a
+
.asm_007_4a6b
pop bc
pop hl
ret
- INCROM $1ca6e, $1cab3
+Func_1ca6e: ; 1ca6e (7:4a6e)
+ push hl
+ push bc
+.asm_1ca70
+ ld a, [wd4ad]
+ ld b, a
+ ld a, [wd4ac]
+ cp b
+ jr z, .asm_1cab0
+
+ ld c, a
+ add $08
+ and $7f
+ ld [wd4ac], a
+
+ ld b, $00
+ ld hl, wd42c
+ add hl, bc
+ ld a, [hli]
+ ld [wTempAnimation], a
+ ld a, [hli]
+ ld [wDuelAnimationScreen], a
+ ld a, [hli]
+ ld [wd4af], a
+ ld a, [hli]
+ ld [wd4b0], a
+ ld a, [hli]
+ ld [wd4b1], a
+ ld a, [hli]
+ ld [wd4b2], a
+ ld a, [hli]
+ ld [wd4b3], a
+ ld a, [hl]
+ ld [wd4be], a
+
+ call Func_1c8ef
+ call CheckAnyAnimationPlaying
+ jr nc, .asm_1ca70
+.asm_1cab0
+ pop bc
+ pop hl
+ ret
+; 0x1cab3
+
+; gets data from Animations for anim ID in a
Func_1cab3: ; 1cab3 (7:4ab3)
push bc
ld a, [wTempAnimation]
@@ -873,12 +925,64 @@ Func_1cab3: ; 1cab3 (7:4ab3)
ld c, l
add hl, hl ; hl = anim * 4
add hl, bc ; hl = anim * 6
- ld bc, $4e32
+ ld bc, Animations
add hl, bc
pop bc
ret
- INCROM $1cac5, $1cb18
+Func_1cac5: ; 1cac5 (7:4ac5)
+ ld a, [wd42a]
+ cp $ff
+ jr nz, .asm_1cb03
+
+ ld a, [wd4c0]
+ or a
+ jr z, .asm_1cafb
+ cp $80
+ jr z, .asm_1cb11
+ ld hl, wAnimationQueue
+ ld c, $07
+.asm_1cadb
+ push af
+ push bc
+ ld a, [hl]
+ cp $ff
+ jr z, .asm_1caf4
+ ld [wWhichSprite], a
+ farcall Func_12a13
+ cp $ff
+ jr nz, .asm_1caf4
+ farcall Func_129fa
+ ld a, $ff
+ ld [hl], a
+.asm_1caf4
+ pop bc
+ pop af
+ and [hl]
+ inc hl
+ dec c
+ jr nz, .asm_1cadb
+.asm_1cafb
+ cp $ff
+ jr nz, .asm_1cb02
+ call Func_1ca6e
+.asm_1cb02
+ ret
+
+.asm_1cb03
+ ld hl, wd4b9
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call CallHL2
+ ld a, [wd42a]
+ jr .asm_1cafb
+
+.asm_1cb11
+ ld a, $ff
+ ld [wd4c0], a
+ jr .asm_1cafb
+; 0x1cb18
Func_1cb18: ; 1cb18 (7:4b18)
push hl
@@ -924,7 +1028,236 @@ Func_1cb18: ; 1cb18 (7:4b18)
jr .asm_1cb57
; 0x1cb5e
- INCROM $1cb5e, $1ccbc
+Func_1cb5e: ; 1cb5e (7:4b5e)
+ cp $96
+ jp nc, Func_1ce03
+ cp $8c
+ jp nz, Func_1cc76
+ jr .asm_1cb6a ; redundant
+.asm_1cb6a
+ ld a, [wd4b2]
+ cp $03
+ jr nz, .asm_1cb76
+ ld a, [wd4b1]
+ cp $e8
+.asm_1cb76
+ ret nc
+
+ xor a
+ ld [wd4b8], a
+ ld [wVRAMTileOffset], a
+ ld [wd4cb], a
+
+ ld a, $25
+ farcall Func_80418
+ call Func_1cba6
+
+ ld hl, wd4b3
+ bit 0, [hl]
+ call nz, Func_1cc3e
+
+ ld a, $12
+ ld [wd4b8], a
+ bit 1, [hl]
+ call nz, Func_1cc4e
+
+ bit 2, [hl]
+ call nz, Func_1cc66
+
+ xor a
+ ld [wd4b3], a
+ ret
+; 0x1cba6
+
+Func_1cba6: ; 1cba6 (7:4ba6)
+ call Func_1cc03
+ xor a
+ ld [wd4b7], a
+
+ ld hl, wd4b4
+ ld de, wAnimationQueue + 1
+.asm_1cbb3
+ push hl
+ push de
+ ld a, [hl]
+ or a
+ jr z, .asm_1cbbc
+ call Func_1cbcc
+
+.asm_1cbbc
+ pop de
+ pop hl
+ inc hl
+ inc de
+ ld a, [wd4b7]
+ inc a
+ ld [wd4b7], a
+ cp $03
+ jr c, .asm_1cbb3
+ ret
+; 0x1cbcc
+
+Func_1cbcc: ; 1cbcc (7:4bcc)
+ push af
+ ld a, SPRITE_DUEL_4
+ farcall CreateSpriteAndAnimBufferEntry
+ ld a, [wWhichSprite]
+ ld [de], a
+ ld a, (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE)
+ ld [wAnimFlags], a
+ ld c, SPRITE_ANIM_COORD_X
+ call GetSpriteAnimBufferProperty
+ call GetAnimCoordsAndFlags
+
+ ld a, [wd4b7]
+ add $fd
+ ld e, a
+ ld a, $4b
+ adc 0
+ ld d, a
+ ld a, [de]
+ add b
+
+ ld [hli], a ; SPRITE_ANIM_COORD_X
+ ld [hl], c ; SPRITE_ANIM_COORD_Y
+
+ ld a, [wd4b8]
+ ld c, a
+ pop af
+ farcall Func_12ac9
+ ret
+; 0x1cbfd
+
+ INCROM $1cbfd, $1cc03
+
+Func_1cc03: ; 1cc03 (7:4c03)
+ ld a, [wd4b1]
+ ld l, a
+ ld a, [wd4b2]
+ ld h, a
+
+ ld de, wd4b4
+ ld bc, -100
+ call .Func_1cc2f
+ ld bc, -10
+ call .Func_1cc2f
+
+ ld a, l
+ add $4f
+ ld [de], a
+ ld hl, wd4b4
+ ld c, 2
+.asm_1cc23
+ ld a, [hl]
+ cp $4f
+ jr nz, .asm_1cc2e
+ ld [hl], $00
+ inc hl
+ dec c
+ jr nz, .asm_1cc23
+.asm_1cc2e
+ ret
+; 0x1cc2f
+
+.Func_1cc2f
+ ld a, $4e
+.loop
+ inc a
+ add hl, bc
+ jr c, .loop
+
+ ld [de], a
+ inc de
+ ld a, l
+ sub c
+ ld l, a
+ ld a, h
+ sbc b
+ ld h, a
+ ret
+; 0x1cc3e
+
+Func_1cc3e: ; 1cc3e (7:4c3e)
+ push hl
+ ld a, $03
+ ld [wd4b7], a
+ ld de, wAnimationQueue + 4
+ ld a, $5b
+ call Func_1cbcc
+ pop hl
+ ret
+; 0x1cc4e
+
+Func_1cc4e: ; 1cc4e (7:4c4e)
+ push hl
+ ld a, $04
+ ld [wd4b7], a
+ ld de, wAnimationQueue + 5
+ ld a, $5a
+ call Func_1cbcc
+ ld a, [wd4b8]
+ add $12
+ ld [wd4b8], a
+ pop hl
+ ret
+; 0x1cc66
+
+Func_1cc66: ; 1cc66 (7:4c66)
+ push hl
+ ld a, $05
+ ld [wd4b7], a
+ ld de, wAnimationQueue + 6
+ ld a, $59
+ call Func_1cbcc
+ pop hl
+ ret
+; 0x1cc76
+
+Func_1cc76: ; 1cc76 (7:4c76)
+ ld a, [wAnimationsDisabled]
+ or a
+ jr nz, .asm_1cc9e
+ ld a, [wTempAnimation]
+ ld [wd42a], a
+ sub $61
+ add a
+ add a
+ ld c, a
+ ld b, $00
+ ld hl, Data_1cc9f
+ add hl, bc
+ ld a, [hli]
+ ld [wd4b9], a
+ ld c, a
+ ld a, [hli]
+ ld [wd4b9 + 1], a
+ ld b, a
+ ld a, [hl]
+ ld [wd4bb], a
+ call CallBC
+.asm_1cc9e
+ ret
+; 0x1cc9f
+
+macro_1cc9f: MACRO
+ dw \1
+ db \2
+ db \3
+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]
+ or a
+ ret nz
+ ; fallthrough
Func_1ccbc: ; 1ccbc (7:4cbc)
ld a, $ff
@@ -941,7 +1274,963 @@ Func_1ccbc: ; 1ccbc (7:4cbc)
ret
; 0x1ccd4
- INCROM $1ccd4, $1d078
+ INCROM $1ccd4, $1cce4
+
+Func_1cce4: ; 1cce4 (7:4ce4)
+ ld hl, Data_1cd55
+ jr Func_1ccee
+
+Func_1cce9: ; 1cce9 (7:4ce9)
+ ld hl, Data_1cd61
+ jr Func_1ccee
+
+Func_1ccee: ; 1ccee (7:4cee)
+ ld a, l
+ ld [wd4bc], a
+ ld a, h
+ ld [wd4bc + 1], a
+
+ ld hl, wd4b9
+ ld [hl], LOW(.asm_1ccff)
+ inc hl
+ ld [hl], HIGH(.asm_1ccff)
+ ret
+
+.asm_1ccff
+ call Func_1cd71
+ call Func_1cd3c
+ jp nc, Func_1ccb7
+ ldh a, [hSCX]
+ add [hl]
+ ldh [hSCX], a
+ jp Func_1ccb7
+; 0x1cd10
+
+Func_1cd10: ; 1cd10 (7:4d10)
+ ld hl, Data_1cd55
+ jr Func_1cd1a
+
+Func_1cd15: ; 1cd15 (7:4d15)
+ ld hl, Data_1cd61
+ jr Func_1cd1a
+
+Func_1cd1a: ; 1cd1a (7:4d1a)
+ ld a, l
+ ld [wd4bc], a
+ ld a, h
+ ld [wd4bc + 1], a
+ ld hl, wd4b9
+ ld [hl], LOW(.asm_1cd2b)
+ inc hl
+ ld [hl], HIGH(.asm_1cd2b)
+ ret
+
+.asm_1cd2b
+ call Func_1cd71
+ call Func_1cd3c
+ jp nc, Func_1ccb7
+ ldh a, [hSCY]
+ add [hl]
+ ldh [hSCY], a
+ jp Func_1ccb7
+; 0x1cd3c
+
+Func_1cd3c: ; 1cd3c (7:4d3c)
+ ld hl, wd4bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wd4bb]
+ cp [hl]
+ ret nc
+ inc hl
+ push hl
+ inc hl
+ ld a, l
+ ld [wd4bc], a
+ ld a, h
+ ld [wd4bc + 1], a
+ pop hl
+ scf
+ 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
+ dec [hl]
+ ret
+; 0x1cd76
+
+Func_1cd76: ; 1cd76 (7:4d76)
+ ld hl, wd4b9
+ ld [hl], $a3
+ inc hl
+ ld [hl], $4d
+ ld a, [wBGP]
+ ld [wd4bc], a
+ ld hl, wBackgroundPalettesCGB
+ ld de, wd297
+ ld bc, 8 palettes
+ call CopyDataHLtoDE_SaveRegisters
+ ld de, $7fff
+ ld hl, wBackgroundPalettesCGB
+ ld bc, $20
+ call FillMemoryWithDE
+ xor a
+ call SetBGP
+ call FlushAllPalettes
+ call Func_1cd71
+ ld a, [wd4bb]
+ or a
+ ret nz
+ ld hl, wd297
+ ld de, wBackgroundPalettesCGB
+ ld bc, 8 palettes
+ call CopyDataHLtoDE_SaveRegisters
+ ld a, [wd4bc]
+ call SetBGP
+ call FlushAllPalettes
+ jp Func_1ccbc
+; 0x1cdc3
+
+Func_1cdc3: ; 1cdc3 (7:4dc3)
+ ld hl, wd4b9
+ ld [hl], $df
+ inc hl
+ ld [hl], $4d
+ xor a
+ ld [wApplyBGScroll], a
+ ld hl, $cace
+ ld [hl], $a6
+ inc hl
+ ld [hl], $3e
+ ld a, $01
+ ld [wBGScrollMod], a
+ call EnableInt_LYCoincidence
+ ld a, [$d4bb]
+ srl a
+ srl a
+ srl a
+ and $07
+ ld c, a
+ ld b, $00
+ ld hl, $4dfb
+ add hl, bc
+ ld a, [hl]
+ ld [wBGScrollMod], a
+ call Func_1cd71
+ jp Func_1ccb7
+; 0x1cdfb
+
+ INCROM $1cdfb, $1ce03
+
+Func_1ce03: ; 1ce03 (7:4e03)
+ cp $9e
+ jr z, .asm_1ce17
+ sub $96
+ add a
+ ld c, a
+ ld b, $00
+ ld hl, $4e22
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp Func_3bb5
+.asm_1ce17
+ ld a, [wd4b1]
+ ld l, a
+ ld a, [wd4b2]
+ ld h, a
+ jp Func_3bb5
+; 0x1ce22
+
+ INCROM $1ce22, $1ce32
+
+; data for each animation ID (see src/constants/sprite_constants.asm)
+Animations: ; 1ce32 (7:4e32)
+ ; DUEL_ANIM_NONE
+ db $00 ; sprite ID
+ db $00 ; palette ID
+ db $00 ; anim ID
+ db $00 ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_GLOW
+ db SPRITE_DUEL_GLOW ; sprite ID
+ db $1f ; palette ID
+ db $47 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) ; anim flags
+ db $11 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_2
+ db SPRITE_DUEL_1 ; sprite ID
+ db $20 ; palette ID
+ db $48 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) ; anim flags
+ db $12 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_SLEEP
+ db SPRITE_DUEL_2 ; sprite ID
+ db $21 ; palette ID
+ db $49 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) ; anim flags
+ db $13 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_4
+ db SPRITE_DUEL_55 ; sprite ID
+ db $22 ; palette ID
+ db $4a ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) ; anim flags
+ db $14 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_POISON
+ db SPRITE_DUEL_58 ; sprite ID
+ db $23 ; palette ID
+ db $4b ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) ; anim flags
+ db $15 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_6
+ db SPRITE_DUEL_3 ; sprite ID
+ db $24 ; palette ID
+ db $4c ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) ; anim flags
+ db $16 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_HIT
+ db SPRITE_DUEL_3 ; sprite ID
+ db $24 ; palette ID
+ db $4d ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) ; anim flags
+ db $16 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_8
+ db SPRITE_DUEL_3 ; sprite ID
+ db $24 ; palette ID
+ db $4e ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) ; anim flags
+ db $17 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_SHOW_DAMAGE
+ db SPRITE_DUEL_4 ; sprite ID
+ db $25 ; palette ID
+ db $00 ; anim ID
+ db $00 ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_THUNDER_SHOCK
+ db SPRITE_DUEL_5 ; sprite ID
+ db $26 ; palette ID
+ db $5c ; anim ID
+ db $00 ; anim flags
+ db $18 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_11
+ db SPRITE_DUEL_6 ; sprite ID
+ db $27 ; palette ID
+ db $5e ; anim ID
+ db $00 ; anim flags
+ db $19 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_12
+ db SPRITE_DUEL_59 ; sprite ID
+ db $28 ; palette ID
+ db $5f ; anim ID
+ db $00 ; anim flags
+ db $1a ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_13
+ db SPRITE_DUEL_7 ; sprite ID
+ db $29 ; palette ID
+ db $60 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $1b ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_14
+ db SPRITE_DUEL_8 ; sprite ID
+ db $2a ; palette ID
+ db $61 ; anim ID
+ db $00 ; anim flags
+ db $1c ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_15
+ db SPRITE_DUEL_8 ; sprite ID
+ db $2a ; palette ID
+ db $62 ; anim ID
+ db $00 ; anim flags
+ db $1d ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_16
+ db SPRITE_DUEL_9 ; sprite ID
+ db $2b ; palette ID
+ db $63 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $1e ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_17
+ db SPRITE_DUEL_10 ; sprite ID
+ db $2c ; palette ID
+ db $64 ; anim ID
+ db $00 ; anim flags
+ db $1f ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_18
+ db SPRITE_DUEL_61 ; sprite ID
+ db $2d ; palette ID
+ db $69 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $20 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_19
+ db SPRITE_DUEL_11 ; sprite ID
+ db $2e ; palette ID
+ db $6a ; anim ID
+ db $00 ; anim flags
+ db $21 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_20
+ db SPRITE_DUEL_12 ; sprite ID
+ db $2f ; palette ID
+ db $6b ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $22 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_21
+ db SPRITE_DUEL_13 ; sprite ID
+ db $30 ; palette ID
+ db $6c ; anim ID
+ db $00 ; anim flags
+ db $23 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_22
+ db SPRITE_DUEL_62 ; sprite ID
+ db $31 ; palette ID
+ db $6d ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $24 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_23
+ db SPRITE_DUEL_14 ; sprite ID
+ db $32 ; palette ID
+ db $6e ; anim ID
+ db $00 ; anim flags
+ db $25 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_24
+ db SPRITE_DUEL_15 ; sprite ID
+ db $33 ; palette ID
+ db $6f ; anim ID
+ db $00 ; anim flags
+ db $26 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_25
+ db SPRITE_DUEL_16 ; sprite ID
+ db $34 ; palette ID
+ db $70 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_6) | (1 << SPRITE_ANIM_FLAG_Y_SUBTRACT) ; anim flags
+ db $27 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_26
+ db SPRITE_DUEL_17 ; sprite ID
+ db $35 ; palette ID
+ db $71 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_6) | (1 << SPRITE_ANIM_FLAG_Y_SUBTRACT) ; anim flags
+ db $28 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_27
+ db SPRITE_DUEL_18 ; sprite ID
+ db $36 ; palette ID
+ db $72 ; anim ID
+ db $00 ; anim flags
+ db $29 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_28
+ db SPRITE_DUEL_18 ; sprite ID
+ db $36 ; palette ID
+ db $73 ; anim ID
+ db $00 ; anim flags
+ db $2a ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_29
+ db SPRITE_DUEL_19 ; sprite ID
+ db $37 ; palette ID
+ db $74 ; anim ID
+ db $00 ; anim flags
+ db $2b ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_30
+ db SPRITE_DUEL_19 ; sprite ID
+ db $37 ; palette ID
+ db $75 ; anim ID
+ db $00 ; anim flags
+ db $52 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_31
+ db SPRITE_DUEL_19 ; sprite ID
+ db $37 ; palette ID
+ db $76 ; anim ID
+ db $00 ; anim flags
+ db $53 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_32
+ db SPRITE_DUEL_20 ; sprite ID
+ db $38 ; palette ID
+ db $77 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_5) | (1 << SPRITE_ANIM_FLAG_X_SUBTRACT) ; anim flags
+ db $2c ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_33
+ db SPRITE_DUEL_21 ; sprite ID
+ db $39 ; palette ID
+ db $78 ; anim ID
+ db $00 ; anim flags
+ db $2d ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_34
+ db SPRITE_DUEL_22 ; sprite ID
+ db $3a ; palette ID
+ db $7a ; anim ID
+ db $00 ; anim flags
+ db $2d ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_35
+ db SPRITE_DUEL_23 ; sprite ID
+ db $3b ; palette ID
+ db $7b ; anim ID
+ db $00 ; anim flags
+ db $2e ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_FURY_SWIPES
+ db SPRITE_DUEL_21 ; sprite ID
+ db $39 ; palette ID
+ db $79 ; anim ID
+ db $00 ; anim flags
+ db $2f ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_37
+ db SPRITE_DUEL_24 ; sprite ID
+ db $3c ; palette ID
+ db $7c ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_5) | (1 << SPRITE_ANIM_FLAG_X_SUBTRACT) ; anim flags
+ db $30 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_38
+ db SPRITE_DUEL_25 ; sprite ID
+ db $3d ; palette ID
+ db $7d ; anim ID
+ db $00 ; anim flags
+ db $31 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_39
+ db SPRITE_DUEL_26 ; sprite ID
+ db $3e ; palette ID
+ db $7e ; anim ID
+ db $00 ; anim flags
+ db $32 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_40
+ db SPRITE_DUEL_27 ; sprite ID
+ db $3f ; palette ID
+ db $7f ; anim ID
+ db $00 ; anim flags
+ db $33 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_41
+ db SPRITE_DUEL_28 ; sprite ID
+ db $40 ; palette ID
+ db $80 ; anim ID
+ db $00 ; anim flags
+ db $34 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_42
+ db SPRITE_DUEL_29 ; sprite ID
+ db $41 ; palette ID
+ db $81 ; anim ID
+ db $00 ; anim flags
+ db $35 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_43
+ db SPRITE_DUEL_56 ; sprite ID
+ db $42 ; palette ID
+ db $82 ; anim ID
+ db $00 ; anim flags
+ db $36 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_44
+ db SPRITE_DUEL_30 ; sprite ID
+ db $43 ; palette ID
+ db $83 ; anim ID
+ db $00 ; anim flags
+ db $37 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_45
+ db SPRITE_DUEL_31 ; sprite ID
+ db $44 ; palette ID
+ db $84 ; anim ID
+ db $00 ; anim flags
+ db $38 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_46
+ db SPRITE_DUEL_32 ; sprite ID
+ db $45 ; palette ID
+ db $85 ; anim ID
+ db $00 ; anim flags
+ db $39 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_47
+ db SPRITE_DUEL_33 ; sprite ID
+ db $46 ; palette ID
+ db $86 ; anim ID
+ db $00 ; anim flags
+ db $3a ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_48
+ db SPRITE_DUEL_34 ; sprite ID
+ db $47 ; palette ID
+ db $87 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_5) | (1 << SPRITE_ANIM_FLAG_X_SUBTRACT) ; anim flags
+ db $3b ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_49
+ db SPRITE_DUEL_35 ; sprite ID
+ db $48 ; palette ID
+ db $88 ; anim ID
+ db $00 ; anim flags
+ db $3c ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_50
+ db SPRITE_DUEL_66 ; sprite ID
+ db $49 ; palette ID
+ db $89 ; anim ID
+ db $00 ; anim flags
+ db $3d ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_51
+ db SPRITE_DUEL_36 ; sprite ID
+ db $4a ; palette ID
+ db $8a ; anim ID
+ db $00 ; anim flags
+ db $3e ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_52
+ db SPRITE_DUEL_37 ; sprite ID
+ db $4b ; palette ID
+ db $8b ; anim ID
+ db $00 ; anim flags
+ db $3f ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_53
+ db SPRITE_DUEL_57 ; sprite ID
+ db $4c ; palette ID
+ db $8c ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $40 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_54
+ db SPRITE_DUEL_38 ; sprite ID
+ db $4d ; palette ID
+ db $8d ; anim ID
+ db $00 ; anim flags
+ db $41 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_55
+ db SPRITE_DUEL_39 ; sprite ID
+ db $4e ; palette ID
+ db $8e ; anim ID
+ db $00 ; anim flags
+ db $42 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_56
+ db SPRITE_DUEL_40 ; sprite ID
+ db $4f ; palette ID
+ db $8f ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $43 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_57
+ db SPRITE_DUEL_41 ; sprite ID
+ db $50 ; palette ID
+ db $90 ; anim ID
+ db $00 ; anim flags
+ db $44 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_58
+ db SPRITE_DUEL_42 ; sprite ID
+ db $51 ; palette ID
+ db $92 ; anim ID
+ db $00 ; anim flags
+ db $45 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_59
+ db SPRITE_DUEL_43 ; sprite ID
+ db $52 ; palette ID
+ db $93 ; anim ID
+ db $00 ; anim flags
+ db $46 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_60
+ db SPRITE_DUEL_44 ; sprite ID
+ db $53 ; palette ID
+ db $94 ; anim ID
+ db $00 ; anim flags
+ db $47 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_61
+ db SPRITE_DUEL_44 ; sprite ID
+ db $53 ; palette ID
+ db $95 ; anim ID
+ db $00 ; anim flags
+ db $48 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_HEAL
+ db SPRITE_DUEL_60 ; sprite ID
+ db $54 ; palette ID
+ db $97 ; anim ID
+ db $00 ; anim flags
+ db $49 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_63
+ db SPRITE_DUEL_64 ; sprite ID
+ db $55 ; palette ID
+ db $99 ; anim ID
+ db $00 ; anim flags
+ db $4a ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_64
+ db SPRITE_DUEL_29 ; sprite ID
+ db $56 ; palette ID
+ db $81 ; anim ID
+ db $00 ; anim flags
+ db $4b ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_65
+ db SPRITE_DUEL_44 ; sprite ID
+ db $53 ; palette ID
+ db $96 ; anim ID
+ db $00 ; anim flags
+ db $47 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_66
+ db SPRITE_DUEL_3 ; sprite ID
+ db $24 ; palette ID
+ db $4d ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) ; anim flags
+ db $16 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_67
+ db SPRITE_DUEL_3 ; sprite ID
+ db $24 ; palette ID
+ db $4e ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) ; anim flags
+ db $17 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_68
+ db SPRITE_DUEL_5 ; sprite ID
+ db $26 ; palette ID
+ db $5c ; anim ID
+ db $00 ; anim flags
+ db $18 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_69
+ db SPRITE_DUEL_62 ; sprite ID
+ db $31 ; palette ID
+ db $6d ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $24 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_70
+ db SPRITE_DUEL_45 ; sprite ID
+ db $57 ; palette ID
+ db $9a ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) ; anim flags
+ db $11 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_71
+ db SPRITE_DUEL_10 ; sprite ID
+ db $2c ; palette ID
+ db $65 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $5c ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_72
+ db SPRITE_DUEL_10 ; sprite ID
+ db $2c ; palette ID
+ db $66 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_73
+ db SPRITE_DUEL_60 ; sprite ID
+ db $54 ; palette ID
+ db $98 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $4c ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_74
+ db SPRITE_DUEL_41 ; sprite ID
+ db $50 ; palette ID
+ db $91 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $4d ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_75
+ db SPRITE_DUEL_46 ; sprite ID
+ db $58 ; palette ID
+ db $9b ; anim ID
+ db $00 ; anim flags
+ db $4e ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_76
+ db SPRITE_DUEL_47 ; sprite ID
+ db $59 ; palette ID
+ db $9c ; anim ID
+ db $00 ; anim flags
+ db $4f ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_77
+ db SPRITE_DUEL_48 ; sprite ID
+ db $5a ; palette ID
+ db $9d ; anim ID
+ db $00 ; anim flags
+ db $50 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_78
+ db SPRITE_DUEL_10 ; sprite ID
+ db $2c ; palette ID
+ db $67 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $51 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_79
+ db SPRITE_DUEL_10 ; sprite ID
+ db $2c ; palette ID
+ db $68 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $51 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_80
+ db SPRITE_DUEL_49 ; sprite ID
+ db $5b ; palette ID
+ db $9e ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_3) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_PLAYER_SHUFFLE
+ db SPRITE_DUEL_49 ; sprite ID
+ db $5b ; palette ID
+ db $9f ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_3) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $07 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_OPP_SHUFFLE
+ db SPRITE_DUEL_49 ; sprite ID
+ db $5b ; palette ID
+ db $a0 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_3) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $07 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_BOTH_SHUFFLE
+ db SPRITE_DUEL_49 ; sprite ID
+ db $5b ; palette ID
+ db $a1 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_3) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $07 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_84
+ db SPRITE_DUEL_49 ; sprite ID
+ db $5b ; palette ID
+ db $a2 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_BOTH_DRAW
+ db SPRITE_DUEL_49 ; sprite ID
+ db $5b ; palette ID
+ db $a3 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_3) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_PLAYER_DRAW
+ db SPRITE_DUEL_49 ; sprite ID
+ db $5b ; palette ID
+ db $a4 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_3) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_OPP_DRAW
+ db SPRITE_DUEL_49 ; sprite ID
+ db $5b ; palette ID
+ db $a5 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_3) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_COIN_SPIN
+ db SPRITE_DUEL_50 ; sprite ID
+ db $5c ; palette ID
+ db $a7 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_3) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_COIN_TOSS1
+ db SPRITE_DUEL_50 ; sprite ID
+ db $5c ; palette ID
+ db $a8 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_3) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $0b ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_COIN_TOSS2
+ db SPRITE_DUEL_50 ; sprite ID
+ db $5c ; palette ID
+ db $a9 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_3) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $0b ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_COIN_TAILS
+ db SPRITE_DUEL_50 ; sprite ID
+ db $5c ; palette ID
+ db $aa ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_COIN_HEADS
+ db SPRITE_DUEL_50 ; sprite ID
+ db $5c ; palette ID
+ db $ab ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_DUEL_WIN
+ db SPRITE_DUEL_WON_LOST_DRAW ; sprite ID
+ db $5d ; palette ID
+ db $ac ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_DUEL_LOSS
+ db SPRITE_DUEL_WON_LOST_DRAW ; sprite ID
+ db $5d ; palette ID
+ db $ad ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_DUEL_DRAW
+ db SPRITE_DUEL_WON_LOST_DRAW ; sprite ID
+ db $5d ; palette ID
+ db $ae ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+
+ ; DUEL_ANIM_96
+ db SPRITE_DUEL_49 ; sprite ID
+ db $5b ; palette ID
+ db $a6 ; anim ID
+ db (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) | (1 << SPRITE_ANIM_FLAG_SPEED) ; anim flags
+ db $00 ; sound FX ID
+ db $00 ; handler function
+; 0x1d078
Func_1d078: ; 1d078 (7:5078)
ld a, [wd627]
diff --git a/src/engine/bank20.asm b/src/engine/bank20.asm
index 14292f9..c2a8cdf 100644
--- a/src/engine/bank20.asm
+++ b/src/engine/bank20.asm
@@ -26,7 +26,7 @@ Func_80077: ; 80077 (20:4077)
push bc
push de
call BCCoordToBGMap0Address
- ld hl, wd4c2
+ ld hl, wVRAMPointer
ld [hl], e
inc hl
ld [hl], d
@@ -66,9 +66,9 @@ Func_800bd: ; 800bd (20:40bd)
ld d, a
ld b, $c0
call Func_08bf
- ld a, [wd4c2]
+ ld a, [wVRAMPointer]
ld e, a
- ld a, [wd4c3]
+ ld a, [wVRAMPointer + 1]
ld d, a
call Func_800e0
pop de
@@ -311,36 +311,46 @@ LoadGraphicsPointerFromHL: ; 80229 (20:4229)
INCROM $80238, $8025b
+; loads graphics data from third map data pointers
+; input:
+; a = sprite index within the data map
+; output:
+; a = number of tiles in sprite
Func_8025b: ; 8025b (20:425b)
push hl
ld l, $4
call GetMapDataPointer
call LoadGraphicsPointerFromHL
- ld a, [hl]
+ ld a, [hl] ; sprite number of tiles
push af
- ld [wd4c8], a
- ld a, $10
- ld [wd4c7], a
- call Func_80274
+ ld [wCurSpriteNumTiles], a
+ ld a, TILE_SIZE
+ ld [wCurSpriteTileSize], a
+ call LoadGfxDataFromTempPointerToVRAMBank
pop af
pop hl
ret
-Func_80274: ; 80274 (20:4274)
- call Func_8029f
- jr asm_8027c
+; loads graphics data pointed by wTempPointer in wTempPointerBank
+; to the VRAM bank according to wd4cb, in address pointed by wVRAMPointer
+LoadGfxDataFromTempPointerToVRAMBank: ; 80274 (20:4274)
+ call GetTileOffsetPointerAndSwitchVRAM
+ jr LoadGfxDataFromTempPointer
Func_80279: ; 80279 (20:4279)
call Func_802bb
-asm_8027c:
+
+; loads graphics data pointed by wTempPointer in wTempPointerBank
+; to wVRAMPointer
+LoadGfxDataFromTempPointer:
push hl
push bc
push de
- ld a, [wd4c8]
+ ld a, [wCurSpriteNumTiles]
ld b, a
- ld a, [wd4c7]
+ ld a, [wCurSpriteTileSize]
ld c, a
- ld hl, wd4c2
+ ld hl, wVRAMPointer
ld e, [hl]
inc hl
ld d, [hl]
@@ -350,23 +360,30 @@ asm_8027c:
ld l, a
inc hl
inc hl
- call Func_395a
+ call CopyGfxDataFromTempBank
call BankswitchVRAM0
pop de
pop bc
pop hl
ret
-Func_8029f: ; 8029f (20:429f)
- ld a, [wd4ca]
+; convert wVRAMTileOffset to address in VRAM
+; and stores it in wVRAMPointer
+; switches VRAM according to wd4cb
+GetTileOffsetPointerAndSwitchVRAM: ; 8029f (20:429f)
+; address of the tile offset is wVRAMTileOffset * $10 + $8000
+ ld a, [wVRAMTileOffset]
swap a
push af
and $f0
- ld [wd4c2], a
+ ld [wVRAMPointer], a
pop af
and $f
- add $80
- ld [wd4c3], a
+ add HIGH(v0Tiles0) ; $80
+ ld [wVRAMPointer + 1], a
+
+; if bottom bit in wd4cb is not set = VRAM0
+; if bottom bit in wd4cb is set = VRAM1
ld a, [wd4cb]
and $1
call BankswitchVRAM
@@ -377,10 +394,10 @@ Func_802bb: ; 802bb (20:42bb)
push af
xor $80
ld [wd4ca], a
- call Func_8029f
- ld a, [wd4c3]
+ call GetTileOffsetPointerAndSwitchVRAM
+ ld a, [wVRAMPointer + 1]
add $8
- ld [wd4c3], a
+ ld [wVRAMPointer + 1], a
pop af
ld [wd4ca], a
ret
@@ -398,10 +415,145 @@ Func_803b9: ; 803b9 (20:43b9)
ret
; 0x803c9
- INCROM $803c9, $80418
+ INCROM $803c9, $803ec
+
+; copies from palette data in hl c*8 bytes to palette index b
+; in WRAM, starting from wBackgroundPalettesCGB
+; b = palette index
+; c = palette size
+; hl = palette data to copy
+LoadPaletteData: ; 803ec (20:43ec)
+ push hl
+ push bc
+ push de
+ ld a, b
+ cp NUM_BACKGROUND_PALETTES + NUM_OBJECT_PALETTES ; total palettes available
+ jr nc, .fail_return
+
+ add a ; 2 * index
+ add a ; 4 * index
+ add a ; 8 * index
+ add LOW(wBackgroundPalettesCGB)
+ ld e, a
+ ld a, HIGH(wBackgroundPalettesCGB)
+ adc 0
+ ld d, a
+
+ ld a, c
+ cp $09
+ jr nc, .fail_return
+
+ add a ; 2 * size
+ add a ; 4 * size
+ add a ; 8 * size
+ ld c, a
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .loop
+ call FlushAllPalettes
+ jr .success_return
+
+.fail_return
+ debug_ret
+
+.success_return
+ pop de
+ pop bc
+ pop hl
+ ret
+; 0x80418
Func_80418: ; 80418 (20:4418)
- INCROM $80418, $80480
+ push hl
+ push bc
+ push de
+ call CopyPaletteDataToBuffer
+
+ ld hl, wd23e
+ ld a, [hli] ; number palettes
+ ld c, a
+ or a
+ jr z, .check_palette_size
+
+ ld a, [wd4ca]
+ cp $01
+ jr z, .obp1
+
+ ld a, [hli] ; pallete for OBP0
+ push hl
+ push bc
+ call SetOBP0
+ pop bc
+ pop hl
+ dec c
+ jr z, .check_palette_size
+
+.obp1
+ ld a, [hli] ; pallete for OBP1
+ push hl
+ push bc
+ call SetOBP1
+ pop bc
+ pop hl
+ dec c
+ jr z, .check_palette_size
+ inc hl
+
+.check_palette_size
+ ld a, [hli]
+ or a
+ jr z, .done
+
+; non-zero size, so load it from data
+ ld c, a
+ ld a, [wd4cb]
+ ; ensure it's a palette index starting from wObjectPalettesCGB
+ or NUM_BACKGROUND_PALETTES
+ ld b, a
+ call LoadPaletteData
+
+.done
+ pop de
+ pop bc
+ pop hl
+ ret
+; 0x80456
+
+; copies palette data of index in a to wd23e
+CopyPaletteDataToBuffer: ; 80456 (20:4456)
+ push hl
+ push bc
+ push de
+ ld l, $08
+ call GetMapDataPointer
+ call LoadGraphicsPointerFromHL
+
+; size parameter
+ ld a, [hl]
+ ld b, a
+ and $0f
+ inc a
+ ld c, a
+ ld a, b
+ and $f0
+ srl a
+ inc a
+ add c
+ ld c, a
+ ld b, $00
+
+ ld de, wd23e
+ call CopyBankedDataToDE
+ pop de
+ pop bc
+ pop hl
+ ret
+; 0x8047b
+
+ INCROM $8047b, $80480
Func_80480: ; 80480 (20:4480)
INCROM $80480, $804d8
@@ -524,7 +676,6 @@ SpriteNullAnimationFrame:
db 0
; might be closer to "screen specific data" than map data
-; data in each section is 4 bytes long.
MapDataPointers: ; 80e5d (20:4e5d)
dw MapDataPointers_80e67
dw MapDataPointers_8100f
@@ -533,17 +684,730 @@ MapDataPointers: ; 80e5d (20:4e5d)
dw MapDataPointers_81697
MapDataPointers_80e67: ; 80e67 (20:4e67)
- INCROM $80e67, $8100f
+ db $1b, $59, $00, $00
+ db $22, $5a, $00, $00
+ db $13, $5c, $00, $01
+ db $2e, $5d, $00, $01
+ db $d1, $5e, $00, $01
+ db $f5, $5e, $00, $01
+ db $26, $5f, $00, $01
+ db $eb, $5f, $00, $01
+ db $43, $61, $00, $01
+ db $50, $61, $00, $01
+ db $60, $61, $00, $02
+ db $22, $62, $00, $02
+ db $36, $63, $00, $03
+ db $00, $64, $00, $03
+ db $1d, $65, $00, $03
+ db $e7, $65, $00, $03
+ db $04, $67, $00, $03
+ db $ce, $67, $00, $03
+ db $eb, $68, $00, $03
+ db $b5, $69, $00, $03
+ db $d2, $6a, $00, $03
+ db $9c, $6b, $00, $03
+ db $b9, $6c, $00, $03
+ db $83, $6d, $00, $03
+ db $a0, $6e, $00, $03
+ db $6a, $6f, $00, $03
+ db $87, $70, $00, $03
+ db $51, $71, $00, $03
+ db $6e, $72, $00, $03
+ db $21, $73, $00, $03
+ db $24, $74, $00, $04
+ db $45, $75, $00, $04
+ db $db, $76, $00, $05
+ db $8c, $77, $00, $05
+ db $8d, $78, $00, $06
+ db $d6, $79, $00, $06
+ db $00, $40, $01, $07
+ db $88, $41, $01, $07
+ db $bb, $43, $01, $08
+ db $33, $45, $01, $08
+ db $2e, $47, $01, $09
+ db $d8, $48, $01, $09
+ db $73, $4b, $01, $0a
+ db $6f, $4c, $01, $0a
+ db $fe, $4d, $01, $0b
+ db $1d, $4f, $01, $0b
+ db $b6, $50, $01, $0c
+ db $91, $51, $01, $0c
+ db $15, $53, $01, $0d
+ db $b3, $54, $01, $0d
+ db $0a, $57, $01, $0e
+ db $ce, $57, $01, $0e
+ db $f1, $7b, $00, $0e
+ db $03, $7c, $00, $0e
+ db $ef, $58, $01, $0f
+ db $79, $5a, $01, $0f
+ db $1a, $7c, $00, $0f
+ db $26, $7c, $00, $0f
+ db $e2, $5c, $01, $10
+ db $f4, $5d, $01, $10
+ db $7c, $5f, $01, $11
+ db $7f, $60, $01, $11
+ db $36, $7c, $00, $12
+ db $7d, $61, $01, $12
+ db $93, $61, $01, $12
+ db $a9, $61, $01, $12
+ db $bf, $61, $01, $12
+ db $d5, $61, $01, $12
+ db $eb, $61, $01, $12
+ db $01, $62, $01, $12
+ db $17, $62, $01, $13
+ db $da, $62, $01, $13
+ db $64, $63, $01, $13
+ db $43, $64, $01, $13
+ db $df, $64, $01, $14
+ db $b5, $65, $01, $14
+ db $47, $66, $01, $15
+ db $b8, $66, $01, $16
+ db $3e, $67, $01, $17
+ db $af, $67, $01, $18
+ db $33, $68, $01, $19
+ db $a4, $68, $01, $1a
+ db $25, $69, $01, $1b
+ db $96, $69, $01, $1c
+ db $14, $6a, $01, $1d
+ db $85, $6a, $01, $1e
+ db $28, $6b, $01, $1f
+ db $99, $6b, $01, $20
+ db $34, $6c, $01, $21
+ db $a5, $6c, $01, $22
+ db $37, $6d, $01, $23
+ db $cc, $6d, $01, $24
+ db $8a, $6e, $01, $25
+ db $18, $6f, $01, $25
+ db $c0, $6f, $01, $25
+ db $4f, $70, $01, $26
+ db $a5, $71, $01, $27
+ db $97, $73, $01, $28
+ db $b7, $73, $01, $29
+ db $e5, $73, $01, $2a
+ db $13, $74, $01, $2b
+ db $38, $75, $01, $2c
+ db $9f, $76, $01, $2d
+ db $f6, $76, $01, $2d
+ db $7c, $77, $01, $2e
+ db $c4, $77, $01, $2f
MapDataPointers_8100f: ; 8100f (20:500f)
- INCROM $8100f, $8116b
+ db $00, $40, $02, $c1
+ db $12, $4c, $02, $97
+ db $28, $78, $01, $4d
+ db $84, $55, $02, $81
+ db $96, $5d, $02, $78
+ db $18, $65, $02, $63
+ db $4a, $6b, $02, $3c
+ db $0c, $6f, $02, $a1
+ db $00, $40, $03, $83
+ db $1e, $79, $02, $57
+ db $32, $48, $03, $3a
+ db $d4, $4b, $03, $52
+ db $f6, $50, $03, $57
+ db $68, $56, $03, $9d
+ db $3a, $60, $03, $4e
+ db $1c, $65, $03, $cf
+ db $0e, $72, $03, $79
+ db $00, $40, $04, $bd
+ db $a0, $79, $03, $48
+ db $d2, $4b, $04, $6d
+ db $a4, $52, $04, $5d
+ db $76, $58, $04, $60
+ db $78, $5e, $04, $56
+ db $da, $63, $04, $60
+ db $dc, $69, $04, $56
+ db $3e, $6f, $04, $60
+ db $40, $75, $04, $56
+ db $00, $40, $05, $60
+ db $02, $46, $05, $56
+ db $64, $4b, $05, $60
+ db $66, $51, $05, $60
+ db $68, $57, $05, $60
+ db $6a, $5d, $05, $60
+ db $6c, $63, $05, $60
+ db $6e, $69, $05, $60
+ db $70, $6f, $05, $61
+ db $82, $75, $05, $61
+ db $fa, $7c, $01, $04
+ db $00, $40, $06, $f4
+ db $42, $4f, $06, $3b
+ db $3c, $7d, $01, $04
+ db $7e, $7d, $01, $24
+ db $a2, $7a, $04, $24
+ db $f4, $62, $06, $dc
+ db $b6, $70, $06, $d4
+ db $e4, $7c, $04, $24
+ db $22, $7e, $03, $18
+ db $94, $7b, $05, $31
+ db $00, $40, $07, $24
+ db $42, $42, $07, $24
+ db $84, $44, $07, $24
+ db $c6, $46, $07, $24
+ db $08, $49, $07, $24
+ db $4a, $4b, $07, $24
+ db $8c, $4d, $07, $24
+ db $ce, $4f, $07, $24
+ db $10, $52, $07, $24
+ db $52, $54, $07, $24
+ db $94, $56, $07, $24
+ db $d6, $58, $07, $24
+ db $18, $5b, $07, $24
+ db $5a, $5d, $07, $24
+ db $9c, $5f, $07, $24
+ db $de, $61, $07, $24
+ db $20, $64, $07, $24
+ db $62, $66, $07, $24
+ db $a4, $68, $07, $24
+ db $e6, $6a, $07, $24
+ db $28, $6d, $07, $24
+ db $6a, $6f, $07, $24
+ db $ac, $71, $07, $24
+ db $ee, $73, $07, $24
+ db $30, $76, $07, $24
+ db $72, $78, $07, $24
+ db $b4, $7a, $07, $24
+ db $f6, $7c, $07, $24
+ db $00, $40, $08, $24
+ db $42, $42, $08, $24
+ db $84, $44, $08, $24
+ db $c6, $46, $08, $24
+ db $08, $49, $08, $24
+ db $4a, $4b, $08, $24
+ db $8c, $4d, $08, $24
+ db $ce, $4f, $08, $24
+ db $10, $52, $08, $24
+ db $52, $54, $08, $24
+ db $94, $56, $08, $24
+
+; \1 = gfx pointer
+; \2 = number of tiles
+gfx_pointer: MACRO
+ dwb \1, BANK(\1) - BANK(MapDataPointers_8116b)
+ db \2
+ENDM
MapDataPointers_8116b: ; 8116b (20:516b)
- INCROM $8116b, $81333
+ gfx_pointer OWPlayerGfx, $14 ; SPRITE_OW_PLAYER
+ gfx_pointer OWRonaldGfx, $14 ; SPRITE_OW_RONALD
+ gfx_pointer OWDrMasonGfx, $14 ; SPRITE_OW_DRMASON
+ gfx_pointer OWIshiharaGfx, $14 ; SPRITE_OW_ISHIHARA
+ gfx_pointer OWImakuniGfx, $14 ; SPRITE_OW_IMAKUNI
+ gfx_pointer OWNikkiGfx, $14 ; SPRITE_OW_NIKKI
+ gfx_pointer OWRickGfx, $14 ; SPRITE_OW_RICK
+ gfx_pointer OWKenGfx, $14 ; SPRITE_OW_KEN
+ gfx_pointer OWAmyGfx, $1b ; SPRITE_OW_AMY
+ gfx_pointer OWIsaacGfx, $14 ; SPRITE_OW_ISAAC
+ gfx_pointer OWMitchGfx, $14 ; SPRITE_OW_MITCH
+ gfx_pointer OWGeneGfx, $14 ; SPRITE_OW_GENE
+ gfx_pointer OWMurrayGfx, $14 ; SPRITE_OW_MURRAY
+ gfx_pointer OWCourtneyGfx, $14 ; SPRITE_OW_COURTNEY
+ gfx_pointer OWSteveGfx, $14 ; SPRITE_OW_STEVE
+ gfx_pointer OWJackGfx, $14 ; SPRITE_OW_JACK
+ gfx_pointer OWRodGfx, $14 ; SPRITE_OW_ROD
+ gfx_pointer OWBoyGfx, $14 ; SPRITE_OW_BOY
+ gfx_pointer OWLadGfx, $14 ; SPRITE_OW_LAD
+ gfx_pointer OWSpecsGfx, $14 ; SPRITE_OW_SPECS
+ gfx_pointer OWButchGfx, $14 ; SPRITE_OW_BUTCH
+ gfx_pointer OWManiaGfx, $14 ; SPRITE_OW_MANIA
+ gfx_pointer OWJoshuaGfx, $14 ; SPRITE_OW_JOSHUA
+ gfx_pointer OWHoodGfx, $14 ; SPRITE_OW_HOOD
+ gfx_pointer OWTechGfx, $14 ; SPRITE_OW_TECH
+ gfx_pointer OWChapGfx, $14 ; SPRITE_OW_CHAP
+ gfx_pointer OWManGfx, $14 ; SPRITE_OW_MAN
+ gfx_pointer OWPappyGfx, $14 ; SPRITE_OW_PAPPY
+ gfx_pointer OWGirlGfx, $14 ; SPRITE_OW_GIRL
+ gfx_pointer OWLass1Gfx, $14 ; SPRITE_OW_LASS1
+ gfx_pointer OWLass2Gfx, $14 ; SPRITE_OW_LASS2
+ gfx_pointer OWLass3Gfx, $14 ; SPRITE_OW_LASS3
+ gfx_pointer OWSwimmerGfx, $14 ; SPRITE_OW_SWIMMER
+ gfx_pointer OWClerkGfx, $08 ; SPRITE_OW_CLERK
+ gfx_pointer OWGalGfx, $14 ; SPRITE_OW_GAL
+ gfx_pointer OWWomanGfx, $14 ; SPRITE_OW_WOMAN
+ gfx_pointer OWGrannyGfx, $14 ; SPRITE_OW_GRANNY
+ gfx_pointer OverworldMapOAMGfx, $08 ; SPRITE_OW_MAP_OAM
+ gfx_pointer Duel0Gfx, $16 ; SPRITE_DUEL_0
+ gfx_pointer Duel63Gfx, $0a ; SPRITE_DUEL_63
+ gfx_pointer DuelGlowGfx, $0b ; SPRITE_DUEL_GLOW
+ gfx_pointer Duel1Gfx, $06 ; SPRITE_DUEL_1
+ gfx_pointer Duel2Gfx, $08 ; SPRITE_DUEL_2
+ gfx_pointer Duel55Gfx, $02 ; SPRITE_DUEL_55
+ gfx_pointer Duel58Gfx, $04 ; SPRITE_DUEL_58
+ gfx_pointer Duel3Gfx, $09 ; SPRITE_DUEL_3
+ gfx_pointer Duel4Gfx, $12 ; SPRITE_DUEL_4
+ gfx_pointer Duel5Gfx, $09 ; SPRITE_DUEL_5
+ gfx_pointer Duel6Gfx, $11 ; SPRITE_DUEL_6
+ gfx_pointer Duel59Gfx, $03 ; SPRITE_DUEL_59
+ gfx_pointer Duel7Gfx, $2d ; SPRITE_DUEL_7
+ gfx_pointer Duel8Gfx, $0d ; SPRITE_DUEL_8
+ gfx_pointer Duel9Gfx, $1c ; SPRITE_DUEL_9
+ gfx_pointer Duel10Gfx, $4c ; SPRITE_DUEL_10
+ gfx_pointer Duel61Gfx, $03 ; SPRITE_DUEL_61
+ gfx_pointer Duel11Gfx, $1b ; SPRITE_DUEL_11
+ gfx_pointer Duel12Gfx, $07 ; SPRITE_DUEL_12
+ gfx_pointer Duel13Gfx, $0c ; SPRITE_DUEL_13
+ gfx_pointer Duel62Gfx, $01 ; SPRITE_DUEL_62
+ gfx_pointer Duel14Gfx, $22 ; SPRITE_DUEL_14
+ gfx_pointer Duel15Gfx, $20 ; SPRITE_DUEL_15
+ gfx_pointer Duel16Gfx, $0a ; SPRITE_DUEL_16
+ gfx_pointer Duel17Gfx, $25 ; SPRITE_DUEL_17
+ gfx_pointer Duel18Gfx, $18 ; SPRITE_DUEL_18
+ gfx_pointer Duel19Gfx, $1b ; SPRITE_DUEL_19
+ gfx_pointer Duel20Gfx, $08 ; SPRITE_DUEL_20
+ gfx_pointer Duel21Gfx, $0d ; SPRITE_DUEL_21
+ gfx_pointer Duel22Gfx, $22 ; SPRITE_DUEL_22
+ gfx_pointer Duel23Gfx, $0c ; SPRITE_DUEL_23
+ gfx_pointer Duel24Gfx, $25 ; SPRITE_DUEL_24
+ gfx_pointer Duel25Gfx, $22 ; SPRITE_DUEL_25
+ gfx_pointer Duel26Gfx, $0c ; SPRITE_DUEL_26
+ gfx_pointer Duel27Gfx, $4c ; SPRITE_DUEL_27
+ gfx_pointer Duel28Gfx, $08 ; SPRITE_DUEL_28
+ gfx_pointer Duel29Gfx, $07 ; SPRITE_DUEL_29
+ gfx_pointer Duel56Gfx, $01 ; SPRITE_DUEL_56
+ gfx_pointer Duel30Gfx, $1a ; SPRITE_DUEL_30
+ gfx_pointer Duel31Gfx, $0a ; SPRITE_DUEL_31
+ gfx_pointer Duel32Gfx, $2e ; SPRITE_DUEL_32
+ gfx_pointer Duel33Gfx, $08 ; SPRITE_DUEL_33
+ gfx_pointer Duel34Gfx, $07 ; SPRITE_DUEL_34
+ gfx_pointer Duel35Gfx, $1c ; SPRITE_DUEL_35
+ gfx_pointer Duel66Gfx, $04 ; SPRITE_DUEL_66
+ gfx_pointer Duel36Gfx, $08 ; SPRITE_DUEL_36
+ gfx_pointer Duel37Gfx, $0b ; SPRITE_DUEL_37
+ gfx_pointer Duel57Gfx, $01 ; SPRITE_DUEL_57
+ gfx_pointer Duel38Gfx, $1c ; SPRITE_DUEL_38
+ gfx_pointer Duel39Gfx, $16 ; SPRITE_DUEL_39
+ gfx_pointer Duel40Gfx, $10 ; SPRITE_DUEL_40
+ gfx_pointer Duel41Gfx, $0f ; SPRITE_DUEL_41
+ gfx_pointer Duel42Gfx, $07 ; SPRITE_DUEL_42
+ gfx_pointer Duel43Gfx, $0a ; SPRITE_DUEL_43
+ gfx_pointer Duel44Gfx, $09 ; SPRITE_DUEL_44
+ gfx_pointer Duel60Gfx, $02 ; SPRITE_DUEL_60
+ gfx_pointer Duel64Gfx, $02 ; SPRITE_DUEL_64
+ gfx_pointer Duel45Gfx, $03 ; SPRITE_DUEL_45
+ gfx_pointer Duel46Gfx, $08 ; SPRITE_DUEL_46
+ gfx_pointer Duel47Gfx, $0f ; SPRITE_DUEL_47
+ gfx_pointer Duel48Gfx, $03 ; SPRITE_DUEL_48
+ gfx_pointer Duel49Gfx, $05 ; SPRITE_DUEL_49
+ gfx_pointer Duel50Gfx, $17 ; SPRITE_DUEL_50
+ gfx_pointer Duel51Gfx, $36 ; SPRITE_DUEL_WON_LOST_DRAW
+ gfx_pointer Duel52Gfx, $0b ; SPRITE_DUEL_52
+ gfx_pointer Duel53Gfx, $06 ; SPRITE_DUEL_53
+ gfx_pointer Duel54Gfx, $16 ; SPRITE_DUEL_54
+ gfx_pointer BoosterPackOAMGfx, $20 ; SPRITE_BOOSTER_PACK_OAM
+ gfx_pointer PressStartGfx, $14 ; SPRITE_PRESS_START
+ gfx_pointer GrassGfx, $04 ; SPRITE_GRASS
+ gfx_pointer FireGfx, $04 ; SPRITE_FIRE
+ gfx_pointer WaterGfx, $04 ; SPRITE_WATER
+ gfx_pointer ColorlessGfx, $04 ; SPRITE_COLORLESS
+ gfx_pointer LightningGfx, $04 ; SPRITE_LIGHTNING
+ gfx_pointer PsychicGfx, $04 ; SPRITE_PSYCHIC
+ gfx_pointer FightingGfx, $04 ; SPRITE_FIGHTING
+
+; \1 = anim data pointer
+anim_data_pointer: MACRO
+ dwb \1, BANK(\1) - BANK(SpriteAnimationPointers)
+ db $00 ; unused (padding?)
+ENDM
-; pointer low, pointer high, bank (minus $20), unknown
SpriteAnimationPointers: ; 81333 (20:5333)
- INCROM $81333, $81697
+ anim_data_pointer AnimData0 ; $00
+ anim_data_pointer AnimData1 ; $01
+ anim_data_pointer AnimData2 ; $02
+ anim_data_pointer AnimData3 ; $03
+ anim_data_pointer AnimData4 ; $04
+ anim_data_pointer AnimData5 ; $05
+ anim_data_pointer AnimData6 ; $06
+ anim_data_pointer AnimData7 ; $07
+ anim_data_pointer AnimData8 ; $08
+ anim_data_pointer AnimData9 ; $09
+ anim_data_pointer AnimData10 ; $0a
+ anim_data_pointer AnimData11 ; $0b
+ anim_data_pointer AnimData12 ; $0c
+ anim_data_pointer AnimData13 ; $0d
+ anim_data_pointer AnimData14 ; $0e
+ anim_data_pointer AnimData15 ; $0f
+ anim_data_pointer AnimData16 ; $10
+ anim_data_pointer AnimData17 ; $11
+ anim_data_pointer AnimData18 ; $12
+ anim_data_pointer AnimData19 ; $13
+ anim_data_pointer AnimData20 ; $14
+ anim_data_pointer AnimData21 ; $15
+ anim_data_pointer AnimData22 ; $16
+ anim_data_pointer AnimData23 ; $17
+ anim_data_pointer AnimData24 ; $18
+ anim_data_pointer AnimData25 ; $19
+ anim_data_pointer AnimData26 ; $1a
+ anim_data_pointer AnimData27 ; $1b
+ anim_data_pointer AnimData28 ; $1c
+ anim_data_pointer AnimData29 ; $1d
+ anim_data_pointer AnimData30 ; $1e
+ anim_data_pointer AnimData31 ; $1f
+ anim_data_pointer AnimData32 ; $20
+ anim_data_pointer AnimData33 ; $21
+ anim_data_pointer AnimData34 ; $22
+ anim_data_pointer AnimData35 ; $23
+ anim_data_pointer AnimData36 ; $24
+ anim_data_pointer AnimData37 ; $25
+ anim_data_pointer AnimData38 ; $26
+ anim_data_pointer AnimData39 ; $27
+ anim_data_pointer AnimData40 ; $28
+ anim_data_pointer AnimData41 ; $29
+ anim_data_pointer AnimData42 ; $2a
+ anim_data_pointer AnimData43 ; $2b
+ anim_data_pointer AnimData44 ; $2c
+ anim_data_pointer AnimData45 ; $2d
+ anim_data_pointer AnimData46 ; $2e
+ anim_data_pointer AnimData47 ; $2f
+ anim_data_pointer AnimData48 ; $30
+ anim_data_pointer AnimData49 ; $31
+ anim_data_pointer AnimData50 ; $32
+ anim_data_pointer AnimData51 ; $33
+ anim_data_pointer AnimData52 ; $34
+ anim_data_pointer AnimData53 ; $35
+ anim_data_pointer AnimData54 ; $36
+ anim_data_pointer AnimData55 ; $37
+ anim_data_pointer AnimData56 ; $38
+ anim_data_pointer AnimData57 ; $39
+ anim_data_pointer AnimData58 ; $3a
+ anim_data_pointer AnimData59 ; $3b
+ anim_data_pointer AnimData60 ; $3c
+ anim_data_pointer AnimData61 ; $3d
+ anim_data_pointer AnimData62 ; $3e
+ anim_data_pointer AnimData63 ; $3f
+ anim_data_pointer AnimData64 ; $40
+ anim_data_pointer AnimData65 ; $41
+ anim_data_pointer AnimData66 ; $42
+ anim_data_pointer AnimData67 ; $43
+ anim_data_pointer AnimData68 ; $44
+ anim_data_pointer AnimData69 ; $45
+ anim_data_pointer AnimData70 ; $46
+ anim_data_pointer AnimData71 ; $47
+ anim_data_pointer AnimData72 ; $48
+ anim_data_pointer AnimData73 ; $49
+ anim_data_pointer AnimData74 ; $4a
+ anim_data_pointer AnimData75 ; $4b
+ anim_data_pointer AnimData76 ; $4c
+ anim_data_pointer AnimData77 ; $4d
+ anim_data_pointer AnimData78 ; $4e
+ anim_data_pointer AnimData79 ; $4f
+ anim_data_pointer AnimData80 ; $50
+ anim_data_pointer AnimData81 ; $51
+ anim_data_pointer AnimData82 ; $52
+ anim_data_pointer AnimData83 ; $53
+ anim_data_pointer AnimData84 ; $54
+ anim_data_pointer AnimData85 ; $55
+ anim_data_pointer AnimData86 ; $56
+ anim_data_pointer AnimData87 ; $57
+ anim_data_pointer AnimData88 ; $58
+ anim_data_pointer AnimData89 ; $59
+ anim_data_pointer AnimData90 ; $5a
+ anim_data_pointer AnimData91 ; $5b
+ anim_data_pointer AnimData92 ; $5c
+ anim_data_pointer AnimData93 ; $5d
+ anim_data_pointer AnimData94 ; $5e
+ anim_data_pointer AnimData95 ; $5f
+ anim_data_pointer AnimData96 ; $60
+ anim_data_pointer AnimData97 ; $61
+ anim_data_pointer AnimData98 ; $62
+ anim_data_pointer AnimData99 ; $63
+ anim_data_pointer AnimData100 ; $64
+ anim_data_pointer AnimData101 ; $65
+ anim_data_pointer AnimData102 ; $66
+ anim_data_pointer AnimData103 ; $67
+ anim_data_pointer AnimData104 ; $68
+ anim_data_pointer AnimData105 ; $69
+ anim_data_pointer AnimData106 ; $6a
+ anim_data_pointer AnimData107 ; $6b
+ anim_data_pointer AnimData108 ; $6c
+ anim_data_pointer AnimData109 ; $6d
+ anim_data_pointer AnimData110 ; $6e
+ anim_data_pointer AnimData111 ; $6f
+ anim_data_pointer AnimData112 ; $70
+ anim_data_pointer AnimData113 ; $71
+ anim_data_pointer AnimData114 ; $72
+ anim_data_pointer AnimData115 ; $73
+ anim_data_pointer AnimData116 ; $74
+ anim_data_pointer AnimData117 ; $75
+ anim_data_pointer AnimData118 ; $76
+ anim_data_pointer AnimData119 ; $77
+ anim_data_pointer AnimData120 ; $78
+ anim_data_pointer AnimData121 ; $79
+ anim_data_pointer AnimData122 ; $7a
+ anim_data_pointer AnimData123 ; $7b
+ anim_data_pointer AnimData124 ; $7c
+ anim_data_pointer AnimData125 ; $7d
+ anim_data_pointer AnimData126 ; $7e
+ anim_data_pointer AnimData127 ; $7f
+ anim_data_pointer AnimData128 ; $80
+ anim_data_pointer AnimData129 ; $81
+ anim_data_pointer AnimData130 ; $82
+ anim_data_pointer AnimData131 ; $83
+ anim_data_pointer AnimData132 ; $84
+ anim_data_pointer AnimData133 ; $85
+ anim_data_pointer AnimData134 ; $86
+ anim_data_pointer AnimData135 ; $87
+ anim_data_pointer AnimData136 ; $88
+ anim_data_pointer AnimData137 ; $89
+ anim_data_pointer AnimData138 ; $8a
+ anim_data_pointer AnimData139 ; $8b
+ anim_data_pointer AnimData140 ; $8c
+ anim_data_pointer AnimData141 ; $8d
+ anim_data_pointer AnimData142 ; $8e
+ anim_data_pointer AnimData143 ; $8f
+ anim_data_pointer AnimData144 ; $90
+ anim_data_pointer AnimData145 ; $91
+ anim_data_pointer AnimData146 ; $92
+ anim_data_pointer AnimData147 ; $93
+ anim_data_pointer AnimData148 ; $94
+ anim_data_pointer AnimData149 ; $95
+ anim_data_pointer AnimData150 ; $96
+ anim_data_pointer AnimData151 ; $97
+ anim_data_pointer AnimData152 ; $98
+ anim_data_pointer AnimData153 ; $99
+ anim_data_pointer AnimData154 ; $9a
+ anim_data_pointer AnimData155 ; $9b
+ anim_data_pointer AnimData156 ; $9c
+ anim_data_pointer AnimData157 ; $9d
+ anim_data_pointer AnimData158 ; $9e
+ anim_data_pointer AnimData159 ; $9f
+ anim_data_pointer AnimData160 ; $a0
+ anim_data_pointer AnimData161 ; $a1
+ anim_data_pointer AnimData162 ; $a2
+ anim_data_pointer AnimData163 ; $a3
+ anim_data_pointer AnimData164 ; $a4
+ anim_data_pointer AnimData165 ; $a5
+ anim_data_pointer AnimData166 ; $a6
+ anim_data_pointer AnimData167 ; $a7
+ anim_data_pointer AnimData168 ; $a8
+ anim_data_pointer AnimData169 ; $a9
+ anim_data_pointer AnimData170 ; $aa
+ anim_data_pointer AnimData171 ; $ab
+ anim_data_pointer AnimData172 ; $ac
+ anim_data_pointer AnimData173 ; $ad
+ anim_data_pointer AnimData174 ; $ae
+ anim_data_pointer AnimData175 ; $af
+ anim_data_pointer AnimData176 ; $b0
+ anim_data_pointer AnimData177 ; $b1
+ anim_data_pointer AnimData178 ; $b2
+ anim_data_pointer AnimData179 ; $b3
+ anim_data_pointer AnimData180 ; $b4
+ anim_data_pointer AnimData181 ; $b5
+ anim_data_pointer AnimData182 ; $b6
+ anim_data_pointer AnimData183 ; $b7
+ anim_data_pointer AnimData184 ; $b8
+ anim_data_pointer AnimData185 ; $b9
+ anim_data_pointer AnimData186 ; $ba
+ anim_data_pointer AnimData187 ; $bb
+ anim_data_pointer AnimData188 ; $bc
+ anim_data_pointer AnimData189 ; $bd
+ anim_data_pointer AnimData190 ; $be
+ anim_data_pointer AnimData191 ; $bf
+ anim_data_pointer AnimData192 ; $c0
+ anim_data_pointer AnimData193 ; $c1
+ anim_data_pointer AnimData194 ; $c2
+ anim_data_pointer AnimData195 ; $c3
+ anim_data_pointer AnimData196 ; $c4
+ anim_data_pointer AnimData197 ; $c5
+ anim_data_pointer AnimData198 ; $c6
+ anim_data_pointer AnimData199 ; $c7
+ anim_data_pointer AnimData200 ; $c8
+ anim_data_pointer AnimData201 ; $c9
+ anim_data_pointer AnimData202 ; $ca
+ anim_data_pointer AnimData203 ; $cb
+ anim_data_pointer AnimData204 ; $cc
+ anim_data_pointer AnimData205 ; $cd
+ anim_data_pointer AnimData206 ; $ce
+ anim_data_pointer AnimData207 ; $cf
+ anim_data_pointer AnimData208 ; $d0
+ anim_data_pointer AnimData209 ; $d1
+ anim_data_pointer AnimData210 ; $d2
+ anim_data_pointer AnimData211 ; $d3
+ anim_data_pointer AnimData212 ; $d4
+ anim_data_pointer AnimData213 ; $d5
+ anim_data_pointer AnimData214 ; $d6
+ anim_data_pointer AnimData215 ; $d7
+ anim_data_pointer AnimData216 ; $d8
+
+; \1 = palette pointer
+; \2 = number of palettes
+; \3 = number of OBJ colors
+palette_pointer: MACRO
+ dwb \1, BANK(\1) - BANK(MapDataPointers_81697)
+ db (\2 << 4) + \3
+ENDM
MapDataPointers_81697: ; 81697 (20:5697)
- INCROM $81697, $84000
+ palette_pointer Palette0, 8, 1 ; $00
+ palette_pointer Palette1, 8, 0 ; $01
+ palette_pointer Palette2, 8, 0 ; $02
+ palette_pointer Palette3, 8, 0 ; $03
+ palette_pointer Palette4, 8, 0 ; $04
+ palette_pointer Palette5, 8, 0 ; $05
+ palette_pointer Palette6, 8, 0 ; $06
+ palette_pointer Palette7, 8, 0 ; $07
+ palette_pointer Palette8, 8, 0 ; $08
+ palette_pointer Palette9, 8, 0 ; $09
+ palette_pointer Palette10, 8, 0 ; $0a
+ palette_pointer Palette11, 8, 0 ; $0b
+ palette_pointer Palette12, 8, 0 ; $0c
+ palette_pointer Palette13, 8, 0 ; $0d
+ palette_pointer Palette14, 8, 0 ; $0e
+ palette_pointer Palette15, 8, 0 ; $0f
+ palette_pointer Palette16, 8, 0 ; $10
+ palette_pointer Palette17, 8, 0 ; $11
+ palette_pointer Palette18, 8, 0 ; $12
+ palette_pointer Palette19, 8, 0 ; $13
+ palette_pointer Palette20, 8, 0 ; $14
+ palette_pointer Palette21, 8, 0 ; $15
+ palette_pointer Palette22, 8, 0 ; $16
+ palette_pointer Palette23, 8, 0 ; $17
+ palette_pointer Palette24, 8, 0 ; $18
+ palette_pointer Palette25, 8, 0 ; $19
+ palette_pointer Palette26, 8, 0 ; $1a
+ palette_pointer Palette27, 8, 0 ; $1b
+ palette_pointer Palette28, 8, 0 ; $1c
+ palette_pointer Palette29, 8, 2 ; $1d
+ palette_pointer Palette30, 8, 2 ; $1e
+ palette_pointer Palette31, 1, 1 ; $1f
+ palette_pointer Palette32, 1, 1 ; $20
+ palette_pointer Palette33, 1, 1 ; $21
+ palette_pointer Palette34, 1, 1 ; $22
+ palette_pointer Palette35, 1, 1 ; $23
+ palette_pointer Palette36, 1, 1 ; $24
+ palette_pointer Palette37, 1, 1 ; $25
+ palette_pointer Palette38, 1, 1 ; $26
+ palette_pointer Palette39, 1, 1 ; $27
+ palette_pointer Palette40, 1, 1 ; $28
+ palette_pointer Palette41, 1, 1 ; $29
+ palette_pointer Palette42, 1, 1 ; $2a
+ palette_pointer Palette43, 1, 1 ; $2b
+ palette_pointer Palette44, 1, 1 ; $2c
+ palette_pointer Palette45, 1, 1 ; $2d
+ palette_pointer Palette46, 1, 1 ; $2e
+ palette_pointer Palette47, 1, 1 ; $2f
+ palette_pointer Palette48, 1, 1 ; $30
+ palette_pointer Palette49, 1, 1 ; $31
+ palette_pointer Palette50, 1, 1 ; $32
+ palette_pointer Palette51, 1, 1 ; $33
+ palette_pointer Palette52, 1, 1 ; $34
+ palette_pointer Palette53, 1, 1 ; $35
+ palette_pointer Palette54, 1, 1 ; $36
+ palette_pointer Palette55, 1, 1 ; $37
+ palette_pointer Palette56, 1, 1 ; $38
+ palette_pointer Palette57, 1, 1 ; $39
+ palette_pointer Palette58, 1, 1 ; $3a
+ palette_pointer Palette59, 1, 1 ; $3b
+ palette_pointer Palette60, 1, 1 ; $3c
+ palette_pointer Palette61, 1, 1 ; $3d
+ palette_pointer Palette62, 1, 1 ; $3e
+ palette_pointer Palette63, 1, 1 ; $3f
+ palette_pointer Palette64, 1, 1 ; $40
+ palette_pointer Palette65, 1, 1 ; $41
+ palette_pointer Palette66, 1, 1 ; $42
+ palette_pointer Palette67, 1, 1 ; $43
+ palette_pointer Palette68, 1, 1 ; $44
+ palette_pointer Palette69, 1, 1 ; $45
+ palette_pointer Palette70, 1, 1 ; $46
+ palette_pointer Palette71, 1, 1 ; $47
+ palette_pointer Palette72, 1, 1 ; $48
+ palette_pointer Palette73, 1, 1 ; $49
+ palette_pointer Palette74, 1, 1 ; $4a
+ palette_pointer Palette75, 1, 1 ; $4b
+ palette_pointer Palette76, 1, 1 ; $4c
+ palette_pointer Palette77, 1, 1 ; $4d
+ palette_pointer Palette78, 1, 1 ; $4e
+ palette_pointer Palette79, 1, 1 ; $4f
+ palette_pointer Palette80, 1, 1 ; $50
+ palette_pointer Palette81, 1, 1 ; $51
+ palette_pointer Palette82, 1, 1 ; $52
+ palette_pointer Palette83, 1, 1 ; $53
+ palette_pointer Palette84, 1, 1 ; $54
+ palette_pointer Palette85, 1, 1 ; $55
+ palette_pointer Palette86, 1, 1 ; $56
+ palette_pointer Palette87, 1, 1 ; $57
+ palette_pointer Palette88, 1, 1 ; $58
+ palette_pointer Palette89, 1, 1 ; $59
+ palette_pointer Palette90, 1, 1 ; $a5
+ palette_pointer Palette91, 1, 1 ; $5b
+ palette_pointer Palette92, 1, 1 ; $5c
+ palette_pointer Palette93, 1, 1 ; $5d
+ palette_pointer Palette94, 8, 0 ; $5e
+ palette_pointer Palette95, 8, 0 ; $5f
+ palette_pointer Palette96, 8, 0 ; $60
+ palette_pointer Palette97, 8, 0 ; $61
+ palette_pointer Palette98, 8, 0 ; $62
+ palette_pointer Palette99, 8, 0 ; $63
+ palette_pointer Palette100, 8, 0 ; $64
+ palette_pointer Palette101, 7, 0 ; $65
+ palette_pointer Palette102, 7, 0 ; $66
+ palette_pointer Palette103, 7, 0 ; $67
+ palette_pointer Palette104, 7, 0 ; $68
+ palette_pointer Palette105, 7, 0 ; $69
+ palette_pointer Palette106, 7, 0 ; $6a
+ palette_pointer Palette107, 7, 0 ; $6b
+ palette_pointer Palette108, 0, 1 ; $6c
+ palette_pointer Palette109, 0, 1 ; $6d
+ palette_pointer Palette110, 0, 0 ; $6e
+ palette_pointer Palette111, 8, 1 ; $6f
+ palette_pointer Palette112, 8, 1 ; $70
+ palette_pointer Palette113, 8, 1 ; $71
+ palette_pointer Palette114, 4, 2 ; $72
+ palette_pointer Palette115, 4, 2 ; $73
+ palette_pointer Palette116, 4, 2 ; $74
+ palette_pointer Palette117, 1, 0 ; $75
+ palette_pointer Palette118, 6, 0 ; $76
+ palette_pointer Palette119, 1, 0 ; $77
+ palette_pointer Palette120, 1, 0 ; $78
+ palette_pointer Palette121, 1, 0 ; $79
+ palette_pointer Palette122, 1, 0 ; $7a
+ palette_pointer Palette123, 1, 0 ; $7b
+ palette_pointer Palette124, 1, 0 ; $7c
+ palette_pointer Palette125, 1, 0 ; $7d
+ palette_pointer Palette126, 1, 0 ; $7e
+ palette_pointer Palette127, 1, 0 ; $7f
+ palette_pointer Palette128, 1, 0 ; $80
+ palette_pointer Palette129, 1, 0 ; $81
+ palette_pointer Palette130, 1, 0 ; $82
+ palette_pointer Palette131, 1, 0 ; $83
+ palette_pointer Palette132, 1, 0 ; $84
+ palette_pointer Palette133, 1, 0 ; $85
+ palette_pointer Palette134, 1, 0 ; $86
+ palette_pointer Palette135, 1, 0 ; $87
+ palette_pointer Palette136, 1, 0 ; $88
+ palette_pointer Palette137, 1, 0 ; $89
+ palette_pointer Palette138, 1, 0 ; $8a
+ palette_pointer Palette139, 1, 0 ; $8b
+ palette_pointer Palette140, 1, 0 ; $8c
+ palette_pointer Palette141, 1, 0 ; $8d
+ palette_pointer Palette142, 1, 0 ; $8e
+ palette_pointer Palette143, 1, 0 ; $8f
+ palette_pointer Palette144, 1, 0 ; $90
+ palette_pointer Palette145, 1, 0 ; $91
+ palette_pointer Palette146, 1, 0 ; $92
+ palette_pointer Palette147, 1, 0 ; $93
+ palette_pointer Palette148, 1, 0 ; $94
+ palette_pointer Palette149, 1, 0 ; $95
+ palette_pointer Palette150, 1, 0 ; $96
+ palette_pointer Palette151, 1, 0 ; $97
+ palette_pointer Palette152, 1, 0 ; $98
+ palette_pointer Palette153, 1, 0 ; $99
+ palette_pointer Palette154, 1, 0 ; $9a
+ palette_pointer Palette155, 1, 0 ; $9b
+ palette_pointer Palette156, 1, 0 ; $9c
+ palette_pointer Palette157, 1, 0 ; $9d
+ palette_pointer Palette158, 1, 0 ; $9e
+ palette_pointer Palette159, 1, 0 ; $9f
+ palette_pointer Palette160, 1, 0 ; $a0
+
+ INCROM $8191b, $83c4c
+
+AnimData1:: ; 83c4c (20:7c4c)
+ frame_table AnimFrameTable0
+ frame_data 3, 16, 0, 0
+ frame_data 4, 16, 0, 0
+ frame_data 0, 0, 0, 0
+
+Palette110:: ; 83c5b (20:7c5b)
+ db $00, $00
+
+ INCROM $83c5d, $84000
diff --git a/src/engine/home.asm b/src/engine/home.asm
index 9649f69..18a79f4 100644
--- a/src/engine/home.asm
+++ b/src/engine/home.asm
@@ -10739,7 +10739,8 @@ GetPermissionByteOfMapPosition: ; 3946 (0:3946)
pop bc
ret
-Func_395a: ; 395a (0:395a)
+; copy c bytes of data from hl in bank wTempPointerBank to de, b times.
+CopyGfxDataFromTempBank: ; 395a (0:395a)
ldh a, [hBankROM]
push af
ld a, [wTempPointerBank]
@@ -11072,7 +11073,6 @@ Func_3b21: ; 3b21 (0:3b21)
ld a, BANK(Func_1c8bc)
call BankswitchROM
call Func_1c8bc
-
pop af
call BankswitchROM
ret
@@ -11115,32 +11115,39 @@ CheckAnyAnimationPlaying: ; 3b52 (0:3b52)
pop hl
ret
+; input:
+; - a = animation index
Func_3b6a: ; 3b6a (0:3b6a)
ld [wTempAnimation], a ; hold an animation temporarily
ldh a, [hBankROM]
push af
ld [wd4be], a
+
push hl
push bc
push de
- ld a, $07
+ ld a, BANK(Func_1ca31)
call BankswitchROM
ld a, [wTempAnimation]
cp $61
jr nc, .asm_3b90
+
ld hl, wd4ad
ld a, [wd4ac]
cp [hl]
jr nz, .asm_3b90
call CheckAnyAnimationPlaying
jr nc, .asm_3b95
+
.asm_3b90
- call $4a31
- jr .asm_3b9a
+ call Func_1ca31
+ jr .done
+
.asm_3b95
- call $48ef
- jr .asm_3b9a
-.asm_3b9a
+ call Func_1c8ef
+ jr .done
+
+.done
pop de
pop bc
pop hl
@@ -11151,9 +11158,9 @@ Func_3b6a: ; 3b6a (0:3b6a)
Func_3ba2: ; 3ba2 (0:3ba2)
ldh a, [hBankROM]
push af
- ld a, $07
+ ld a, BANK(Func_1cac5)
call BankswitchROM
- call $4ac5
+ call Func_1cac5
call Func_3cb4
pop af
call BankswitchROM
@@ -11348,6 +11355,7 @@ WaitForSongToFinish: ; 3c96 (0:3c96)
Func_3ca0: ; 3ca0 (0:3ca0)
xor a
ld [wd5d7], a
+ ; fallthrough
Func_3ca4: ; 3ca4 (0:3ca4)
ldh a, [hBankROM]
@@ -11470,7 +11478,7 @@ DrawSpriteAnimationFrame: ; 3cc4 (0:3cc4)
and (1 << OAM_X_FLIP) | (1 << OAM_Y_FLIP) | (1 << OAM_PRIORITY)
or b
ld b, a
- inc hl
+ inc hl ; unnecessary
call SetOneObjectAttributes
.endCurrentIteration
pop hl
@@ -11507,6 +11515,7 @@ GetAnimationFramePointer: ; 3d72 (0:3d72)
ld a, [wTempPointerBank]
call BankswitchROM
ld a, [hli]
+
push af
ld a, [wd4ca]
rlca
@@ -11518,6 +11527,7 @@ GetAnimationFramePointer: ; 3d72 (0:3d72)
adc 0
ld d, a
pop af
+
.loadPointer
add BANK(SpriteNullAnimationPointer)
pop hl
@@ -11535,6 +11545,8 @@ GetAnimationFramePointer: ; 3d72 (0:3d72)
call BankswitchROM
ret
+; return hl pointing to the start of a sprite in wSpriteAnimBuffer.
+; the sprite is identified by its index in wWhichSprite.
GetFirstSpriteAnimBufferProperty: ; 3db7 (0:3db7)
push bc
ld c, SPRITE_ANIM_ENABLED