diff options
Diffstat (limited to 'src/engine')
-rw-r--r-- | src/engine/bank01.asm | 408 | ||||
-rwxr-xr-x | src/engine/bank03.asm | 11 | ||||
-rw-r--r-- | src/engine/bank04.asm | 167 | ||||
-rw-r--r-- | src/engine/bank06.asm | 47 | ||||
-rw-r--r-- | src/engine/bank07.asm | 1529 | ||||
-rw-r--r-- | src/engine/bank20.asm | 930 | ||||
-rw-r--r-- | src/engine/home.asm | 34 |
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 |