From 9b663e0dbdcc54bc3c7f1d011b15422938b6729c Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Thu, 17 Apr 2025 17:30:07 +0100 Subject: [PATCH 1/2] Disassemble animation engine --- src/constants/animation_constants.asm | 99 +- src/constants/attack_animation_constants.asm | 1 + src/constants/coin_constants.asm | 44 +- src/constants/duel_constants.asm | 1 + src/constants/sprite_anim_constants.asm | 21 + src/constants/tileset_constants.asm | 2 +- src/engine/bank01.asm | 55 +- src/engine/bank04.asm | 31 +- src/engine/bank06.asm | 2181 +++++++++++++++++- src/engine/bank07.asm | 1372 ++++++++++- src/engine/bank09.asm | 240 +- src/engine/bank1a.asm | 60 + src/home/duel.asm | 12 +- src/home/unsorted.asm | 169 +- src/macros.asm | 1 + src/macros/animations.asm | 38 + src/macros/constants.asm | 8 + src/wram.asm | 139 +- 18 files changed, 4178 insertions(+), 296 deletions(-) create mode 100644 src/macros/animations.asm diff --git a/src/constants/animation_constants.asm b/src/constants/animation_constants.asm index 33b18f8..e3f2507 100644 --- a/src/constants/animation_constants.asm +++ b/src/constants/animation_constants.asm @@ -1,3 +1,9 @@ +; Animation duel screen constants (see wDuelAnimationScreen) + const_def + const DUEL_ANIM_SCREEN_MAIN_SCENE + const DUEL_ANIM_SCREEN_PLAYER_PLAY_AREA + const DUEL_ANIM_SCREEN_OPP_PLAY_AREA + const_def ; Normal animations const DUEL_ANIM_NONE ; $00 @@ -97,11 +103,92 @@ const DUEL_ANIM_DUEL_LOSS ; $5e const DUEL_ANIM_DUEL_DRAW ; $5f const DUEL_ANIM_UNUSED_60 ; $60 + const DUEL_ANIM_61 ; $61 + const DUEL_ANIM_62 ; $62 + const DUEL_ANIM_63 ; $63 + const DUEL_ANIM_64 ; $64 + const DUEL_ANIM_65 ; $65 + const DUEL_ANIM_66 ; $66 + const DUEL_ANIM_67 ; $67 + const DUEL_ANIM_68 ; $68 + const DUEL_ANIM_69 ; $69 + const DUEL_ANIM_6A ; $6a + const DUEL_ANIM_6B ; $6b + const DUEL_ANIM_6C ; $6c + const DUEL_ANIM_6D ; $6d + const DUEL_ANIM_6E ; $6e + const DUEL_ANIM_6F ; $6f + const DUEL_ANIM_70 ; $70 + const DUEL_ANIM_71 ; $71 + const DUEL_ANIM_72 ; $72 + const DUEL_ANIM_73 ; $73 + const DUEL_ANIM_74 ; $74 + const DUEL_ANIM_75 ; $75 + const DUEL_ANIM_76 ; $76 + const DUEL_ANIM_77 ; $77 + const DUEL_ANIM_78 ; $78 + const DUEL_ANIM_79 ; $79 + const DUEL_ANIM_7A ; $7a + const DUEL_ANIM_7B ; $7b + const DUEL_ANIM_7C ; $7c + const DUEL_ANIM_7D ; $7d + const DUEL_ANIM_7E ; $7e + const DUEL_ANIM_7F ; $7f + const DUEL_ANIM_80 ; $80 + const DUEL_ANIM_81 ; $81 + const DUEL_ANIM_82 ; $82 + const DUEL_ANIM_83 ; $83 + const DUEL_ANIM_84 ; $84 + const DUEL_ANIM_85 ; $85 + const DUEL_ANIM_86 ; $86 -DEF NUM_REGULAR_DUEL_ANIMS EQU const_value + ; screen animations +DEF DUEL_SCREEN_ANIMS EQU const_value + const DUEL_ANIM_SMALL_SHAKE_X ; $87 + const DUEL_ANIM_BIG_SHAKE_X ; $88 + const DUEL_ANIM_SMALL_SHAKE_Y ; $89 + const DUEL_ANIM_BIG_SHAKE_Y ; $8a + const DUEL_ANIM_FLASH ; $8b + const DUEL_ANIM_DISTORT ; $8c -; Animation duel screen constants (see wDuelAnimationScreen) - const_def - const DUEL_ANIM_SCREEN_MAIN_SCENE - const DUEL_ANIM_SCREEN_PLAYER_PLAY_AREA - const DUEL_ANIM_SCREEN_OPP_PLAY_AREA + ; this animation is only played within DUEL_ANIM_SHOW_DAMAGE + const DUEL_ANIM_DAMAGE_HUD ; $8d + + const_def $96 + ; animations passed this point are treated differently +DEF DUEL_SPECIAL_ANIMS EQU const_value + const DUEL_ANIM_SET_SCREEN ; $96 + const DUEL_PRINT_DAMAGE ; $97 + const DUEL_ANIM_UPDATE_HUD ; $98 + const DUEL_ANIM_153_UNUSED ; $99 + const DUEL_ANIM_154_UNUSED ; $9a + const DUEL_ANIM_155_UNUSED ; $9b + const DUEL_ANIM_156_UNUSED ; $9c + const DUEL_ANIM_157_UNUSED ; $9d + const DUEL_ANIM_158_UNUSED ; $9e + + ; Duel Anim Struct constants +RSRESET +DEF DUEL_ANIM_STRUCT_ID RB ; $0 +DEF DUEL_ANIM_STRUCT_SCREEN RB ; $1 +DEF DUEL_ANIM_STRUCT_DUELIST_SIDE RB ; $2 +DEF DUEL_ANIM_STRUCT_LOCATION_PARAM RB ; $3 +DEF DUEL_ANIM_STRUCT_DAMAGE Rw ; $4 +DEF DUEL_ANIM_STRUCT_UNKNOWN_2 RB ; $6 +DEF DUEL_ANIM_STRUCT_BANK RB ; $7 +DEF DUEL_ANIM_STRUCT_SIZE EQU _RS + + ; ow_frame struct constants +RSRESET +DEF OW_FRAME_STRUCT_DURATION RB ; $0 +DEF OW_FRAME_STRUCT_VRAM_TILE_OFFSET RB ; $1 +DEF OW_FRAME_STRUCT_VRAM_BANK RB ; $2 +DEF OW_FRAME_STRUCT_TILESET_BANK RB ; $3 +DEF OW_FRAME_STRUCT_TILESET RW ; $4 +DEF OW_FRAME_STRUCT_TILESET_OFFSET RW ; $6 +DEF OW_FRAME_STRUCT_SIZE EQU _RS + +DEF NUM_OW_FRAMESET_SUBGROUPS EQU 3 + +DEF SET_ANIM_SCREEN_MAIN EQU $1 +DEF SET_ANIM_SCREEN_PLAY_AREA EQU $4 diff --git a/src/constants/attack_animation_constants.asm b/src/constants/attack_animation_constants.asm index a0c2e38..05e1335 100644 --- a/src/constants/attack_animation_constants.asm +++ b/src/constants/attack_animation_constants.asm @@ -257,3 +257,4 @@ const ATK_ANIM_SURPRISE_THUNDER ; $fc const ATK_ANIM_PUSH_ASIDE ; $fd const ATK_ANIM_BONE_HEADBUTT ; $fe + const ATK_ANIM_FF ; $ff diff --git a/src/constants/coin_constants.asm b/src/constants/coin_constants.asm index a298b56..0eb2929 100644 --- a/src/constants/coin_constants.asm +++ b/src/constants/coin_constants.asm @@ -1,26 +1,26 @@ const_def - const COIN_CHANSEY ; $00 - const COIN_GR ; $01 - const COIN_ODDISH ; $02 + const COIN_CHANSEY ; $00 + const COIN_GR ; $01 + const COIN_ODDISH ; $02 const COIN_CHARMANDER ; $03 - const COIN_STARMIE ; $04 - const COIN_PIKACHU ; $05 - const COIN_ALAKAZAM ; $06 - const COIN_KABUTO ; $07 - const COIN_MAGNEMITE ; $08 - const COIN_GOLBAT ; $09 - const COIN_MAGMAR ; $0a - const COIN_PSYDUCK ; $0b - const COIN_MACHAMP ; $0c - const COIN_MEW ; $0d - const COIN_SNORLAX ; $0e - const COIN_TOGEPI ; $0f - const COIN_PONYTA ; $10 - const COIN_HORSEA ; $11 - const COIN_ARBOK ; $12 + const COIN_STARMIE ; $04 + const COIN_PIKACHU ; $05 + const COIN_ALAKAZAM ; $06 + const COIN_KABUTO ; $07 + const COIN_MAGNEMITE ; $08 + const COIN_GOLBAT ; $09 + const COIN_MAGMAR ; $0a + const COIN_PSYDUCK ; $0b + const COIN_MACHAMP ; $0c + const COIN_MEW ; $0d + const COIN_SNORLAX ; $0e + const COIN_TOGEPI ; $0f + const COIN_PONYTA ; $10 + const COIN_HORSEA ; $11 + const COIN_ARBOK ; $12 const COIN_JIGGLYPUFF ; $13 - const COIN_DUGTRIO ; $14 - const COIN_GENGAR ; $15 - const COIN_RAICHU ; $16 - const COIN_LUGIA ; $17 + const COIN_DUGTRIO ; $14 + const COIN_GENGAR ; $15 + const COIN_RAICHU ; $16 + const COIN_LUGIA ; $17 DEF NUM_COINS EQU const_value diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index e9b7d0b..95bb2d0 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -240,6 +240,7 @@ DEF NO_DAMAGE_OR_EFFECT_FLY EQU $03 DEF NO_DAMAGE_OR_EFFECT_TRANSPARENCY EQU $04 DEF NO_DAMAGE_OR_EFFECT_NSHIELD EQU $05 DEF NO_DAMAGE_OR_EFFECT_HIDE EQU $06 +DEF NO_DAMAGE_OR_EFFECT_AURORA_VEIL EQU $07 ; OppAction_* constants (OppActionTable) const_def diff --git a/src/constants/sprite_anim_constants.asm b/src/constants/sprite_anim_constants.asm index 6d9627e..5e4887b 100644 --- a/src/constants/sprite_anim_constants.asm +++ b/src/constants/sprite_anim_constants.asm @@ -595,3 +595,24 @@ DEF SPRITEANIMSTRUCT_DIR_MASK EQU %00001110 const FRAMESET_175 ; $175 const FRAMESET_176 ; $176 const FRAMESET_177 ; $177 + + +; wAnimationDataFlags and wAnimFlags values + const_def + const SPRITE_ANIM_FLAG_X_FLIP_F ; $0 + const SPRITE_ANIM_FLAG_Y_FLIP_F ; $1 + const SPRITE_ANIM_FLAG_CENTERED_F ; $2 + const SPRITE_ANIM_FLAG_3_F ; $3 + const SPRITE_ANIM_FLAG_8x16_F ; $4 + const SPRITE_ANIM_FLAG_X_INVERTED_F ; $5 + const SPRITE_ANIM_FLAG_Y_INVERTED_F ; $6 + const SPRITE_ANIM_FLAG_UNSKIPPABLE_F ; $7 + +DEF SPRITE_ANIM_FLAG_X_FLIP EQU 1 << SPRITE_ANIM_FLAG_X_FLIP_F +DEF SPRITE_ANIM_FLAG_Y_FLIP EQU 1 << SPRITE_ANIM_FLAG_Y_FLIP_F +DEF SPRITE_ANIM_FLAG_CENTERED EQU 1 << SPRITE_ANIM_FLAG_CENTERED_F +DEF SPRITE_ANIM_FLAG_3 EQU 1 << SPRITE_ANIM_FLAG_3_F +DEF SPRITE_ANIM_FLAG_8x16 EQU 1 << SPRITE_ANIM_FLAG_8x16_F +DEF SPRITE_ANIM_FLAG_X_INVERTED EQU 1 << SPRITE_ANIM_FLAG_X_INVERTED_F +DEF SPRITE_ANIM_FLAG_Y_INVERTED EQU 1 << SPRITE_ANIM_FLAG_Y_INVERTED_F +DEF SPRITE_ANIM_FLAG_UNSKIPPABLE EQU 1 << SPRITE_ANIM_FLAG_UNSKIPPABLE_F diff --git a/src/constants/tileset_constants.asm b/src/constants/tileset_constants.asm index f167b0a..2a44677 100644 --- a/src/constants/tileset_constants.asm +++ b/src/constants/tileset_constants.asm @@ -421,7 +421,7 @@ const TILESET_DARK_SONG ; $1a3 const TILESET_CARD ; $1a4 const TILESET_TCG1_PIKACHU_COIN ; $1a5 - const TILESET_DUEL_RESULT ; $1a6 + const TILESET_DUEL_RESULT ; $1a6 const TILESET_SMALL_COINS ; $1a7 const TILESET_CHANSEY_COIN ; $1a8 const TILESET_ODDISH_COIN ; $1a9 diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 25465e3..cf72651 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -43,12 +43,14 @@ StartDuel_VSAIOpp: ld a, DUELIST_TYPE_PLAYER ld [wPlayerDuelistType], a ld [wOpponentDuelistType], a - ld a, $17 - ld [wcc18], a + + ld a, COIN_LUGIA + ld [wOppCoin], a ld a, $06 ld [wcc15], a - xor a - ld [wcc19], a + xor a ; COIN_CHANSEY + ld [wPlayerCoin], a + ld a, NUM_NPC_IDS call Random ld [wOpponentNPCID], a @@ -5325,7 +5327,7 @@ ProcessPlayedPokemonCard: ret .TriggerPkmnPower: - farcall Func_18a14 + farcall ResetAttackAnimationIsPlaying ld a, EFFECTCMDTYPE_PKMN_POWER_TRIGGER call TryExecuteEffectCommandFunction ret @@ -6043,7 +6045,7 @@ InitVariablesToBeginDuel: ld [wPlayerAttackingAttackIndex], a ld a, [wdc08] - ld [wcc19], a + ld [wPlayerCoin], a call Func_6838 ld b, MAX_PLAY_AREA_POKEMON @@ -6087,7 +6089,7 @@ InitVariablesToBeginTurn: ld [wcc1b], a ldh a, [hWhoseTurn] ld [wWhoseTurn], a - farcall Func_18a14 + farcall ResetAttackAnimationIsPlaying ret ; make all Pokemon in the turn holder's play area able to evolve. called from the @@ -6422,7 +6424,7 @@ Func_6986: ld a, EFFECTCMDTYPE_PKMN_POWER_TRIGGER call CheckMatchingCommand ret c - farcall Func_18a14 + farcall ResetAttackAnimationIsPlaying ld a, EFFECTCMDTYPE_PKMN_POWER_TRIGGER call TryExecuteEffectCommandFunction ret @@ -7465,7 +7467,42 @@ CheckHaunterTransparency: or a ret -SECTION "Bank 1@70b3", ROMX[$70b3], BANK[$1] +; return carry and return the appropriate text id in hl if the target has an +; special status or power that prevents any damage or effect done to it this turn +; input: a = NO_DAMAGE_OR_EFFECT_* +CheckNoDamageOrEffect:: + ld a, [wNoDamageOrEffect] + or a + ret z + bit 7, a + jr nz, .dont_print_text ; already been here so don't repeat the text + ld hl, wNoDamageOrEffect + set 7, [hl] + dec a + add a + ld e, a + ld d, $0 + ld hl, NoDamageOrEffectTextIDTable + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + scf + ret + +.dont_print_text + ld hl, NULL + scf + ret + +NoDamageOrEffectTextIDTable:: + tx Text015b ; NoDamageOrEffectDueToAgilityText ; NO_DAMAGE_OR_EFFECT_AGILITY + tx Text015a ; NoDamageOrEffectDueToBarrierText ; NO_DAMAGE_OR_EFFECT_BARRIER + tx Text0159 ; NoDamageOrEffectDueToFlyText ; NO_DAMAGE_OR_EFFECT_FLY + tx Text015f ; NoDamageOrEffectDueToTransparencyText ; NO_DAMAGE_OR_EFFECT_TRANSPARENCY + tx Text015e ; NoDamageOrEffectDueToNShieldText ; NO_DAMAGE_OR_EFFECT_NSHIELD + tx Text015c ; NoDamageOrEffectDueToHideText ; NO_DAMAGE_OR_EFFECT_HIDE + tx Text01c9 ; NoDamageOrEffectDueToAuroraVeilText ; NO_DAMAGE_OR_EFFECT_AURORA_VEIL CheckIsIncapableOfUsingPkmnPower_ArenaCard: xor a ; PLAY_AREA_ARENA diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm index 3c0ae54..54c9a1a 100644 --- a/src/engine/bank04.asm +++ b/src/engine/bank04.asm @@ -833,9 +833,11 @@ ClearSpriteAnims: pop bc pop af ret -; 0x10908 -SECTION "Bank 4@490e", ROMX[$490e], BANK[$4] +Func_10908: + ld c, $00 + call LoadGfxPalettes + ret GetNextInactiveSpriteAnim:: push af @@ -898,7 +900,15 @@ SetNewSpriteAnimValues:: pop af ret -SECTION "Bank 4@4991", ROMX[$4991], BANK[$4] +SECTION "Bank 4@4989", ROMX[$4989], BANK[$4] + +Func_10989: + ld [wd96f], a + ret + +Func_1098d: + ld [wd970], a + ret MoveSpriteAnim: push af @@ -1154,9 +1164,6 @@ SetSpriteAnimMotion: pop bc pop af ret -; 0x10a83 - -SECTION "Bank 4@4a83", ROMX[$4a83], BANK[$4] Func_10a83: push af @@ -1204,9 +1211,10 @@ Func_10aa8: pop hl pop af ret -; 0x10ab7 -SECTION "Bank 4@4ab9", ROMX[$4ab9], BANK[$4] +Func_10ab7: + ld a, [hl] + ret Func_10ab9: res SPRITEANIMSTRUCT_FLAG6_F, [hl] ; SPRITEANIMSTRUCT_FLAGS @@ -1421,9 +1429,10 @@ Func_10b9c: pop bc pop af ret -; 0x10bc4 -SECTION "Bank 4@4bc8", ROMX[$4bc8], BANK[$4] +Func_10bc4: + ld hl, wSpriteAnimationStructs + ret SetSpriteAnimAnimating: set SPRITEANIMSTRUCT_ANIMATING_F, [hl] ; SPRITEANIMSTRUCT_FLAGS @@ -4951,6 +4960,6 @@ Func_13dfa: farcall InitFadePalettes call Func_3f61 farcall Func_1dfb9 - farcall Func_1e419 + farcall EnableAnimations ret ; 0x13e27 diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm index bc13d76..3f0ca20 100644 --- a/src/engine/bank06.asm +++ b/src/engine/bank06.asm @@ -5,12 +5,2187 @@ INCLUDE "engine/glossary.asm" SECTION "Bank 6@4a14", ROMX[$4a14], BANK[$6] -Func_18a14:: - xor a - ld [wd0d3], a +ResetAttackAnimationIsPlaying:: + xor a ; FALSE + ld [wAttackAnimationIsPlaying], a ret ; 0x18a19 +SECTION "Bank 6@4ab1", ROMX[$4ab1], BANK[$6] + +; if [wLoadedAttackAnimation] != 0, wait until the animation is over +WaitAttackAnimation:: + ld a, [wLoadedAttackAnimation] + or a + ret z + push de +.anim_loop + call DoFrame + call CheckAnyAnimationPlaying + jr c, .anim_loop + pop de + ret + +; play attack animation +; input: +; - [wLoadedAttackAnimation]: animation to play +; - de: damage dealt by the attack (to display the animation with the number) +; - b: PLAY_AREA_* location, if applicable +; - c: a wDamageEffectiveness constant (to print WEAK or RESIST if necessary) +PlayAttackAnimation:: + ldh a, [hWhoseTurn] + push af + push hl + push de + push bc + ld a, [wWhoseTurn] + ldh [hWhoseTurn], a + ld a, c + ld [wDamageAnimEffectiveness], a + ldh a, [hWhoseTurn] + cp h + jr z, .got_location + ; on the non-turn duelist's side + set 7, b +.got_location + ld a, b + ld [wDamageAnimPlayAreaLocation], a + ld a, [wWhoseTurn] + ld [wDamageAnimPlayAreaSide], a + ld hl, wDamageAnimAmount + ld [hl], e + inc hl + ld [hl], d + +; if damage >= 70, ATK_ANIM_HIT becomes ATK_ANIM_BIG_HIT + ld a, [wLoadedAttackAnimation] + cp ATK_ANIM_HIT + jr nz, .got_anim + ld a, e + cp 70 + jr c, .got_anim + ld a, ATK_ANIM_BIG_HIT + ld [wLoadedAttackAnimation], a + +.got_anim + call PlayAttackAnimationCommands + pop bc + pop de + pop hl + pop af + ldh [hWhoseTurn], a + ret + +; reads the animation commands from PointerTable_AttackAnimation +; of attack in wLoadedAttackAnimation and plays them +PlayAttackAnimationCommands: + ld a, [wLoadedAttackAnimation] + or a + ret z + + ld l, a + ld h, 0 + add hl, hl + ld de, PointerTable_AttackAnimation + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + + push de + ld hl, wAttackAnimationIsPlaying + ld a, [hl] + or a + jr nz, .read_command + ld [hl], TRUE ; wAttackAnimationIsPlaying + call ResetAnimationQueue + pop de + push de + ld a, DUEL_ANIM_SCREEN_MAIN_SCENE + ld [wDuelAnimationScreen], a + ld a, SET_ANIM_SCREEN_MAIN + ld [wDuelAnimSetScreen], a + xor a + ld [wDuelAnimLocationParam], a + ld a, [de] + cp ANIMCMD_SET_SCREEN + jr z, .read_command + ld a, DUEL_ANIM_SET_SCREEN + call PlayDuelAnimation +.read_command + pop de + ; fallthrough + +PlayAttackAnimationCommands_NextCommand: + ld a, [de] + inc de + ld hl, AnimationCommandPointerTable + jp JumpToFunctionInTable + +AnimationCommand_AnimEnd: + ret + +AnimationCommand_AnimPlayer: + xor a + ld [wDuelAnimLocationParam], a + ldh a, [hWhoseTurn] + ld [wDuelAnimDuelistSide], a + ld a, [wDuelType] + cp $00 + jr nz, AnimationCommand_AnimNormal + ld a, PLAYER_TURN + ld [wDuelAnimDuelistSide], a + jr AnimationCommand_AnimNormal + +AnimationCommand_AnimOpponent: + xor a + ld [wDuelAnimLocationParam], a + call SwapTurn + ldh a, [hWhoseTurn] + ld [wDuelAnimDuelistSide], a + call SwapTurn + ld a, [wDuelType] + cp $00 + jr nz, AnimationCommand_AnimNormal + ld a, OPPONENT_TURN + ld [wDuelAnimDuelistSide], a + jr AnimationCommand_AnimNormal + +AnimationCommand_AnimPlayArea: + ld a, [wDamageAnimPlayAreaLocation] + and $7f + ld [wDuelAnimLocationParam], a + jr AnimationCommand_AnimNormal + +AnimationCommand_AnimEnd2: + ret + +AnimationCommand_AnimNormal: + ld a, [de] + inc de + cp DUEL_ANIM_SHOW_DAMAGE + jr z, .show_damage + cp DUEL_ANIM_SMALL_SHAKE_X + jr z, .shake_1 + cp DUEL_ANIM_BIG_SHAKE_X + jr z, .shake_2 + cp DUEL_ANIM_SMALL_SHAKE_Y + jr z, .shake_3 + +.play_anim + call PlayDuelAnimation + jr PlayAttackAnimationCommands_NextCommand + +.show_damage + ld a, DUEL_PRINT_DAMAGE + call PlayDuelAnimation + ld a, [wDamageAnimEffectiveness] + ld [wDuelAnimEffectiveness], a + + push de + ld hl, wDamageAnimAmount + ld de, wDuelAnimDamage + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + pop de + + ld a, DUEL_ANIM_DAMAGE_HUD + call PlayDuelAnimation + ld a, [wDuelDisplayedScreen] + cp DUEL_MAIN_SCENE + jr nz, .skip_update_hud + ld a, DUEL_ANIM_UPDATE_HUD + call PlayDuelAnimation +.skip_update_hud + jp PlayAttackAnimationCommands_NextCommand + +; screen shake happens differently +; depending on whose turn it is +.shake_1 + ld c, DUEL_ANIM_SMALL_SHAKE_X + ld b, DUEL_ANIM_SMALL_SHAKE_Y + jr .check_duelist + +.shake_2 + ld c, DUEL_ANIM_BIG_SHAKE_X + ld b, DUEL_ANIM_BIG_SHAKE_Y + jr .check_duelist + +.shake_3 + ld c, DUEL_ANIM_SMALL_SHAKE_Y + ld b, DUEL_ANIM_SMALL_SHAKE_X + +.check_duelist + ldh a, [hWhoseTurn] + cp PLAYER_TURN + ld a, c + jr z, .play_anim + ld a, [wDuelType] + cp $00 + ld a, c + jr z, .play_anim + ld a, b + jr .play_anim + +AnimationCommand_AnimScreen: + ld a, [de] + inc de + ld [wDuelAnimSetScreen], a + ld a, [wDamageAnimPlayAreaLocation] + ld [wDuelAnimLocationParam], a + call UpdateDuelAnimationScreen + ld a, DUEL_ANIM_SET_SCREEN + call PlayDuelAnimation + jp PlayAttackAnimationCommands_NextCommand + +AnimationCommandPointerTable: + dw AnimationCommand_AnimEnd ; ANIMCMD_END + dw AnimationCommand_AnimNormal ; ANIMCMD_NORMAL + dw AnimationCommand_AnimPlayer ; ANIMCMD_PLAYER_SIDE + dw AnimationCommand_AnimOpponent ; ANIMCMD_OPP_SIDE + dw AnimationCommand_AnimScreen ; ANIMCMD_SET_SCREEN + dw AnimationCommand_AnimPlayArea ; ANIMCMD_PLAY_AREA + dw AnimationCommand_AnimEnd2 ; ANIMCMD_END_UNUSED + +; sets wDuelAnimationScreen according to wDuelAnimSetScreen +; if SET_ANIM_SCREEN_MAIN, set it to Main Scene +; if SET_ANIM_SCREEN_PLAY_AREA, set it to Play Area scene +UpdateDuelAnimationScreen: + ld a, [wDuelAnimSetScreen] + cp SET_ANIM_SCREEN_PLAY_AREA + jr z, .set_play_area_screen + cp SET_ANIM_SCREEN_MAIN + ret nz + ld a, DUEL_ANIM_SCREEN_MAIN_SCENE + ld [wDuelAnimationScreen], a + ret + +.set_play_area_screen + ld a, [wDuelAnimLocationParam] + ld l, a + ld a, [wWhoseTurn] + ld h, a + cp PLAYER_TURN + jr z, .players_turn + +; opponent's turn + ld a, [wDuelType] + cp $00 + jr z, .asm_50c6 +; link duel or vs. AI + bit 7, l + jr z, .asm_50e2 + jr .asm_50d2 +.asm_50c6 + bit 7, l + jr z, .asm_50da + jr .asm_50ea + +.players_turn + bit 7, l + jr z, .asm_50d2 + jr .asm_50e2 + +.asm_50d2 + ld l, UNKNOWN_SCREEN_4 + ld h, PLAYER_TURN + ld a, DUEL_ANIM_SCREEN_PLAYER_PLAY_AREA + jr .ok +.asm_50da + ld l, UNKNOWN_SCREEN_4 + ld h, OPPONENT_TURN + ld a, DUEL_ANIM_SCREEN_PLAYER_PLAY_AREA + jr .ok +.asm_50e2 + ld l, UNKNOWN_SCREEN_5 + ld h, OPPONENT_TURN + ld a, DUEL_ANIM_SCREEN_OPP_PLAY_AREA + jr .ok +.asm_50ea + ld l, UNKNOWN_SCREEN_5 + ld h, PLAYER_TURN + ld a, DUEL_ANIM_SCREEN_OPP_PLAY_AREA + +.ok + ld [wDuelAnimationScreen], a + ret + +SetScreenForDuelAnimation:: + ld a, [wDuelAnimSetScreen] + cp SET_ANIM_SCREEN_PLAY_AREA + jr z, .set_play_area_screen + cp SET_ANIM_SCREEN_MAIN + jr nz, .done +; set duel main screen + ld a, DUEL_ANIM_SCREEN_MAIN_SCENE + ld [wDuelAnimationScreen], a + ld a, [wDuelDisplayedScreen] + cp DUEL_MAIN_SCENE + jr z, .done + bank1call DrawDuelMainScene +.done + ret + +.set_play_area_screen + call UpdateDuelAnimationScreen + + ld a, [wDuelDisplayedScreen] + cp l + jr z, .skip_change_screen + ld a, l + push af + ld l, PLAYER_TURN + ld a, [wDuelType] + cp $00 + jr nz, .asm_5127 + ld a, [wWhoseTurn] + ld l, a +.asm_5127 + call DrawYourOrOppPlayAreaScreen_Bank0 + pop af + ld [wDuelDisplayedScreen], a +.skip_change_screen + call DrawWideTextBox + ret + +; prints text related to the damage received +; by card stored in wTempNonTurnDuelistCardID +; takes into account type effectiveness +PrintDamageText:: + push hl + push bc + push de + ld a, [wLoadedAttackAnimation] + cp ATK_ANIM_HEAL + jr z, .skip + cp ATK_ANIM_HEALING_WIND_PLAY_AREA + jr z, .skip + + ld hl, wTempNonTurnDuelistCardID + ld e, [hl] + inc hl + ld d, [hl] + call LoadCardDataToBuffer1_FromCardID + ld a, 18 + call CopyCardNameAndLevel + ld [hl], TX_END + ld hl, wTxRam2 + xor a + ld [hli], a + ld [hl], a + ld hl, wDamageAnimAmount + ld a, [hli] + ld h, [hl] + ld l, a + call GetDamageText + ld a, l + or h + call nz, DrawWideTextBox_PrintText +.skip + pop de + pop bc + pop hl + ret + +; returns in hl the text id associated with +; the damage in hl and its effectiveness +GetDamageText: + ld a, l + or h + jr z, .no_damage + call LoadTxRam3 + ld a, [wDamageAnimEffectiveness] + ldtx hl, Text003b ; AttackDamageText + and (1 << RESISTANCE) | (1 << WEAKNESS) + ret z ; not weak or resistant + ldtx hl, Text0039 ; WeaknessMoreDamage2Text + cp (1 << RESISTANCE) | (1 << WEAKNESS) + ret z ; weak and resistant + and (1 << WEAKNESS) + ldtx hl, Text0038 ; WeaknessMoreDamageText + ret nz ; weak + ldtx hl, Text0037 ; ResistanceLessDamageText + ret ; resistant + +.no_damage + bank1call CheckNoDamageOrEffect + ret c + ldtx hl, Text003c ; NoDamageText + ld a, [wDamageAnimEffectiveness] + and (1 << RESISTANCE) + ret z ; not resistant + ldtx hl, Text003a ; ResistanceNoDamageText + ret ; resistant + +UpdateMainSceneHUD:: + bank1call DrawDuelHUDs + ret + +DuelAnim153:: +DuelAnim154:: +DuelAnim155:: +DuelAnim156:: +DuelAnim157:: + ret + +PointerTable_AttackAnimation: + dw NULL ; ATK_ANIM_NONE + dw AttackAnimation_Hit ; ATK_ANIM_HIT + dw AttackAnimation_BigHit ; ATK_ANIM_BIG_HIT + dw AttackAnimation_Earthquake ; ATK_ANIM_EARTHQUAKE + dw AttackAnimation_HitRecoil ; ATK_ANIM_HIT_RECOIL + dw AttackAnimation_HitEffect ; ATK_ANIM_HIT_EFFECT + dw AttackAnimation_Thundershock ; ATK_ANIM_THUNDERSHOCK + dw AttackAnimation_Thunder ; ATK_ANIM_THUNDER + dw AttackAnimation_Thunderbolt ; ATK_ANIM_THUNDERBOLT + dw AttackAnimation_ThundershockCopy ; ATK_ANIM_THUNDERSHOCK_COPY + dw AttackAnimation_ThunderWholeScreen ; ATK_ANIM_THUNDER_WHOLE_SCREEN + dw AttackAnimation_Unused0B ; ATK_ANIM_UNUSED_0B + dw AttackAnimation_Thunderstorm ; ATK_ANIM_THUNDERSTORM + dw AttackAnimation_ChainLightning ; ATK_ANIM_CHAIN_LIGHTNING + dw AttackAnimation_SmallFlame ; ATK_ANIM_SMALL_FLAME + dw AttackAnimation_BigFlame ; ATK_ANIM_BIG_FLAME + dw AttackAnimation_FireSpin ; ATK_ANIM_FIRE_SPIN + dw AttackAnimation_DiveBomb ; ATK_ANIM_DIVE_BOMB + dw AttackAnimation_WaterJets ; ATK_ANIM_WATER_JETS + dw AttackAnimation_WaterGun ; ATK_ANIM_WATER_GUN + dw AttackAnimation_Whirlpool ; ATK_ANIM_WHIRLPOOL + dw AttackAnimation_DragonRage ; ATK_ANIM_DRAGON_RAGE + dw AttackAnimation_HydroPump ; ATK_ANIM_HYDRO_PUMP + dw AttackAnimation_Aeroblast ; ATK_ANIM_AEROBLAST + dw AttackAnimation_Blizzard ; ATK_ANIM_BLIZZARD + dw AttackAnimation_PsychicHit ; ATK_ANIM_PSYCHIC_HIT + dw AttackAnimation_Nightmare ; ATK_ANIM_NIGHTMARE + dw AttackAnimation_Psyshock ; ATK_ANIM_PSYSHOCK + dw AttackAnimation_DarkMind ; ATK_ANIM_DARK_MIND + dw AttackAnimation_Beam ; ATK_ANIM_BEAM + dw AttackAnimation_HyperBeam ; ATK_ANIM_HYPER_BEAM + dw AttackAnimation_IceBeam ; ATK_ANIM_ICE_BEAM + dw AttackAnimation_Avalanche ; ATK_ANIM_AVALANCHE + dw AttackAnimation_StoneBarrage ; ATK_ANIM_STONE_BARRAGE + dw AttackAnimation_Punch ; ATK_ANIM_PUNCH + dw AttackAnimation_Thunderpunch ; ATK_ANIM_THUNDERPUNCH + dw AttackAnimation_FirePunch ; ATK_ANIM_FIRE_PUNCH + dw AttackAnimation_StretchKick ; ATK_ANIM_STRETCH_KICK + dw AttackAnimation_Slash ; ATK_ANIM_SLASH + dw AttackAnimation_Whip ; ATK_ANIM_WHIP + dw AttackAnimation_Tear ; ATK_ANIM_TEAR + dw AttackAnimation_MultipleSlash ; ATK_ANIM_MULTIPLE_SLASH + dw AttackAnimation_Unused2A ; ATK_ANIM_UNUSED_2A + dw AttackAnimation_Rampage ; ATK_ANIM_RAMPAGE + dw AttackAnimation_Drill ; ATK_ANIM_DRILL + dw AttackAnimation_PotSmash ; ATK_ANIM_POT_SMASH + dw AttackAnimation_Bonemerang ; ATK_ANIM_BONEMERANG + dw AttackAnimation_SeismicToss ; ATK_ANIM_SEISMIC_TOSS + dw AttackAnimation_Needles ; ATK_ANIM_NEEDLES + dw AttackAnimation_PoisonNeedle ; ATK_ANIM_POISON_NEEDLE + dw AttackAnimation_Smog ; ATK_ANIM_SMOG + dw AttackAnimation_PoisonGas ; ATK_ANIM_POISON_GAS + dw AttackAnimation_Unused34 ; ATK_ANIM_UNUSED_34 + dw AttackAnimation_FoulGas ; ATK_ANIM_FOUL_GAS + dw AttackAnimation_FoulOdor ; ATK_ANIM_FOUL_ODOR + dw AttackAnimation_PowderEffectChance ; ATK_ANIM_POWDER_EFFECT_CHANCE + dw AttackAnimation_PowderHitPoison ; ATK_ANIM_POWDER_HIT_POISON + dw AttackAnimation_PoisonPowder ; ATK_ANIM_POISON_POWDER + dw AttackAnimation_Unused3A ; ATK_ANIM_UNUSED_3A + dw AttackAnimation_StunSpore ; ATK_ANIM_STUN_SPORE + dw AttackAnimation_Poisonpowder ; ATK_ANIM_POISONPOWDER + dw AttackAnimation_Goo ; ATK_ANIM_GOO + dw AttackAnimation_Unused3E ; ATK_ANIM_UNUSED_3E + dw AttackAnimation_SpitPoison ; ATK_ANIM_SPIT_POISON + dw AttackAnimation_StickyHands ; ATK_ANIM_STICKY_HANDS + dw AttackAnimation_Bubbles ; ATK_ANIM_BUBBLES + dw AttackAnimation_BubblesCopy ; ATK_ANIM_BUBBLES_COPY + dw AttackAnimation_StringShot ; ATK_ANIM_STRING_SHOT + dw AttackAnimation_Unused44 ; ATK_ANIM_UNUSED_44 + dw AttackAnimation_Boyfriends ; ATK_ANIM_BOYFRIENDS + dw AttackAnimation_Lure ; ATK_ANIM_LURE + dw AttackAnimation_Toxic ; ATK_ANIM_TOXIC + dw AttackAnimation_ConfuseRay ; ATK_ANIM_CONFUSE_RAY + dw AttackAnimation_Unused49 ; ATK_ANIM_UNUSED_49 + dw AttackAnimation_Sing ; ATK_ANIM_SING + dw AttackAnimation_Lullaby ; ATK_ANIM_LULLABY + dw AttackAnimation_Supersonic ; ATK_ANIM_SUPERSONIC + dw AttackAnimation_SupersonicCopy ; ATK_ANIM_SUPERSONIC_COPY + dw AttackAnimation_PetalDance ; ATK_ANIM_PETAL_DANCE + dw AttackAnimation_Protect ; ATK_ANIM_PROTECT + dw AttackAnimation_Barrier ; ATK_ANIM_BARRIER + dw AttackAnimation_QuickAttack ; ATK_ANIM_QUICK_ATTACK + dw AttackAnimation_AgilityProtect ; ATK_ANIM_AGILITY_PROTECT + dw AttackAnimation_Whirlwind ; ATK_ANIM_WHIRLWIND + dw AttackAnimation_Cry ; ATK_ANIM_CRY + dw AttackAnimation_Amnesia ; ATK_ANIM_AMNESIA + dw AttackAnimation_Selfdestruct ; ATK_ANIM_SELFDESTRUCT + dw AttackAnimation_BigSelfdestruction ; ATK_ANIM_BIG_SELFDESTRUCTION + dw AttackAnimation_Recover ; ATK_ANIM_RECOVER + dw AttackAnimation_Drain ; ATK_ANIM_DRAIN + dw AttackAnimation_DarkGas ; ATK_ANIM_DARK_GAS + dw AttackAnimation_GlowEffect ; ATK_ANIM_GLOW_EFFECT + dw AttackAnimation_MirrorMove ; ATK_ANIM_MIRROR_MOVE + dw AttackAnimation_DevolutionBeam ; ATK_ANIM_DEVOLUTION_BEAM + dw AttackAnimation_PkmnPower1 ; ATK_ANIM_PKMN_POWER_1 + dw AttackAnimation_Firegiver ; ATK_ANIM_FIREGIVER + dw AttackAnimation_Quickfreeze ; ATK_ANIM_QUICKFREEZE + dw AttackAnimation_PealOfThunder ; ATK_ANIM_PEAL_OF_THUNDER + dw AttackAnimation_HealingWind ; ATK_ANIM_HEALING_WIND + dw AttackAnimation_WhirlwindZigzag ; ATK_ANIM_WHIRLWIND_ZIGZAG + dw AttackAnimation_BigThunder ; ATK_ANIM_BIG_THUNDER + dw AttackAnimation_SolarPower ; ATK_ANIM_SOLAR_POWER + dw AttackAnimation_PoisonFang ; ATK_ANIM_POISON_FANG + dw AttackAnimation_Unused67 ; ATK_ANIM_UNUSED_67 + dw AttackAnimation_Unused68 ; ATK_ANIM_UNUSED_68 + dw AttackAnimation_Unused69 ; ATK_ANIM_UNUSED_69 + dw AttackAnimation_FriendshipSong ; ATK_ANIM_FRIENDSHIP_SONG + dw AttackAnimation_Scrunch ; ATK_ANIM_SCRUNCH + dw AttackAnimation_CatPunch ; ATK_ANIM_CAT_PUNCH + dw AttackAnimation_MagneticStorm ; ATK_ANIM_MAGNETIC_STORM + dw AttackAnimation_PoisonWhip ; ATK_ANIM_POISON_WHIP + dw AttackAnimation_ThunderWave ; ATK_ANIM_THUNDER_WAVE + dw AttackAnimation_Unused70 ; ATK_ANIM_UNUSED_70 + dw AttackAnimation_Spore ; ATK_ANIM_SPORE + dw AttackAnimation_Hypnosis ; ATK_ANIM_HYPNOSIS + dw AttackAnimation_EnergyConversion ; ATK_ANIM_ENERGY_CONVERSION + dw AttackAnimation_Leer ; ATK_ANIM_LEER + dw AttackAnimation_ConfusionHit ; ATK_ANIM_CONFUSION_HIT + dw AttackAnimation_Unused76 ; ATK_ANIM_UNUSED_76 + dw AttackAnimation_Unused77 ; ATK_ANIM_UNUSED_77 + dw AttackAnimation_BenchHit ; ATK_ANIM_BENCH_HIT + dw AttackAnimation_Heal ; ATK_ANIM_HEAL + dw AttackAnimation_RecoilHit ; ATK_ANIM_RECOIL_HIT + dw AttackAnimation_Poison ; ATK_ANIM_POISON + dw AttackAnimation_Confusion ; ATK_ANIM_CONFUSION + dw AttackAnimation_Paralysis ; ATK_ANIM_PARALYSIS + dw AttackAnimation_Sleep ; ATK_ANIM_SLEEP + dw AttackAnimation_ImakuniConfusion ; ATK_ANIM_IMAKUNI_CONFUSION + dw AttackAnimation_SleepingGas ; ATK_ANIM_SLEEPING_GAS + dw AttackAnimation_Unused81 ; ATK_ANIM_UNUSED_81 + dw AttackAnimation_ThunderPlayArea ; ATK_ANIM_THUNDER_PLAY_AREA + dw AttackAnimation_CatPunchPlayArea ; ATK_ANIM_CAT_PUNCH_PLAY_AREA + dw AttackAnimation_FiregiverPlayer ; ATK_ANIM_FIREGIVER_PLAYER + dw AttackAnimation_FiregiverOpp ; ATK_ANIM_FIREGIVER_OPP + dw AttackAnimation_HealingWindPlayArea ; ATK_ANIM_HEALING_WIND_PLAY_AREA + dw AttackAnimation_Gale ; ATK_ANIM_GALE + dw AttackAnimation_Expand ; ATK_ANIM_EXPAND + dw AttackAnimation_Unused89 ; ATK_ANIM_UNUSED_89 + dw AttackAnimation_FullHeal ; ATK_ANIM_FULL_HEAL + dw AttackAnimation_Unused8B ; ATK_ANIM_UNUSED_8B + dw AttackAnimation_SpitPoisonSuccess ; ATK_ANIM_SPIT_POISON_SUCCESS + dw AttackAnimation_GustOfWind ; ATK_ANIM_GUST_OF_WIND + dw AttackAnimation_HealBothSides ; ATK_ANIM_HEAL_BOTH_SIDES + dw AttackAnimation_Unused8F ; ATK_ANIM_UNUSED_8F + dw AttackAnimation_Unused90 ; ATK_ANIM_UNUSED_90 + dw AttackAnimation_Unused91 ; ATK_ANIM_UNUSED_91 + dw AttackAnimation_Unused92 ; ATK_ANIM_UNUSED_92 + dw AttackAnimation_Unused93 ; ATK_ANIM_UNUSED_93 + dw AttackAnimation_Unused94 ; ATK_ANIM_UNUSED_94 + dw AttackAnimation_Unused95 ; ATK_ANIM_UNUSED_95 + dw AttackAnimation_Unused96 ; ATK_ANIM_UNUSED_96 + dw AttackAnimation_SneakAttack ; ATK_ANIM_SNEAK_ATTACK + dw AttackAnimation_Unused98 ; ATK_ANIM_UNUSED_98 + dw AttackAnimation_Unused99 ; ATK_ANIM_UNUSED_99 + dw AttackAnimation_LightningFlash ; ATK_ANIM_LIGHTNING_FLASH + dw AttackAnimation_Unused9B ; ATK_ANIM_UNUSED_9B + dw AttackAnimation_Unused9C ; ATK_ANIM_UNUSED_9C + dw AttackAnimation_Unused9D ; ATK_ANIM_UNUSED_9D + dw AttackAnimation_Fireball ; ATK_ANIM_FIREBALL + dw AttackAnimation_ContinuousFireball ; ATK_ANIM_CONTINUOUS_FIREBALL + dw AttackAnimation_FlamePillar ; ATK_ANIM_FLAME_PILLAR + dw AttackAnimation_WaterBomb ; ATK_ANIM_WATER_BOMB + dw AttackAnimation_UnusedA2 ; ATK_ANIM_UNUSED_A2 + dw AttackAnimation_UnusedA3 ; ATK_ANIM_UNUSED_A3 + dw AttackAnimation_UnusedA4 ; ATK_ANIM_UNUSED_A4 + dw AttackAnimation_BenchManipulation ; ATK_ANIM_BENCH_MANIPULATION + dw AttackAnimation_Blink ; ATK_ANIM_BLINK + dw AttackAnimation_UnusedA7 ; ATK_ANIM_UNUSED_A7 + dw AttackAnimation_UnusedA8 ; ATK_ANIM_UNUSED_A8 + dw AttackAnimation_Psybeam ; ATK_ANIM_PSYBEAM + dw AttackAnimation_UnusedAA ; ATK_ANIM_UNUSED_AA + dw AttackAnimation_UnusedAB ; ATK_ANIM_UNUSED_AB + dw AttackAnimation_AuroraWave ; ATK_ANIM_AURORA_WAVE + dw AttackAnimation_UnusedAD ; ATK_ANIM_UNUSED_AD + dw AttackAnimation_RockThrow ; ATK_ANIM_ROCK_THROW + dw AttackAnimation_BoulderSmash ; ATK_ANIM_BOULDER_SMASH + dw AttackAnimation_MegaPunch ; ATK_ANIM_MEGA_PUNCH + dw AttackAnimation_Psypunch ; ATK_ANIM_PSYPUNCH + dw AttackAnimation_SludgePunch ; ATK_ANIM_SLUDGE_PUNCH + dw AttackAnimation_UnusedB3 ; ATK_ANIM_UNUSED_B3 + dw AttackAnimation_UnusedB4 ; ATK_ANIM_UNUSED_B4 + dw AttackAnimation_IcePunch ; ATK_ANIM_ICE_PUNCH + dw AttackAnimation_LegSweep ; ATK_ANIM_LEG_SWEEP + dw AttackAnimation_UnusedB7 ; ATK_ANIM_UNUSED_B7 + dw AttackAnimation_SparkingKick ; ATK_ANIM_SPARKING_KICK + dw AttackAnimation_UnusedB9 ; ATK_ANIM_UNUSED_B9 + dw AttackAnimation_PollenStench ; ATK_ANIM_POLLEN_STENCH + dw AttackAnimation_UnusedBB ; ATK_ANIM_UNUSED_BB + dw AttackAnimation_UnusedBC ; ATK_ANIM_UNUSED_BC + dw AttackAnimation_UnusedBD ; ATK_ANIM_UNUSED_BD + dw AttackAnimation_PoisonVapor ; ATK_ANIM_POISON_VAPOR + dw AttackAnimation_PoisonGasCopy ; ATK_ANIM_POISON_GAS_COPY + dw AttackAnimation_EerieLight ; ATK_ANIM_EERIE_LIGHT + dw AttackAnimation_Spookify ; ATK_ANIM_SPOOKIFY + dw AttackAnimation_MassExplosion ; ATK_ANIM_MASS_EXPLOSION + dw AttackAnimation_GasExplosion ; ATK_ANIM_GAS_EXPLOSION + dw AttackAnimation_UnusedC4 ; ATK_ANIM_UNUSED_C4 + dw AttackAnimation_UnusedC5 ; ATK_ANIM_UNUSED_C5 + dw AttackAnimation_Lick ; ATK_ANIM_LICK + dw AttackAnimation_UnusedC7 ; ATK_ANIM_UNUSED_C7 + dw AttackAnimation_TailSlap ; ATK_ANIM_TAIL_SLAP + dw AttackAnimation_TailWhip ; ATK_ANIM_TAIL_WHIP + dw AttackAnimation_UnusedCA ; ATK_ANIM_UNUSED_CA + dw AttackAnimation_Slap ; ATK_ANIM_SLAP + dw AttackAnimation_UnusedCC ; ATK_ANIM_UNUSED_CC + dw AttackAnimation_RocketTackle ; ATK_ANIM_ROCKET_TACKLE + dw AttackAnimation_Stare ; ATK_ANIM_STARE + dw AttackAnimation_UnusedCF ; ATK_ANIM_UNUSED_CF + dw AttackAnimation_CoinHurl ; ATK_ANIM_COIN_HURL + dw AttackAnimation_UnusedD1 ; ATK_ANIM_UNUSED_D1 + dw AttackAnimation_Teleport ; ATK_ANIM_TELEPORT + dw AttackAnimation_TeleportBlast ; ATK_ANIM_TELEPORT_BLAST + dw AttackAnimation_FollowMe ; ATK_ANIM_FOLLOW_ME + dw AttackAnimation_ShiningFinger ; ATK_ANIM_SHINING_FINGER + dw AttackAnimation_UnusedD6 ; ATK_ANIM_UNUSED_D6 + dw AttackAnimation_SuspiciousSoundwave ; ATK_ANIM_SUSPICIOUS_SOUNDWAVE + dw AttackAnimation_3dAttack ; ATK_ANIM_3D_ATTACK + dw AttackAnimation_UnusedD9 ; ATK_ANIM_UNUSED_D9 + dw AttackAnimation_RollOver ; ATK_ANIM_ROLL_OVER + dw AttackAnimation_Swift ; ATK_ANIM_SWIFT + dw AttackAnimation_UnusedDC ; ATK_ANIM_UNUSED_DC + dw AttackAnimation_UnusedDD ; ATK_ANIM_UNUSED_DD + dw AttackAnimation_ColdBreath ; ATK_ANIM_COLD_BREATH + dw AttackAnimation_DryUp ; ATK_ANIM_DRY_UP + dw AttackAnimation_UnusedE0 ; ATK_ANIM_UNUSED_E0 + dw AttackAnimation_TransDamage ; ATK_ANIM_TRANS_DAMAGE + dw AttackAnimation_FocusBlast ; ATK_ANIM_FOCUS_BLAST + dw AttackAnimation_UnusedE3 ; ATK_ANIM_UNUSED_E3 + dw AttackAnimation_UnusedE4 ; ATK_ANIM_UNUSED_E4 + dw AttackAnimation_FadeToBlack ; ATK_ANIM_FADE_TO_BLACK + dw AttackAnimation_UnusedE8 ; ATK_ANIM_UNUSED_E8 + dw AttackAnimation_PoisonSeed ; ATK_ANIM_POISON_SEED + dw AttackAnimation_Twiddle ; ATK_ANIM_TWIDDLE + dw AttackAnimation_UnusedE9 ; ATK_ANIM_UNUSED_E9 + dw AttackAnimation_BigYawn ; ATK_ANIM_BIG_YAWN + dw AttackAnimation_BigSnore ; ATK_ANIM_BIG_SNORE + dw AttackAnimation_SandVeil ; ATK_ANIM_SAND_VEIL + dw AttackAnimation_UnusedED ; ATK_ANIM_UNUSED_ED + dw AttackAnimation_HelpingHand ; ATK_ANIM_HELPING_HAND + dw AttackAnimation_Rest ; ATK_ANIM_REST + dw AttackAnimation_TerrorStrike ; ATK_ANIM_TERROR_STRIKE + dw AttackAnimation_SkullBash ; ATK_ANIM_SKULL_BASH + dw AttackAnimation_RazorLeaf ; ATK_ANIM_RAZOR_LEAF + dw AttackAnimation_Guillotine ; ATK_ANIM_GUILLOTINE + dw AttackAnimation_VinePull ; ATK_ANIM_VINE_PULL + dw AttackAnimation_FuryStrikes ; ATK_ANIM_FURY_STRIKES + dw AttackAnimation_DrillDive ; ATK_ANIM_DRILL_DIVE + dw AttackAnimation_DarkSong ; ATK_ANIM_DARK_SONG + dw AttackAnimation_UnusedF8 ; ATK_ANIM_UNUSED_F8 + dw AttackAnimation_Perplex ; ATK_ANIM_PERPLEX + dw AttackAnimation_NineTails ; ATK_ANIM_NINE_TAILS + dw AttackAnimation_SpinningShower ; ATK_ANIM_SPINNING_SHOWER + dw AttackAnimation_SurpriseThunder ; ATK_ANIM_SURPRISE_THUNDER + dw AttackAnimation_PushAside ; ATK_ANIM_PUSH_ASIDE + dw AttackAnimation_BoneHeadbutt ; ATK_ANIM_BONE_HEADBUTT + dw AttackAnimation_UnusedFF ; ATK_ANIM_FF + +AttackAnimation_Hit: +AttackAnimation_Earthquake: +AttackAnimation_HitRecoil: +AttackAnimation_HitEffect: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_BigHit: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_BIG_HIT + anim_normal DUEL_ANIM_BIG_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Thundershock: +AttackAnimation_Thunder: +AttackAnimation_ThundershockCopy: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_THUNDER_SHOCK + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Thunderbolt: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_LIGHTNING + anim_opponent DUEL_ANIM_BORDER_SPARK + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_ThunderWholeScreen: +AttackAnimation_Unused0B: +AttackAnimation_Thunderstorm: +AttackAnimation_ChainLightning: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_FLASH + anim_normal DUEL_ANIM_BIG_LIGHTNING + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_SmallFlame: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_SMALL_FLAME + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_BigFlame: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_BIG_FLAME + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_FireSpin: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_FIRE_SPIN + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_DiveBomb: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_DIVE_BOMB + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_WaterJets: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_WATER_JETS + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_WaterGun: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_WATER_GUN + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Whirlpool: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_WHIRLPOOL + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_DragonRage: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_LIGHTNING + anim_opponent DUEL_ANIM_WATER_GUN + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_HydroPump: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_HYDRO_PUMP + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Aeroblast: +AttackAnimation_Blizzard: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_BLIZZARD + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_PsychicHit: +AttackAnimation_Nightmare: +AttackAnimation_Psyshock: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_PSYCHIC + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_DarkMind: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_LEER + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Beam: +AttackAnimation_IceBeam: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_BEAM + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_HyperBeam: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_HYPER_BEAM + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Avalanche: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_ROCK_THROW + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_StoneBarrage: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_STONE_BARRAGE + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Punch: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_PUNCH + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Thunderpunch: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_THUNDERPUNCH + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_FirePunch: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_FIRE_PUNCH + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_StretchKick: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_STRETCH_KICK + anim_end + +AttackAnimation_Slash: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_SLASH + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Whip: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_WHIP + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Tear: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_SONICBOOM + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_MultipleSlash: +AttackAnimation_Unused2A: +AttackAnimation_Rampage: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_FURY_SWIPES + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Drill: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_DRILL + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_PotSmash: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_POT_SMASH + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Bonemerang: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_BONEMERANG + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_SeismicToss: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_SEISMIC_TOSS + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Needles: +AttackAnimation_PoisonNeedle: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_NEEDLES + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Smog: +AttackAnimation_PoisonGas: +AttackAnimation_Unused34: +AttackAnimation_FoulGas: +AttackAnimation_FoulOdor: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_WHITE_GAS + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_PowderEffectChance: +AttackAnimation_PowderHitPoison: +AttackAnimation_Unused3A: +AttackAnimation_StunSpore: +AttackAnimation_Poisonpowder: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_POWDER + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_PoisonPowder: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_POWDER + anim_end + +AttackAnimation_Goo: +AttackAnimation_Unused3E: +AttackAnimation_StickyHands: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_GOO + anim_normal DUEL_ANIM_DISTORT + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_SpitPoison: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_GOO + anim_normal DUEL_ANIM_DISTORT + anim_end + +AttackAnimation_Bubbles: +AttackAnimation_BubblesCopy: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_BUBBLES + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_StringShot: +AttackAnimation_Unused44: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_STRING_SHOT + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Boyfriends: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_BOYFRIENDS + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Lure: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_LURE + anim_normal DUEL_ANIM_DISTORT + anim_end + +AttackAnimation_Toxic: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_DISTORT + anim_opponent DUEL_ANIM_TOXIC + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_ConfuseRay: +AttackAnimation_Unused49: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_FLASH + anim_opponent DUEL_ANIM_CONFUSE_RAY + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Sing: +AttackAnimation_Lullaby: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_SING + anim_end + +AttackAnimation_Supersonic: +AttackAnimation_SupersonicCopy: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_SUPERSONIC + anim_end + +AttackAnimation_PetalDance: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_PETAL_DANCE + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Protect: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_PROTECT + anim_end + +AttackAnimation_Barrier: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_BARRIER + anim_end + +AttackAnimation_QuickAttack: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_SPEED + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_AgilityProtect: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_SPEED + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_player DUEL_ANIM_PROTECT + anim_end + +AttackAnimation_Whirlwind: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_WHIRLWIND + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Cry: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_CRY + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_end + +AttackAnimation_Amnesia: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_QUESTION_MARK + anim_end + +AttackAnimation_Selfdestruct: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_SELFDESTRUCT + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_BigSelfdestruction: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_BIG_SELFDESTRUCT_1 + anim_normal DUEL_ANIM_FLASH + anim_player DUEL_ANIM_BIG_SELFDESTRUCT_2 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Recover: + anim_player DUEL_ANIM_GLOW + anim_end + +AttackAnimation_Drain: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_DRAIN + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_DarkGas: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_DARK_GAS + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_opponent DUEL_ANIM_QUESTION_MARK + anim_end + +AttackAnimation_GlowEffect: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_FLASH + anim_end + +AttackAnimation_MirrorMove: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_FLASH + anim_opponent DUEL_ANIM_GLOW + anim_end + +AttackAnimation_DevolutionBeam: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_FLASH + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_BENCH_GLOW + anim_end + +AttackAnimation_PkmnPower1: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_BENCH_GLOW + anim_normal DUEL_ANIM_FLASH + anim_end + +AttackAnimation_Firegiver: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_BENCH_GLOW + anim_normal DUEL_ANIM_FLASH + anim_play_area DUEL_ANIM_FIREGIVER_START + anim_play_area DUEL_ANIM_FIREGIVER_START + anim_end + +AttackAnimation_Quickfreeze: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_BENCH_GLOW + anim_normal DUEL_ANIM_QUICKFREEZE + anim_screen DUEL_ANIM_GLOW + anim_end + +AttackAnimation_PealOfThunder: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_BENCH_GLOW + anim_play_area DUEL_ANIM_BENCH_THUNDER + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_HealingWind: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_BENCH_GLOW + anim_play_area DUEL_ANIM_HEALING_WIND + anim_end + +AttackAnimation_WhirlwindZigzag: + anim_player DUEL_ANIM_GLOW + anim_screen DUEL_ANIM_CONFUSION + anim_normal DUEL_ANIM_BENCH_WHIRLWIND + anim_end + +AttackAnimation_BigThunder: + anim_player DUEL_ANIM_GLOW + anim_end + +AttackAnimation_SolarPower: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_FLASH + anim_end + +AttackAnimation_PoisonFang: +AttackAnimation_Unused67: +AttackAnimation_Unused68: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Unused69: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_NEEDLES + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_FriendshipSong: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_SING + anim_end + +AttackAnimation_Scrunch: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_EXPAND + anim_end + +AttackAnimation_CatPunch: + anim_player DUEL_ANIM_GLOW + anim_end + +AttackAnimation_MagneticStorm: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_THUNDER_WAVE + anim_end + +AttackAnimation_PoisonWhip: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_WHIP + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_ThunderWave: +AttackAnimation_Unused70: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_THUNDER_WAVE + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Spore: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_POWDER + anim_end + +AttackAnimation_Hypnosis: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_PSYCHIC + anim_end + +AttackAnimation_EnergyConversion: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_FLASH + anim_end + +AttackAnimation_Leer: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_LEER + anim_opponent DUEL_ANIM_QUESTION_MARK + anim_end + +AttackAnimation_ConfusionHit: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_CONFUSION + anim_player DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_Y + anim_player DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Unused76: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_WATER_JETS + anim_end + +AttackAnimation_Unused77: + anim_end + +AttackAnimation_BenchHit: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_SINGLE_HIT + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Heal: + anim_player DUEL_ANIM_HEAL + anim_player DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_RecoilHit: + anim_screen DUEL_ANIM_GLOW + anim_player DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_Y + anim_player DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Poison: + anim_screen DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_POISON + anim_end + +AttackAnimation_Confusion: + anim_screen DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_CONFUSION + anim_end + +AttackAnimation_Paralysis: + anim_screen DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_PARALYSIS + anim_end + +AttackAnimation_Sleep: + anim_screen DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_SLEEP + anim_end + +AttackAnimation_ImakuniConfusion: + anim_screen DUEL_ANIM_GLOW + anim_player DUEL_ANIM_CONFUSION + anim_end + +AttackAnimation_SleepingGas: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_WHITE_GAS + anim_end + +AttackAnimation_Unused81: + anim_opponent DUEL_ANIM_QUESTION_MARK + anim_end + +AttackAnimation_ThunderPlayArea: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_BENCH_THUNDER + anim_play_area DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_CatPunchPlayArea: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_CAT_PUNCH + anim_play_area DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_FiregiverPlayer: + anim_screen DUEL_ANIM_CONFUSION + anim_normal DUEL_ANIM_FIREGIVER_PLAYER + anim_end + +AttackAnimation_FiregiverOpp: + anim_screen DUEL_ANIM_CONFUSION + anim_normal DUEL_ANIM_FIREGIVER_OPP + anim_end + +AttackAnimation_HealingWindPlayArea: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Gale: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_WHIRLWIND + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_normal DUEL_ANIM_FLASH + anim_end + +AttackAnimation_Expand: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_EXPAND + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Unused89: + anim_player DUEL_ANIM_POISON + anim_player DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_FullHeal: + anim_player DUEL_ANIM_HEAL + anim_normal DUEL_ANIM_UPDATE_HUD + anim_end + +AttackAnimation_Unused8B: + anim_player DUEL_ANIM_SLEEP + anim_normal DUEL_ANIM_UPDATE_HUD + anim_end + +AttackAnimation_SpitPoisonSuccess: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_GOO + anim_normal DUEL_ANIM_DISTORT + anim_end + +AttackAnimation_GustOfWind: + anim_opponent DUEL_ANIM_WHIRLWIND + anim_end + +AttackAnimation_HealBothSides: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_BENCH_GLOW + anim_screen DUEL_ANIM_GLOW + anim_player DUEL_ANIM_HEAL + anim_opponent DUEL_ANIM_HEAL + anim_end + +AttackAnimation_Unused8F: + anim_screen DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Unused90: + anim_screen DUEL_ANIM_GLOW + anim_player DUEL_ANIM_SLEEP + anim_end + +AttackAnimation_Unused91: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_SINGLE_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_play_area DUEL_ANIM_72 + anim_end + +AttackAnimation_Unused92: + anim_screen DUEL_ANIM_GLOW + anim_player DUEL_ANIM_POISON + anim_end + +AttackAnimation_Unused93: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_THUNDER_WAVE + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_SINGLE_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Unused94: +AttackAnimation_Unused95: +AttackAnimation_Unused96: + anim_end + +AttackAnimation_SneakAttack: +AttackAnimation_Unused98: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_SINGLE_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE +AttackAnimation_Unused99: + anim_end + +AttackAnimation_LightningFlash: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_THUNDER_SHOCK + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_opponent DUEL_ANIM_QUESTION_MARK + anim_end + +AttackAnimation_Unused9B: + anim_player DUEL_ANIM_GLOW + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_BENCH_THUNDER + anim_play_area DUEL_ANIM_SINGLE_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Unused9C: +AttackAnimation_Unused9D: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_LIGHTNING + anim_opponent DUEL_ANIM_BORDER_SPARK + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Fireball: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_64 + anim_opponent DUEL_ANIM_BIG_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_ContinuousFireball: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_65 + anim_opponent DUEL_ANIM_BIG_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_FlamePillar: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_SMALL_FLAME + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_WaterBomb: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_HYDRO_PUMP + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedA2: + anim_opponent DUEL_ANIM_PSYCHIC + anim_end + +AttackAnimation_UnusedA3: + anim_player DUEL_ANIM_PSYCHIC + anim_end + +AttackAnimation_UnusedA4: + anim_end + +AttackAnimation_BenchManipulation: + anim_player DUEL_ANIM_GLOW + anim_screen DUEL_ANIM_CONFUSION + anim_normal DUEL_ANIM_66 + anim_play_area DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Blink: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_BEAM + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_player DUEL_ANIM_PROTECT + anim_end + +AttackAnimation_UnusedA7: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_PSYCHIC + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedA8: + anim_player DUEL_ANIM_GLOW + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_66 + anim_play_area DUEL_ANIM_SINGLE_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Psybeam: +AttackAnimation_AuroraWave: +AttackAnimation_UnusedAD: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_67 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedAA: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_BENCH_GLOW + anim_screen DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_67 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedAB: + anim_player DUEL_ANIM_GLOW + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_68 + anim_play_area DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_RockThrow: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_69 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_BoulderSmash: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_69 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_MegaPunch: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_6A + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Psypunch: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_6B + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_SludgePunch: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_6C + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedB3: + anim_screen DUEL_ANIM_GLOW + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_69 + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedB4: +AttackAnimation_IcePunch: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_6D + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_LegSweep: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_6E + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedB7: +AttackAnimation_SparkingKick: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_6E + anim_opponent DUEL_ANIM_BORDER_SPARK + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedB9: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_6E + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_PollenStench: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_POWDER + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_end + +AttackAnimation_UnusedBB: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_BENCH_GLOW + anim_screen DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_POWDER + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_end + +AttackAnimation_UnusedBC: + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_BENCH_GLOW + anim_screen DUEL_ANIM_GLOW + anim_player DUEL_ANIM_POWDER + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_end + +AttackAnimation_UnusedBD: + anim_end + +AttackAnimation_PoisonVapor: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_WHITE_GAS + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_EerieLight: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_FLASH + anim_opponent DUEL_ANIM_CONFUSE_RAY + anim_end + +AttackAnimation_PoisonGasCopy: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_WHITE_GAS + anim_end + +AttackAnimation_Spookify: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_LEER + anim_normal DUEL_ANIM_FLASH + anim_opponent DUEL_ANIM_QUESTION_MARK + anim_end + +AttackAnimation_MassExplosion: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_BIG_SELFDESTRUCT_1 + anim_normal DUEL_ANIM_FLASH + anim_player DUEL_ANIM_BIG_SELFDESTRUCT_2 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_GasExplosion: +AttackAnimation_UnusedC4: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_SELFDESTRUCT + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedC5: +AttackAnimation_Lick: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_GOO + anim_normal DUEL_ANIM_DISTORT + anim_end + +AttackAnimation_UnusedC7: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_GOO + anim_normal DUEL_ANIM_DISTORT + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_player DUEL_ANIM_QUESTION_MARK + anim_end + +AttackAnimation_TailSlap: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_6F + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_TailWhip: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_70 + anim_normal DUEL_ANIM_DISTORT + anim_opponent DUEL_ANIM_QUESTION_MARK + anim_end + +AttackAnimation_UnusedCA: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_70 + anim_end + +AttackAnimation_Slap: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_71 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedCC: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_73 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_RocketTackle: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_73 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_player DUEL_ANIM_PROTECT + anim_end + +AttackAnimation_Stare: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_LEER + anim_normal DUEL_ANIM_FLASH + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_opponent DUEL_ANIM_QUESTION_MARK + anim_end + +AttackAnimation_UnusedCF: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_LEER + anim_normal DUEL_ANIM_FLASH + anim_end + +AttackAnimation_CoinHurl: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_74 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedD1: + anim_player DUEL_ANIM_GLOW + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_7D + anim_play_area DUEL_ANIM_SINGLE_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Teleport: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_75 + anim_end + +AttackAnimation_TeleportBlast: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_PSYCHIC + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_player DUEL_ANIM_75 + anim_end + +AttackAnimation_FollowMe: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_76 + anim_end + +AttackAnimation_ShiningFinger: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_76 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedD6: +AttackAnimation_SuspiciousSoundwave: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_SUPERSONIC + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_3dAttack: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_78 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedD9: +AttackAnimation_RollOver: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Swift: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_77 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedDC: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_THUNDER_WAVE + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_SINGLE_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedDD: +AttackAnimation_ColdBreath: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_QUICKFREEZE + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_DryUp: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_79 + anim_end + +AttackAnimation_UnusedE0: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_SPEED + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_TransDamage: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_DRAIN + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_FocusBlast: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_7A + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedE3: + anim_player DUEL_ANIM_GLOW + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_7B + anim_play_area DUEL_ANIM_SINGLE_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedE4: +AttackAnimation_FadeToBlack: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_DARK_GAS + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedE8: + anim_player DUEL_ANIM_GLOW + anim_screen DUEL_ANIM_CONFUSION + anim_play_area DUEL_ANIM_7C + anim_play_area DUEL_ANIM_SINGLE_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_play_area DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_PoisonSeed: +AttackAnimation_Twiddle: + anim_end + +AttackAnimation_UnusedE9: +AttackAnimation_BigYawn: + anim_player DUEL_ANIM_GLOW + anim_end + +AttackAnimation_BigSnore: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_SLEEP + anim_opponent DUEL_ANIM_7E + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_SandVeil: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_PROTECT + anim_end + +AttackAnimation_UnusedED: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_SMALL_SHAKE_Y + anim_player DUEL_ANIM_QUESTION_MARK + anim_end + +AttackAnimation_HelpingHand: + anim_player DUEL_ANIM_HEAL + anim_end + +AttackAnimation_Rest: + anim_player DUEL_ANIM_GLOW + anim_end + +AttackAnimation_TerrorStrike: + anim_player DUEL_ANIM_GLOW + anim_player DUEL_ANIM_LEER + anim_normal DUEL_ANIM_FLASH + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_SkullBash: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_73 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_RazorLeaf: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_7F + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_Guillotine: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_80 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_VinePull: + anim_opponent DUEL_ANIM_81 + anim_end + +AttackAnimation_FuryStrikes: + anim_end + +AttackAnimation_DrillDive: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_85 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_DarkSong: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_86 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedF8: + anim_end + +AttackAnimation_Perplex: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_82 + anim_end + +AttackAnimation_NineTails: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_83 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_SpinningShower: + anim_player DUEL_ANIM_GLOW + anim_screen DUEL_ANIM_CONFUSION + anim_normal DUEL_ANIM_WATER_JETS + anim_end + +AttackAnimation_SurpriseThunder: + anim_player DUEL_ANIM_GLOW + anim_normal DUEL_ANIM_FLASH + anim_normal DUEL_ANIM_BIG_LIGHTNING + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_PushAside: + anim_player DUEL_ANIM_GLOW + anim_screen DUEL_ANIM_CONFUSION + anim_normal DUEL_ANIM_HEALING_WIND + anim_play_area DUEL_ANIM_SINGLE_HIT + anim_end + +AttackAnimation_BoneHeadbutt: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_84 + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_end + +AttackAnimation_UnusedFF: + anim_player DUEL_ANIM_GLOW + anim_opponent DUEL_ANIM_BONEMERANG + anim_opponent DUEL_ANIM_HIT + anim_normal DUEL_ANIM_SMALL_SHAKE_X + anim_opponent DUEL_ANIM_SHOW_DAMAGE + anim_opponent DUEL_ANIM_QUESTION_MARK + anim_end +; 0x19657 + SECTION "Bank 6@5657", ROMX[$5657], BANK[$6] ; if carry flag is set, only delays diff --git a/src/engine/bank07.asm b/src/engine/bank07.asm index 900328a..a2ff99a 100644 --- a/src/engine/bank07.asm +++ b/src/engine/bank07.asm @@ -24,7 +24,7 @@ PrintNumber: ld c, a push de ld de, wDecimalRepresentation - call .CalculateDecimalDigits + call CalculateDecimalDigits pop de ld a, d add c @@ -56,7 +56,11 @@ PrintNumber: jr nz, .loop_digits ret -.CalculateDecimalDigits: +; hl = 16-bit input value +; de = address to write character bytes +; b = FALSE: left-padded with zeroes +; TRUE: left-padded with empty spaces +CalculateDecimalDigits: push af push bc push de @@ -306,7 +310,7 @@ LoadSavedOptions: ld [wd9d3], a srl a and $01 - ld [wdc0f], a + ld [wAnimationsDisabled], a ret .LoadCoinTossAnimation: @@ -344,7 +348,7 @@ Func_1c3f9: push af srl a and $01 - ld [wdc0f], a + ld [wAnimationsDisabled], a pop af ld c, a ld b, $00 @@ -2142,6 +2146,146 @@ CountEventCoinsObtained: ret ; 0x1d0c2 +SECTION "Bank 7@5198", ROMX[$5198], BANK[$7] + +; input: +; - a = coin to load +; - de = coordinates +Func_1d198: + push af + push bc + push de + push hl + ld c, a + ld b, $00 + sla c + rl b + sla c + rl b + sla c + rl b ; *8 + ld hl, .SpriteAnimGfxParams + add hl, bc + ld c, $00 + cp $28 + jr c, .asm_1d1b7 + ld c, $02 +.asm_1d1b7 + ld b, $07 + ld a, $ff + call CreateSpriteAnim + pop hl + pop de + pop bc + pop af + ret + +.SpriteAnimGfxParams: + dw TILESET_CHANSEY_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $00 + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_143 ; $01 + dw TILESET_ODDISH_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13D ; $02 + dw TILESET_CHARMANDER_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13E ; $03 + dw TILESET_STARMIE_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13F ; $04 + dw TILESET_PIKACHU_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_140 ; $05 + dw TILESET_ALAKAZAM_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_141 ; $06 + dw TILESET_KABUTO_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_142 ; $07 + dw TILESET_GOLBAT_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_144 ; $08 + dw TILESET_MAGNEMITE_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_145 ; $09 + dw TILESET_MAGMAR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_146 ; $0a + dw TILESET_PSYDUCK_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_147 ; $0b + dw TILESET_MACHAMP_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_148 ; $0c + dw TILESET_MEW_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_149 ; $0d + dw TILESET_SNORLAX_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_14A ; $0e + dw TILESET_TOGEPI_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_14B ; $0f + dw TILESET_PONYTA_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_14C ; $10 + dw TILESET_HORSEA_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_14D ; $11 + dw TILESET_ARBOK_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_14E ; $12 + dw TILESET_JIGGLYPUFF_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_14F ; $13 + dw TILESET_DUGTRIO_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_150 ; $14 + dw TILESET_GENGAR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_151 ; $15 + dw TILESET_RAICHU_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_152 ; $16 + dw TILESET_LUGIA_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_153 ; $17 + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $18 + dw TILESET_GR_PIECES, SPRITE_ANIM_AC, FRAMESET_118, PALETTE_143 ; $19 + dw TILESET_GR_PIECES, SPRITE_ANIM_AC, FRAMESET_119, PALETTE_143 ; $1a + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $1b + dw TILESET_GR_PIECES, SPRITE_ANIM_AC, FRAMESET_11A, PALETTE_143 ; $1c + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $1d + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $1e + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $1f + dw TILESET_GR_PIECES, SPRITE_ANIM_AC, FRAMESET_11B, PALETTE_143 ; $20 + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $21 + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $22 + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $23 + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $24 + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $25 + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $26 + dw TILESET_GR_COIN, SPRITE_ANIM_85, FRAMESET_112, PALETTE_13C ; $27 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_120, PALETTE_13B ; $28 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_146, PALETTE_13B ; $29 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_121, PALETTE_13B ; $2a + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_122, PALETTE_13B ; $2b + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_123, PALETTE_13B ; $2c + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_124, PALETTE_13B ; $2d + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_125, PALETTE_13B ; $2e + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_126, PALETTE_13B ; $2f + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_127, PALETTE_13B ; $30 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_128, PALETTE_13B ; $31 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_129, PALETTE_13B ; $32 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_12A, PALETTE_13B ; $33 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_12B, PALETTE_13B ; $34 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_12C, PALETTE_13B ; $35 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_12D, PALETTE_13B ; $36 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_12E, PALETTE_13B ; $37 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_12F, PALETTE_13B ; $38 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_130, PALETTE_13B ; $39 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_131, PALETTE_13B ; $3a + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_132, PALETTE_13B ; $3b + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_133, PALETTE_13B ; $3c + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_134, PALETTE_13B ; $3d + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_135, PALETTE_13B ; $3e + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_136, PALETTE_13B ; $3f + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_137, PALETTE_13B ; $40 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_138, PALETTE_13B ; $41 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_139, PALETTE_13B ; $42 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_13A, PALETTE_13B ; $43 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_13B, PALETTE_13B ; $44 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_13C, PALETTE_13B ; $45 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_13D, PALETTE_13B ; $46 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_13E, PALETTE_13B ; $47 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_13F, PALETTE_13B ; $48 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_140, PALETTE_13B ; $49 + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_141, PALETTE_13B ; $4a + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_142, PALETTE_13B ; $4b + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_143, PALETTE_13B ; $4c + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_144, PALETTE_13B ; $4d + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_145, PALETTE_13B ; $4e + dw TILESET_SMALL_COINS, SPRITE_ANIM_AD, FRAMESET_146, PALETTE_13B ; $4f + +Func_1d443: + push af + push bc + push de + push hl + ld c, a + ld b, $00 + ld hl, FRAMESET_112 + add hl, bc + ld b, h + ld c, l + farcall Func_10bc4 + farcall SetAndInitSpriteAnimFrameset + xor a + farcall SetSpriteAnimFrameIndex + farcall SetSpriteAnimFrameDuration + farcall SetSpriteAnimAnimating + pop hl + pop de + pop bc + pop af + ret +; 0x1d46a + SECTION "Bank 7@5475", ROMX[$5475], BANK[$7] ; a = $0: initializes values for new save @@ -2174,7 +2318,7 @@ Func_1d475: ; was already cleared in InitSaveData farcall ClearCardPopNameList - call Func_1e419 + call EnableAnimations call Func_1e767 farcall Func_111f0 call Func_1c425 @@ -2272,8 +2416,8 @@ SECTION "Bank 7@5cb7", ROMX[$5cb7], BANK[$7] Func_1dcb7: xor a - ld [wdc08 + 0], a - ld [wdc08 + 1], a + ld [wdc08], a + ld [wdc09], a ret ; 0x1dcbf @@ -2289,38 +2433,940 @@ Func_1dfb9:: xor a farcall Func_108c9 xor a - ld [wdc5e + 0], a - ld [wdc5e + 1], a - ld [wdce2], a - ld [wdc59], a - ld [wdce8], a + ld [wDuelAnimBufferSize], a + ld [wDuelAnimBufferCurPos], a + ld [wCurAnimation], a + ld [wNumActiveAnimations], a + ld [wDuelAnimSetScreen], a ld [wDuelAnimLocationParam], a ld [wdcf0], a ld [wdc57], a ld a, $ff - ld [wdcea], a + ld [wActiveScreenAnim], a + + ; clear wDuelAnimBuffer xor a - ld bc, $80 - ld hl, wdc60 + ld bc, wDuelAnimBufferEnd - wDuelAnimBuffer + ld hl, wDuelAnimBuffer call WriteBCBytesToHL + pop hl pop de pop bc pop af ret -; 0x1dff5 + +; appends to end of wDuelAnimBuffer +; the current duel animation +_LoadDuelAnimationToBuffer:: + push af + push bc + push de + push hl + ld a, [wDuelAnimBufferSize] + ld b, a + ld a, [wDuelAnimBufferCurPos] + ld c, a + inc a + and %00001111 + ld e, a + cp b + jr z, .skip + ld a, e + ld [wDuelAnimBufferCurPos], a + + ld b, $00 + sla c + sla c + sla c ; *8 + ld hl, wDuelAnimBuffer + add hl, bc + ld a, [wCurAnimation] + ld [hli], a + ld a, [wDuelAnimationScreen] + ld [hli], a + ld a, [wDuelAnimDuelistSide] + ld [hli], a + ld a, [wDuelAnimLocationParam] + ld [hli], a + ld a, [wDuelAnimDamage + 0] + ld [hli], a + ld a, [wDuelAnimDamage + 1] + ld [hli], a + ld a, [wDuelAnimEffectiveness] + ld [hli], a + ld a, [wDuelAnimReturnBank] + ld [hl], a + +.skip + pop hl + pop de + pop bc + pop af + ret + +; loads the animations from wDuelAnimBuffer +; corresponding to entry in wDuelAnimBufferCurPos +LoadBufferedDuelAnimation: + push af + push bc + push de + push hl + + ; assume no animation + xor a + ld [wCurAnimation], a + + ld a, [wDuelAnimBufferCurPos] + ld b, a + ld a, [wDuelAnimBufferSize] + ld c, a + cp b + jr z, .skip + ld a, c + inc a + and $f + ld [wDuelAnimBufferSize], a + + ld b, $00 + sla c + sla c + sla c ; *8 + ld hl, wDuelAnimBuffer + add hl, bc + ld a, [hli] + ld [wCurAnimation], a + ld a, [hli] + ld [wDuelAnimationScreen], a + ld a, [hli] + ld [wDuelAnimDuelistSide], a + ld a, [hli] + ld [wDuelAnimLocationParam], a + ld a, [hli] + ld [wDuelAnimDamage + 0], a + ld a, [hli] + ld [wDuelAnimDamage + 1], a + ld a, [hli] + ld [wDuelAnimSetScreen], a + ld a, [hl] + ld [wDuelAnimReturnBank], a + +.skip + pop hl + pop de + pop bc + pop af + ret + +Func_1e088:: + push af + push bc + push de + push hl + ld a, [wActiveScreenAnim] + cp $ff + jr z, .update_animations + + ; run screen update function + ld hl, wScreenAnimUpdatePtr + ld a, [hli] + ld h, [hl] + ld l, a + call CallHL2 + jr .done + +.update_animations + call .ClearInactiveAnimations + call .Func_1e0e8 + jr nz, .done + call LoadBufferedDuelAnimation + ld a, [wCurAnimation] + and a + jr z, .done + call .Func_1e0f8 +.done + pop hl + pop de + pop bc + pop af + ret + +.ClearInactiveAnimations: + push af + push bc + push de + push hl + ld c, NUM_SPRITE_ANIM_STRUCTS + farcall Func_10bc4 +.loop_sprite_anims + farcall Func_10ab7 + bit 7, a + jr z, .next_sprite_anim + farcall CheckIsSpriteAnimAnimating + jr nz, .next_sprite_anim + ; clear animation + farcall Func_10b71 + ld a, [wNumActiveAnimations] + dec a + ld [wNumActiveAnimations], a +.next_sprite_anim + push bc + ld bc, SPRITEANIMSTRUCT_LENGTH + add hl, bc + pop bc + dec c + jr nz, .loop_sprite_anims + pop hl + pop de + pop bc + pop af + ret + +.Func_1e0e8: + ld a, [wActiveScreenAnim] + cp $ff + ret nz + ld a, [wdcf0] + and a + ret nz + ld a, [wNumActiveAnimations] + and a + ret + +.Func_1e0f8: + ld a, $01 ; unused + + farcall ClearSpriteAnims + + ld a, [wCurAnimation] + ld [wdc5a], a + cp DUEL_SPECIAL_ANIMS + jr c, .not_special + call Func_3c8e + jr .asm_1e122 +.not_special + cp DUEL_ANIM_DAMAGE_HUD + jr nz, .not_damage_hud + call Func_1e279 + jr .asm_1e122 +.not_damage_hud + cp DUEL_SCREEN_ANIMS + jr c, .not_screen_anim + call InitScreenAnimation + jr .asm_1e122 +.not_screen_anim + call Func_1e171 +.asm_1e122 + ret + +; input: +; - a = DUEL_ANIM_* animation +GetAnimationData: + push af + push bc + push de + push hl + ld c, a + ld b, $00 + ld l, a + ld h, $00 + sla l + rl h + sla l + rl h + sla l + rl h ; *8 + add hl, bc + add hl, bc + add hl, bc ; *11 + ld de, Animations + add hl, de + ld a, [hli] + ld [wAnimationTileset + 0], a + ld a, [hli] + ld [wAnimationTileset + 1], a + ld a, [hli] + ld [wAnimationSpriteAnim + 0], a + ld a, [hli] + ld [wAnimationSpriteAnim + 1], a + ld a, [hli] + ld [wAnimationFrameset + 0], a + ld a, [hli] + ld [wAnimationFrameset + 1], a + ld a, [hli] + ld [wAnimationPalette + 0], a + ld a, [hli] + ld [wAnimationPalette + 1], a + ld a, [hli] + ld [wAnimationDataFlags], a + ld a, [hli] + ld [wAnimationSFX], a + ld a, [hl] + ld [wAnimationUnknownParam], a + pop hl + pop de + pop bc + pop af + ret + +Func_1e171: + push af + push bc + push de + farcall GetNextInactiveSpriteAnim + ld a, [wCurAnimation] + call GetAnimationData + cp DUEL_ANIM_COIN_HEADS + 1 + jr nc, .not_coin_flip_animation + cp DUEL_ANIM_COIN_SPIN + jr c, .not_coin_flip_animation + call PlayCoinAnimation + jr .asm_1e1d7 + +.not_coin_flip_animation + ; load tileset + farcall SetNewSpriteAnimValues + ld a, [wAnimationTileset + 0] + ld c, a + ld a, [wAnimationTileset + 1] + ld b, a + farcall StubSetSpriteAnimValue + farcall LoadSpriteAnimGfx + farcall SetSpriteAnimTileOffset + + ; load sprite animation + ld a, [wAnimationSpriteAnim + 0] + ld c, a + ld a, [wAnimationSpriteAnim + 1] + ld b, a + farcall SetSpriteAnimAnimation + + ; load frameset + ld a, [wAnimationFrameset + 0] + ld c, a + ld a, [wAnimationFrameset + 1] + ld b, a + farcall SetAndInitSpriteAnimFrameset + + ; set object mode (8x8 or 8x16) + ld a, [wAnimationDataFlags] + and SPRITE_ANIM_FLAG_8x16 + jr z, .set_palette + call Set_OBJ_8x16 + +.set_palette + push hl + ld a, [wAnimationPalette + 0] + ld c, a + ld a, [wAnimationPalette + 1] + ld b, a + farcall GetPaletteGfxPointer + farcall Func_10908 + pop hl + +.asm_1e1d7 + push af + push bc + push de + push hl + call FlushAllPalettes + pop hl + pop de + pop bc + pop af + + ld a, [wAnimationDataFlags] + ld [wAnimFlags], a + call GetAnimCoordsAndFlags + ld [wAnimAllowedFlags], a + + ld a, [wAnimationsDisabled] + or a + jr z, .animation_enabled + ; animations are disabled, check if + ; this animation is unskippable + ld a, [wAnimFlags] + and SPRITE_ANIM_FLAG_UNSKIPPABLE + jr nz, .animation_enabled + farcall Func_10b71 + jr .done + +.animation_enabled + ; play animation SFX + ld a, [wAnimationSFX] + and a + jr z, .no_sfx + push af + ld a, a ; lol + call CallPlaySFX + pop af + +.no_sfx + xor a + farcall Func_10989 + farcall Func_1098d + ld a, [wAnimAllowedFlags] + and SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED + farcall Func_10989 + bit SPRITE_ANIM_FLAG_Y_INVERTED_F, a + jr z, .asm_1e234 + push af + ld a, e + add -88 + ld e, a + ld a, [wAnimAllowedFlags] + and SPRITE_ANIM_FLAG_3 + jr z, .asm_1e233 + ld a, e + add 16 + ld e, a +.asm_1e233 + pop af +.asm_1e234 + bit SPRITE_ANIM_FLAG_X_INVERTED_F, a + jr z, .asm_1e23e + push af + ld a, d + add -8 + ld d, a + pop af +.asm_1e23e + and SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP + swap a + sla a + farcall Func_1098d + farcall SetSpriteAnimPosition + ld a, [wNumActiveAnimations] + inc a + ld [wNumActiveAnimations], a +.done + pop de + pop bc + pop af + ret + +PlayCoinAnimation: + ld a, [wDuelAnimDuelistSide] + cp PLAYER_TURN + jr nz, .opps_side + ld a, [wPlayerCoin] + jr .got_coin +.opps_side + ld a, [wOppCoin] +.got_coin + lb de, 80, 80 + call Func_1d198 + ld a, [wCurAnimation] + sub DUEL_ANIM_COIN_SPIN + call Func_1d443 + farcall Func_10bc4 + ret + +Func_1e279: + push af + push bc + push de + push hl + ld a, DUEL_ANIM_SHOW_DAMAGE + ld [wCurAnimation], a + xor a + ld [wdc58], a + call Func_1e2b1 + ld a, [wDuelAnimEffectiveness] + bit 0, a + jr z, .asm_1e293 + call Func_1e30d +.asm_1e293 + ld a, $12 + ld [wdc58], a + ld a, [wDuelAnimEffectiveness] + bit 1, a + jr z, .asm_1e2a2 + call Func_1e324 +.asm_1e2a2 + ld a, [wDuelAnimEffectiveness] + bit 2, a + jr z, .asm_1e2ac + call Func_1e347 +.asm_1e2ac + pop hl + pop de + pop bc + pop af + ret + +Func_1e2b1: + ; check if damage is over 1000 + ld a, [wDuelAnimDamage + 1] + cp HIGH(1000) + jr nz, .not_over_1000 + ld a, [wDuelAnimDamage + 0] + cp LOW(1000) + jr nc, .done + +.not_over_1000 + ld a, [wDuelAnimDamage + 0] + ld l, a + ld a, [wDuelAnimDamage + 1] + ld h, a + ld de, wDecimalRepresentation + ld b, TRUE + call CalculateDecimalDigits + + ld de, wDecimalRepresentation + $4 + ld c, 3 ; number of digits +.loop_digits + ld a, [de] + cp $ff + jr z, .done + push de + push bc + call Func_1e171 + push hl + ld a, [de] + ld c, a + ld b, $00 + ld hl, FRAMESET_008 + add hl, bc + ld b, h + ld c, l + pop hl + farcall SetAndInitSpriteAnimFrameset + farcall GetSpriteAnimPosition + pop bc + push hl + ld b, $00 + ld hl, .digit_offsets + dec c + add hl, bc + inc c + ld a, [hl] + pop hl + add d + ld d, a + farcall SetSpriteAnimPosition + pop de + dec de + dec c + jr nz, .loop_digits +.done + ret + +.digit_offsets + ; ones digit, tens digit, hundred digits + db -16, -8, 0 + +Func_1e30d: + call Func_1e171 + ld bc, FRAMESET_014 + farcall SetAndInitSpriteAnimFrameset + farcall GetSpriteAnimPosition + ld a, d + add 8 + ld d, a + farcall SetSpriteAnimPosition + ret + +Func_1e324: + call Func_1e171 + ld bc, FRAMESET_013 + farcall SetAndInitSpriteAnimFrameset + farcall GetSpriteAnimPosition + ld a, d + add -8 + ld d, a + farcall SetSpriteAnimPosition + ld a, [wdc58] + farcall SetSpriteAnimStartDelay + add $12 + ld [wdc58], a + ret + +Func_1e347: + call Func_1e171 + ld bc, FRAMESET_012 + farcall SetAndInitSpriteAnimFrameset + farcall GetSpriteAnimPosition + ld a, d + add -16 + ld d, a + farcall SetSpriteAnimPosition + ld a, [wdc58] + farcall SetSpriteAnimStartDelay + ret + +; 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 +; - d = x coordinate +; - e = y coordinate +GetAnimCoordsAndFlags: + push bc + push hl + ld c, 0 + ld a, [wAnimFlags] + and SPRITE_ANIM_FLAG_CENTERED + jr nz, .centered + + ld a, [wDuelAnimationScreen] + add a ; 2 * [wDuelAnimationScreen] + ld c, a + add a ; 4 * [wDuelAnimationScreen] + add c ; 6 * [wDuelAnimationScreen] + add a ; 12 * [wDuelAnimationScreen] + ld c, a + + ld a, [wDuelAnimDuelistSide] + cp PLAYER_TURN + jr z, .player_side +; opponent side + ld a, 6 + add c + ld c, a +.player_side + ld a, [wDuelAnimLocationParam] + add c ; a = [wDuelAnimLocationParam] + c + ld c, a + ld b, 0 + ld hl, AnimationCoordinatesIndex + add hl, bc + ld c, [hl] + +.centered + ; if centered and y inverted/flipped + ld a, [wAnimFlags] + cp SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_Y_INVERTED + jr nz, .calc_addr + ld a, [wDuelAnimDuelistSide] + cp PLAYER_TURN + jr z, .calc_addr + ld c, 1 + +.calc_addr + ld a, c + add a ; a = c * 2 + add c ; a = c * 3 + ld c, a + ld b, 0 + ld hl, AnimationCoordinates + add hl, bc + ld d, [hl] ; x coord + inc hl + ld e, [hl] ; y coord + inc hl + ld a, [wAnimFlags] + and [hl] ; flags + pop hl + pop bc + ret + +AnimationCoordinatesIndex: +; animations in the Duel Main Scene + db $02, $02, $02, $02, $02, $02 ; player + db $03, $03, $03, $03, $03, $03 ; opponent + +; animations in the Player's Play Area, for each Play Area Pokemon + db $04, $05, $06, $07, $08, $09 ; player + db $04, $05, $06, $07, $08, $09 ; opponent + +; animations in the Opponent's Play Area, for each Play Area Pokemon + db $0a, $0b, $0c, $0d, $0e, $0f ; player + db $0a, $0b, $0c, $0d, $0e, $0f ; opponent + +AnimationCoordinates: +; x coord, y coord, animation flags + db 88, 88, NONE ; $0 + db 88, 56, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_Y_INVERTED ; $1 + +; animations in the Duel Main Scene + db 40, 80, NONE ; $2 + db 136, 48, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED ; $3 + +; animations in the Player's Play Area, for each Play Area Pokemon + db 88, 72, NONE ; $4 + db 24, 96, NONE ; $5 + db 56, 96, NONE ; $6 + db 88, 96, NONE ; $7 + db 120, 96, NONE ; $8 + db 152, 96, NONE ; $9 + +; animations in the Opponent's Play Area, for each Play Area Pokemon + db 88, 80, $ff ^ (SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_8x16 | SPRITE_ANIM_FLAG_UNSKIPPABLE) ; $a + db 152, 40, $ff ^ (SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_8x16 | SPRITE_ANIM_FLAG_UNSKIPPABLE) ; $b + db 120, 40, $ff ^ (SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_8x16 | SPRITE_ANIM_FLAG_UNSKIPPABLE) ; $c + db 88, 40, $ff ^ (SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_8x16 | SPRITE_ANIM_FLAG_UNSKIPPABLE) ; $d + db 56, 40, $ff ^ (SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_8x16 | SPRITE_ANIM_FLAG_UNSKIPPABLE) ; $e + db 24, 40, $ff ^ (SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_8x16 | SPRITE_ANIM_FLAG_UNSKIPPABLE) ; $f +; 0x1e409 SECTION "Bank 7@6419", ROMX[$6419], BANK[$7] -Func_1e419: +; sets wAnimationsDisabled to FALSE +EnableAnimations: push af - xor a - ld [wdc0f], a + xor a ; FALSe + ld [wAnimationsDisabled], a pop af ret -; 0x1e420 -SECTION "Bank 7@65a2", ROMX[$65a2], BANK[$7] +_CheckAnyAnimationPlaying:: + push bc + ld a, [wDuelAnimBufferSize] + ld b, a + ld a, [wDuelAnimBufferCurPos] + cp b + jr nz, .asm_1e42f + ld a, [wNumActiveAnimations] + and a +.asm_1e42f + pop bc + ret + +; initializes a screen animation from wCurAnimation +; loads a function pointer for updating a frame +; and initializes the duration of the animation. +InitScreenAnimation: + ld a, [wAnimationsDisabled] + and a + jr nz, .skip + push hl + ld hl, wNumActiveAnimations + inc [hl] + pop hl + + ld a, [wCurAnimation] + ld [wActiveScreenAnim], a + sub DUEL_SCREEN_ANIMS + add a + add a + ld c, a + ld b, $00 + ld hl, ScreenAnimationFunctions + add hl, bc + ld a, [hli] + ld [wScreenAnimUpdatePtr], a + ld c, a + ld a, [hli] + ld [wScreenAnimUpdatePtr + 1], a + ld b, a + ld a, [hl] + ld [wScreenAnimDuration], a + call CallBC +.skip + ret + +; for the following animations, these functions +; are run with the corresponding duration. +; this duration decides different effects, +; depending on which function runs +; and is decreased by one each time. +; when it is down to 0, the animation is done. + +MACRO screen_effect + dw \1 ; function pointer + db \2 ; duration + db $00 ; padding +ENDM + +ScreenAnimationFunctions: +; function pointer, duration + screen_effect ShakeScreenX_Small, 24 ; DUEL_ANIM_SMALL_SHAKE_X + screen_effect ShakeScreenX_Big, 32 ; DUEL_ANIM_BIG_SHAKE_X + screen_effect ShakeScreenY_Small, 24 ; DUEL_ANIM_SMALL_SHAKE_Y + screen_effect ShakeScreenY_Big, 32 ; DUEL_ANIM_BIG_SHAKE_Y + screen_effect WhiteFlashScreen, 8 ; DUEL_ANIM_FLASH + screen_effect DistortScreen, 63 ; DUEL_ANIM_DISTORT + +ShakeScreenX_Small: + ld hl, SmallShakeOffsets + jr ShakeScreenX +ShakeScreenX_Big: + ld hl, BigShakeOffsets +ShakeScreenX: + ld a, l + ld [wdcee + 0], a + ld a, h + ld [wdcee + 1], a + ld hl, wScreenAnimUpdatePtr + ld [hl], LOW(.UpdateFunc) + inc hl + ld [hl], HIGH(.UpdateFunc) + ret + +.UpdateFunc: + ld hl, wScreenAnimDuration + dec [hl] + call UpdateShakeOffset + jp nc, LoadDefaultScreenAnimationUpdateWhenFinished + ldh a, [hSCX] + add [hl] + ldh [hSCX], a + jp LoadDefaultScreenAnimationUpdateWhenFinished + +ShakeScreenY_Small: + ld hl, SmallShakeOffsets + jr ShakeScreenY +ShakeScreenY_Big: + ld hl, BigShakeOffsets +ShakeScreenY: + ld a, l + ld [wdcee + 0], a + ld a, h + ld [wdcee + 1], a + ld hl, wScreenAnimUpdatePtr + ld [hl], LOW(.UpdateFunc) + inc hl + ld [hl], HIGH(.UpdateFunc) + ret + +.UpdateFunc: + ld hl, wScreenAnimDuration + dec [hl] + call UpdateShakeOffset + jp nc, LoadDefaultScreenAnimationUpdateWhenFinished + ldh a, [hSCY] + add [hl] + ldh [hSCY], a + jp LoadDefaultScreenAnimationUpdateWhenFinished + +; get the displacement of the current frame +; depending on the value of wScreenAnimDuration +; returns carry if displacement was updated +UpdateShakeOffset: + ld hl, wdcee + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wScreenAnimDuration] + cp [hl] + ret nc + inc hl + push hl + inc hl + ld a, l + ld [wdcee + 0], a + ld a, h + ld [wdcee + 1], a + pop hl + scf + ret + +SmallShakeOffsets: +; timer, offset + db 21, 2 + db 17, -2 + db 13, 2 + db 9, -2 + db 5, 1 + db 1, -1 + +BigShakeOffsets: +; timer, offset + db 29, 4 + db 25, -4 + db 21, 4 + db 17, -4 + db 13, 3 + db 9, -3 + db 5, 2 + db 1, -2 + +; checks if screen animation duration is over +; and if so, loads the default update function +LoadDefaultScreenAnimationUpdateWhenFinished: + ld a, [wScreenAnimDuration] + and a + ret nz + ; fallthrough + +; function called for the screen animation update when it is over +DefaultScreenAnimationUpdate: + ld a, $ff + ld [wActiveScreenAnim], a + ld hl, wNumActiveAnimations + dec [hl] + call DisableInt_LYCoincidence + xor a + ldh [hSCX], a + ldh [rSCX], a + ldh [hSCY], a + ld hl, wScreenAnimUpdatePtr + ld [hl], LOW(DefaultScreenAnimationUpdate) + inc hl + ld [hl], HIGH(DefaultScreenAnimationUpdate) + ret + +WhiteFlashScreen: + ld hl, wScreenAnimUpdatePtr + ld [hl], LOW(.UpdateFunc) + inc hl + ld [hl], HIGH(.UpdateFunc) + + ; backup the current background pals + ld de, wTempBackgroundPalettesCGB + ld hl, wBackgroundPalettesCGB + ld bc, 8 palettes + call CopyBCBytesFromHLToDE + ld a, $ff ; white + ld hl, wBackgroundPalettesCGB + ld bc, 8 palettes + call WriteBCBytesToHL + xor a + call FlushAllPalettes + +.UpdateFunc: + ld hl, wScreenAnimDuration + dec [hl] + ld a, [hl] + and a + ret nz + ; retrieve the previous background pals + ld de, wBackgroundPalettesCGB + ld hl, wTempBackgroundPalettesCGB + ld bc, 8 palettes + call CopyBCBytesFromHLToDE + xor a + call FlushAllPalettes + jp DefaultScreenAnimationUpdate + +DistortScreen: + ld hl, wScreenAnimUpdatePtr + ld [hl], LOW(.UpdateFunc) + inc hl + ld [hl], HIGH(.UpdateFunc) + xor a + ld [wApplyBGScroll], a + ld hl, wLCDCFunctionTrampoline + 1 + ld [hl], LOW(ApplyBackgroundScroll) + inc hl + ld [hl], HIGH(ApplyBackgroundScroll) + ld a, 1 + ld [wBGScrollMod], a + call EnableInt_LYCoincidence + +.UpdateFunc: + ld a, [wScreenAnimDuration] + srl a + srl a + srl a + and %00000111 + ld c, a + ld b, $00 + ld hl, .BGScrollModData + add hl, bc + ld a, [hl] + ld [wBGScrollMod], a + ld hl, wScreenAnimDuration + dec [hl] + jp LoadDefaultScreenAnimationUpdateWhenFinished + +; each value is applied for 8 "ticks" of wScreenAnimDuration +; starting from the last and running backwards +.BGScrollModData: + db 4, 3, 2, 1, 1, 1, 1, 2 ; returns carry if player lost Func_1e5a2:: @@ -2847,3 +3893,287 @@ PlayerGenderAndNameSelection:: pop af ret ; 0x1f8eb + +SECTION "Bank 7@791d", ROMX[$791d], BANK[$7] + +MACRO animation + dw \1 ; tileset ID + dw \2 ; sprite animation ID + dw \3 ; frameset ID + dw \4 ; palette ID + db \5 ; flags + db \6 ; sfx ID + db \7 ; ? +ENDM + +Animations: +; DUEL_ANIM_NONE + animation TILESET_HIT, SPRITE_ANIM_00, FRAMESET_000, PALETTE_0D8, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_2E, $00 +; DUEL_ANIM_GLOW + animation TILESET_HIT, SPRITE_ANIM_00, FRAMESET_000, PALETTE_0D8, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_11, $00 +; DUEL_ANIM_PARALYSIS + animation TILESET_PARALYSIS, SPRITE_ANIM_01, FRAMESET_001, PALETTE_0D9, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_12, $00 +; DUEL_ANIM_SLEEP + animation TILESET_SLEEP, SPRITE_ANIM_02, FRAMESET_002, PALETTE_0DA, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_13, $00 +; DUEL_ANIM_CONFUSION + animation TILESET_CONFUSION_STAR, SPRITE_ANIM_03, FRAMESET_003, PALETTE_0DB, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_14, $00 +; DUEL_ANIM_POISON + animation TILESET_POISON, SPRITE_ANIM_04, FRAMESET_004, PALETTE_0DC, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_15, $00 +; DUEL_ANIM_SINGLE_HIT + animation TILESET_GLOW, SPRITE_ANIM_05, FRAMESET_005, PALETTE_0DD, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_16, $00 +; DUEL_ANIM_HIT + animation TILESET_GLOW, SPRITE_ANIM_05, FRAMESET_006, PALETTE_0DD, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_17, $00 +; DUEL_ANIM_BIG_HIT + animation TILESET_GLOW, SPRITE_ANIM_05, FRAMESET_007, PALETTE_0DD, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_17, $00 +; DUEL_ANIM_SHOW_DAMAGE + animation TILESET_DAMAGE, SPRITE_ANIM_06, FRAMESET_008, PALETTE_0DE, SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_THUNDER_SHOCK + animation TILESET_THUNDER, SPRITE_ANIM_07, FRAMESET_015, PALETTE_0DF, NONE, SFX_18, $00 +; DUEL_ANIM_LIGHTNING + animation TILESET_LIGHTING, SPRITE_ANIM_08, FRAMESET_016, PALETTE_0E0, NONE, SFX_19, $00 +; DUEL_ANIM_BORDER_SPARK + animation TILESET_SPARK, SPRITE_ANIM_09, FRAMESET_017, PALETTE_0E1, NONE, SFX_1A, $00 +; DUEL_ANIM_BIG_LIGHTNING + animation TILESET_BIG_LIGHTING, SPRITE_ANIM_0A, FRAMESET_018, PALETTE_0E2, SPRITE_ANIM_FLAG_CENTERED, SFX_1B, $00 +; DUEL_ANIM_SMALL_FLAME + animation TILESET_EMBER, SPRITE_ANIM_0B, FRAMESET_019, PALETTE_0E3, NONE, SFX_1C, $00 +; DUEL_ANIM_BIG_FLAME + animation TILESET_EMBER, SPRITE_ANIM_0B, FRAMESET_01A, PALETTE_0E3, NONE, SFX_1D, $00 +; DUEL_ANIM_FIRE_SPIN + animation TILESET_FIRE_SPIN, SPRITE_ANIM_0C, FRAMESET_01B, PALETTE_0E4, SPRITE_ANIM_FLAG_CENTERED, SFX_1E, $00 +; DUEL_ANIM_DIVE_BOMB + animation TILESET_FIRE_BIRD, SPRITE_ANIM_0D, FRAMESET_01C, PALETTE_0E5, NONE, SFX_1F, $00 +; DUEL_ANIM_WATER_JETS + animation TILESET_WATER_DROP, SPRITE_ANIM_0E, FRAMESET_021, PALETTE_0E6, SPRITE_ANIM_FLAG_CENTERED, SFX_20, $00 +; DUEL_ANIM_WATER_GUN + animation TILESET_WATER_GUN, SPRITE_ANIM_0F, FRAMESET_022, PALETTE_0E7, NONE, SFX_21, $00 +; DUEL_ANIM_WHIRLPOOL + animation TILESET_WHIRLPOOL, SPRITE_ANIM_10, FRAMESET_023, PALETTE_0E8, SPRITE_ANIM_FLAG_CENTERED, SFX_22, $00 +; DUEL_ANIM_HYDRO_PUMP + animation TILESET_HYDRO_PUMP, SPRITE_ANIM_11, FRAMESET_024, PALETTE_0E9, NONE, SFX_23, $00 +; DUEL_ANIM_BLIZZARD + animation TILESET_SNOW, SPRITE_ANIM_12, FRAMESET_025, PALETTE_0EA, SPRITE_ANIM_FLAG_CENTERED, SFX_24, $00 +; DUEL_ANIM_PSYCHIC + animation TILESET_PSYCHIC, SPRITE_ANIM_13, FRAMESET_026, PALETTE_0EB, NONE, SFX_25, $00 +; DUEL_ANIM_LEER + animation TILESET_EVIL_EYES, SPRITE_ANIM_14, FRAMESET_027, PALETTE_0EC, NONE, SFX_26, $00 +; DUEL_ANIM_BEAM + animation TILESET_BEAM, SPRITE_ANIM_15, FRAMESET_028, PALETTE_0ED, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_27, $00 +; DUEL_ANIM_HYPER_BEAM + animation TILESET_HYPER_BEAM, SPRITE_ANIM_16, FRAMESET_029, PALETTE_0EE, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_28, $00 +; DUEL_ANIM_ROCK_THROW + animation TILESET_ROCK, SPRITE_ANIM_17, FRAMESET_02A, PALETTE_0EF, NONE, SFX_29, $00 +; DUEL_ANIM_STONE_BARRAGE + animation TILESET_ROCK, SPRITE_ANIM_17, FRAMESET_02B, PALETTE_0EF, NONE, SFX_2A, $00 +; DUEL_ANIM_PUNCH + animation TILESET_PUNCH, SPRITE_ANIM_18, FRAMESET_02C, PALETTE_0F0, NONE, SFX_2B, $00 +; DUEL_ANIM_THUNDERPUNCH + animation TILESET_PUNCH, SPRITE_ANIM_18, FRAMESET_02D, PALETTE_0F0, NONE, SFX_52, $00 +; DUEL_ANIM_FIRE_PUNCH + animation TILESET_PUNCH, SPRITE_ANIM_18, FRAMESET_02E, PALETTE_0F0, NONE, SFX_53, $00 +; DUEL_ANIM_STRETCH_KICK + animation TILESET_STRETCH_KICK, SPRITE_ANIM_19, FRAMESET_02F, PALETTE_0F1, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_2C, $00 +; DUEL_ANIM_SLASH + animation TILESET_SLASH, SPRITE_ANIM_1A, FRAMESET_030, PALETTE_0F2, NONE, SFX_2D, $00 +; DUEL_ANIM_WHIP + animation TILESET_VINE_WHIP, SPRITE_ANIM_1B, FRAMESET_032, PALETTE_0F3, NONE, SFX_2D, $00 +; DUEL_ANIM_SONICBOOM + animation TILESET_SONIC_BOOM, SPRITE_ANIM_1C, FRAMESET_033, PALETTE_0F4, NONE, SFX_2E, $00 +; DUEL_ANIM_FURY_SWIPES + animation TILESET_SLASH, SPRITE_ANIM_1A, FRAMESET_031, PALETTE_0F2, NONE, SFX_2F, $00 +; DUEL_ANIM_DRILL + animation TILESET_HORN_DRILL, SPRITE_ANIM_1D, FRAMESET_034, PALETTE_0F5, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_30, $00 +; DUEL_ANIM_POT_SMASH + animation TILESET_POT_SMASH, SPRITE_ANIM_1E, FRAMESET_035, PALETTE_0F6, NONE, SFX_31, $00 +; DUEL_ANIM_BONEMERANG + animation TILESET_BONE, SPRITE_ANIM_1F, FRAMESET_036, PALETTE_0F7, NONE, SFX_32, $00 +; DUEL_ANIM_SEISMIC_TOSS + animation TILESET_SEISMIC_TOSS, SPRITE_ANIM_20, FRAMESET_037, PALETTE_0F8, NONE, SFX_33, $00 +; DUEL_ANIM_NEEDLES + animation TILESET_NEEDLES, SPRITE_ANIM_21, FRAMESET_038, PALETTE_0F9, NONE, SFX_34, $00 +; DUEL_ANIM_WHITE_GAS + animation TILESET_GAS, SPRITE_ANIM_22, FRAMESET_039, PALETTE_0FA, NONE, SFX_35, $00 +; DUEL_ANIM_POWDER + animation TILESET_POWDER, SPRITE_ANIM_23, FRAMESET_03A, PALETTE_0FB, NONE, SFX_36, $00 +; DUEL_ANIM_GOO + animation TILESET_GOO, SPRITE_ANIM_24, FRAMESET_03B, PALETTE_0FC, NONE, SFX_37, $00 +; DUEL_ANIM_BUBBLES + animation TILESET_BUBBLE, SPRITE_ANIM_25, FRAMESET_03C, PALETTE_0FD, NONE, SFX_38, $00 +; DUEL_ANIM_STRING_SHOT + animation TILESET_STRING_SHOT, SPRITE_ANIM_26, FRAMESET_03D, PALETTE_0FE, NONE, SFX_39, $00 +; DUEL_ANIM_BOYFRIENDS + animation TILESET_HEART, SPRITE_ANIM_27, FRAMESET_03E, PALETTE_0FF, NONE, SFX_3A, $00 +; DUEL_ANIM_LURE + animation TILESET_LURE, SPRITE_ANIM_28, FRAMESET_03F, PALETTE_100, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_3B, $00 +; DUEL_ANIM_TOXIC + animation TILESET_SKULL, SPRITE_ANIM_29, FRAMESET_040, PALETTE_101, NONE, SFX_3C, $00 +; DUEL_ANIM_CONFUSE_RAY + animation TILESET_CONFUSE_RAY, SPRITE_ANIM_2A, FRAMESET_041, PALETTE_102, NONE, SFX_3D, $00 +; DUEL_ANIM_SING + animation TILESET_NOTES, SPRITE_ANIM_2B, FRAMESET_042, PALETTE_103, NONE, SFX_3E, $00 +; DUEL_ANIM_SUPERSONIC + animation TILESET_SOUND, SPRITE_ANIM_2C, FRAMESET_043, PALETTE_104, NONE, SFX_3F, $00 +; DUEL_ANIM_PETAL_DANCE + animation TILESET_PETAL, SPRITE_ANIM_2D, FRAMESET_044, PALETTE_105, SPRITE_ANIM_FLAG_CENTERED, SFX_40, $00 +; DUEL_ANIM_PROTECT + animation TILESET_PROTECT, SPRITE_ANIM_2E, FRAMESET_045, PALETTE_106, NONE, SFX_41, $00 +; DUEL_ANIM_BARRIER + animation TILESET_BARRIER, SPRITE_ANIM_2F, FRAMESET_046, PALETTE_107, NONE, SFX_42, $00 +; DUEL_ANIM_SPEED + animation TILESET_SPEED, SPRITE_ANIM_30, FRAMESET_047, PALETTE_108, SPRITE_ANIM_FLAG_CENTERED, SFX_43, $00 +; DUEL_ANIM_WHIRLWIND + animation TILESET_WHIRLWIND, SPRITE_ANIM_31, FRAMESET_048, PALETTE_109, NONE, SFX_44, $00 +; DUEL_ANIM_CRY + animation TILESET_SNIVEL, SPRITE_ANIM_32, FRAMESET_04A, PALETTE_10A, NONE, SFX_45, $00 +; DUEL_ANIM_QUESTION_MARK + animation TILESET_QUESTION_MARK, SPRITE_ANIM_33, FRAMESET_04B, PALETTE_10B, NONE, SFX_46, $00 +; DUEL_ANIM_SELFDESTRUCT + animation TILESET_EXPLOSION, SPRITE_ANIM_34, FRAMESET_04C, PALETTE_10C, NONE, SFX_47, $00 +; DUEL_ANIM_BIG_SELFDESTRUCT_1 + animation TILESET_EXPLOSION, SPRITE_ANIM_34, FRAMESET_04D, PALETTE_10C, NONE, SFX_48, $00 +; DUEL_ANIM_HEAL + animation TILESET_HEAL, SPRITE_ANIM_35, FRAMESET_04F, PALETTE_10D, NONE, SFX_49, $00 +; DUEL_ANIM_DRAIN + animation TILESET_DRAIN, SPRITE_ANIM_36, FRAMESET_051, PALETTE_10E, NONE, SFX_4A, $00 +; DUEL_ANIM_DARK_GAS + animation TILESET_GAS, SPRITE_ANIM_22, FRAMESET_039, PALETTE_10F, NONE, SFX_4B, $00 +; DUEL_ANIM_BIG_SELFDESTRUCT_2 + animation TILESET_EXPLOSION, SPRITE_ANIM_34, FRAMESET_04E, PALETTE_10C, NONE, SFX_47, $00 +; DUEL_ANIM_UNUSED_42 + animation TILESET_GLOW, SPRITE_ANIM_05, FRAMESET_006, PALETTE_0DD, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_16, $00 +; DUEL_ANIM_UNUSED_43 + animation TILESET_GLOW, SPRITE_ANIM_05, FRAMESET_007, PALETTE_0DD, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_17, $00 +; DUEL_ANIM_BENCH_THUNDER + animation TILESET_THUNDER, SPRITE_ANIM_07, FRAMESET_015, PALETTE_0DF, NONE, SFX_18, $00 +; DUEL_ANIM_QUICKFREEZE + animation TILESET_SNOW, SPRITE_ANIM_12, FRAMESET_025, PALETTE_0EA, SPRITE_ANIM_FLAG_CENTERED, SFX_24, $00 +; DUEL_ANIM_BENCH_GLOW + animation TILESET_SMALL_GLOW, SPRITE_ANIM_37, FRAMESET_052, PALETTE_110, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_11, $00 +; DUEL_ANIM_FIREGIVER_START + animation TILESET_FIRE_BIRD, SPRITE_ANIM_0D, FRAMESET_01D, PALETTE_0E5, SPRITE_ANIM_FLAG_CENTERED, SFX_5C, $00 +; DUEL_ANIM_UNUSED_48 + animation TILESET_FIRE_BIRD, SPRITE_ANIM_0D, FRAMESET_01E, PALETTE_0E5, SPRITE_ANIM_FLAG_CENTERED, NONE, $00 +; DUEL_ANIM_HEALING_WIND + animation TILESET_HEAL, SPRITE_ANIM_35, FRAMESET_050, PALETTE_10D, SPRITE_ANIM_FLAG_CENTERED, SFX_4C, $00 +; DUEL_ANIM_BENCH_WHIRLWIND + animation TILESET_WHIRLWIND, SPRITE_ANIM_31, FRAMESET_049, PALETTE_109, SPRITE_ANIM_FLAG_CENTERED, SFX_4D, $00 +; DUEL_ANIM_EXPAND + animation TILESET_EXPAND, SPRITE_ANIM_38, FRAMESET_053, PALETTE_111, NONE, SFX_4E, $00 +; DUEL_ANIM_CAT_PUNCH + animation TILESET_CAT_PUNCH, SPRITE_ANIM_39, FRAMESET_054, PALETTE_112, NONE, SFX_4F, $00 +; DUEL_ANIM_THUNDER_WAVE + animation TILESET_ELECTRIC_WAVE, SPRITE_ANIM_3A, FRAMESET_055, PALETTE_113, NONE, SFX_50, $00 +; DUEL_ANIM_FIREGIVER_PLAYER + animation TILESET_FIRE_BIRD, SPRITE_ANIM_0D, FRAMESET_01F, PALETTE_0E5, SPRITE_ANIM_FLAG_CENTERED, SFX_51, $00 +; DUEL_ANIM_FIREGIVER_OPP + animation TILESET_FIRE_BIRD, SPRITE_ANIM_0D, FRAMESET_020, PALETTE_0E5, SPRITE_ANIM_FLAG_CENTERED, SFX_51, $00 +; DUEL_ANIM_UNUSED_50 + animation TILESET_CARD, SPRITE_ANIM_5C, FRAMESET_079, PALETTE_135, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_PLAYER_SHUFFLE + animation TILESET_CARD, SPRITE_ANIM_5C, FRAMESET_07A, PALETTE_135, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_07, $00 +; DUEL_ANIM_OPP_SHUFFLE + animation TILESET_CARD, SPRITE_ANIM_5C, FRAMESET_07B, PALETTE_135, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_07, $00 +; DUEL_ANIM_BOTH_SHUFFLE + animation TILESET_CARD, SPRITE_ANIM_5C, FRAMESET_07C, PALETTE_135, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_07, $00 +; DUEL_ANIM_UNUSED_54 + animation TILESET_CARD, SPRITE_ANIM_5C, FRAMESET_07D, PALETTE_135, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_BOTH_DRAW + animation TILESET_CARD, SPRITE_ANIM_5C, FRAMESET_07E, PALETTE_135, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_PLAYER_DRAW + animation TILESET_CARD, SPRITE_ANIM_5C, FRAMESET_07F, PALETTE_135, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_OPP_DRAW + animation TILESET_CARD, SPRITE_ANIM_5C, FRAMESET_080, PALETTE_135, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_COIN_SPIN + animation TILESET_TCG1_PIKACHU_COIN, SPRITE_ANIM_5D, FRAMESET_082, PALETTE_136, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_COIN_TOSS1 + animation TILESET_TCG1_PIKACHU_COIN, SPRITE_ANIM_5D, FRAMESET_083, PALETTE_136, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_0B, $00 +; DUEL_ANIM_COIN_TOSS2 + animation TILESET_TCG1_PIKACHU_COIN, SPRITE_ANIM_5D, FRAMESET_084, PALETTE_136, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_0B, $00 +; DUEL_ANIM_COIN_TAILS + animation TILESET_TCG1_PIKACHU_COIN, SPRITE_ANIM_5D, FRAMESET_085, PALETTE_136, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_COIN_HEADS + animation TILESET_TCG1_PIKACHU_COIN, SPRITE_ANIM_5D, FRAMESET_086, PALETTE_136, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_DUEL_WIN + animation TILESET_DUEL_RESULT, SPRITE_ANIM_5E, FRAMESET_087, PALETTE_137, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_DUEL_LOSS + animation TILESET_DUEL_RESULT, SPRITE_ANIM_5E, FRAMESET_088, PALETTE_137, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_DUEL_DRAW + animation TILESET_DUEL_RESULT, SPRITE_ANIM_5E, FRAMESET_089, PALETTE_137, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_UNUSED_60 + animation TILESET_CARD, SPRITE_ANIM_5C, FRAMESET_081, PALETTE_135, SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_UNSKIPPABLE, NONE, $00 +; DUEL_ANIM_61 + animation TILESET_HIT, SPRITE_ANIM_00, FRAMESET_000, PALETTE_0D8, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_2E, $00 +; DUEL_ANIM_62 + animation TILESET_HIT, SPRITE_ANIM_00, FRAMESET_000, PALETTE_0D8, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_2E, $00 +; DUEL_ANIM_63 + animation TILESET_HIT, SPRITE_ANIM_00, FRAMESET_000, PALETTE_0D8, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_2E, $00 +; DUEL_ANIM_64 + animation TILESET_FIREBALLS, SPRITE_ANIM_3B, FRAMESET_056, PALETTE_114, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_64, $00 +; DUEL_ANIM_65 + animation TILESET_FIREBALLS, SPRITE_ANIM_3B, FRAMESET_057, PALETTE_114, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_65, $00 +; DUEL_ANIM_66 + animation TILESET_BENCH_MANIP, SPRITE_ANIM_3C, FRAMESET_058, PALETTE_115, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_66, $00 +; DUEL_ANIM_67 + animation TILESET_PSYCHIC_BEAM, SPRITE_ANIM_3D, FRAMESET_059, PALETTE_116, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_67, $00 +; DUEL_ANIM_68 + animation TILESET_BENCH_PSYCHIC_BEAM, SPRITE_ANIM_3E, FRAMESET_05A, PALETTE_117, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_3 | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_68, $00 +; DUEL_ANIM_69 + animation TILESET_ROCK_THROW, SPRITE_ANIM_3F, FRAMESET_05B, PALETTE_118, NONE, SFX_69, $00 +; DUEL_ANIM_6A + animation TILESET_MEGA_PUNCH, SPRITE_ANIM_40, FRAMESET_05C, PALETTE_119, NONE, SFX_6A, $00 +; DUEL_ANIM_6B + animation TILESET_PSYPUNCH, SPRITE_ANIM_41, FRAMESET_05D, PALETTE_11A, NONE, SFX_6B, $00 +; DUEL_ANIM_6C + animation TILESET_SLUDGE_PUNCH, SPRITE_ANIM_42, FRAMESET_05E, PALETTE_11B, NONE, SFX_6C, $00 +; DUEL_ANIM_6D + animation TILESET_ICE_PUNCH, SPRITE_ANIM_43, FRAMESET_05F, PALETTE_11C, NONE, SFX_6D, $00 +; DUEL_ANIM_6E + animation TILESET_KICK, SPRITE_ANIM_44, FRAMESET_060, PALETTE_11D, NONE, SFX_6E, $00 +; DUEL_ANIM_6F + animation TILESET_TAIL_SLAP, SPRITE_ANIM_45, FRAMESET_061, PALETTE_11E, NONE, SFX_6F, $00 +; DUEL_ANIM_70 + animation TILESET_TAIL_WHIP, SPRITE_ANIM_46, FRAMESET_062, PALETTE_11F, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_70, $00 +; DUEL_ANIM_71 + animation TILESET_SLAP, SPRITE_ANIM_47, FRAMESET_063, PALETTE_120, NONE, SFX_71, $00 +; DUEL_ANIM_72 + animation TILESET_QUESTION_MARK_SMALL, SPRITE_ANIM_48, FRAMESET_064, PALETTE_121, NONE, SFX_72, $00 +; DUEL_ANIM_73 + animation TILESET_SKULL_BASH, SPRITE_ANIM_49, FRAMESET_065, PALETTE_122, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_73, $00 +; DUEL_ANIM_74 + animation TILESET_COIN_HURL, SPRITE_ANIM_4A, FRAMESET_066, PALETTE_123, NONE, SFX_74, $00 +; DUEL_ANIM_75 + animation TILESET_193, SPRITE_ANIM_4B, FRAMESET_068, PALETTE_124, SPRITE_ANIM_FLAG_8x16, SFX_75, $00 +; DUEL_ANIM_76 + animation TILESET_FOLLOW_ME, SPRITE_ANIM_4C, FRAMESET_069, PALETTE_125, NONE, SFX_76, $00 +; DUEL_ANIM_77 + animation TILESET_SWIFT, SPRITE_ANIM_4D, FRAMESET_06A, PALETTE_126, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_77, $00 +; DUEL_ANIM_78 + animation TILESET_3D_ATTACK, SPRITE_ANIM_4E, FRAMESET_06B, PALETTE_127, NONE, SFX_78, $00 +; DUEL_ANIM_79 + animation TILESET_WATER_DROP, SPRITE_ANIM_0E, FRAMESET_021, PALETTE_0E6, SPRITE_ANIM_FLAG_CENTERED, SFX_79, $00 +; DUEL_ANIM_7A + animation TILESET_FOCUS_BLAST, SPRITE_ANIM_50, FRAMESET_06D, PALETTE_129, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_7A, $00 +; DUEL_ANIM_7B + animation TILESET_FOCUS_BLAST_BENCH, SPRITE_ANIM_51, FRAMESET_06E, PALETTE_12A, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_3 | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_7B, $00 +; DUEL_ANIM_7C + animation TILESET_BONE2, SPRITE_ANIM_52, FRAMESET_06F, PALETTE_12B, NONE, SFX_8C, $00 +; DUEL_ANIM_7D + animation TILESET_COIN_HURL, SPRITE_ANIM_4A, FRAMESET_067, PALETTE_123, NONE, SFX_8D, $00 +; DUEL_ANIM_7E + animation TILESET_BIG_SNORE, SPRITE_ANIM_53, FRAMESET_070, PALETTE_12C, NONE, SFX_8E, $00 +; DUEL_ANIM_7F + animation TILESET_RAZOR_LEAF, SPRITE_ANIM_54, FRAMESET_071, PALETTE_12D, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_92, $00 +; DUEL_ANIM_80 + animation TILESET_GUILLOTINE, SPRITE_ANIM_55, FRAMESET_072, PALETTE_12E, NONE, SFX_93, $00 +; DUEL_ANIM_81 + animation TILESET_VINE_PULL, SPRITE_ANIM_56, FRAMESET_073, PALETTE_12F, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_94, $00 +; DUEL_ANIM_82 + animation TILESET_PERPLEX, SPRITE_ANIM_57, FRAMESET_074, PALETTE_130, NONE, SFX_95, $00 +; DUEL_ANIM_83 + animation TILESET_NINE_TAILS, SPRITE_ANIM_58, FRAMESET_075, PALETTE_131, NONE, SFX_96, $00 +; DUEL_ANIM_84 + animation TILESET_BONE_HEADBUTT, SPRITE_ANIM_59, FRAMESET_076, PALETTE_132, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_97, $00 +; DUEL_ANIM_85 + animation TILESET_DRILL_DIVE, SPRITE_ANIM_5A, FRAMESET_077, PALETTE_133, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_98, $00 +; DUEL_ANIM_86 + animation TILESET_DARK_SONG, SPRITE_ANIM_5B, FRAMESET_078, PALETTE_134, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_99, $00 diff --git a/src/engine/bank09.asm b/src/engine/bank09.asm index e132a3b..3aa1e60 100644 --- a/src/engine/bank09.asm +++ b/src/engine/bank09.asm @@ -3013,7 +3013,7 @@ LoadDeckIDData: ld a, [hli] ld [wcd0f], a ld a, [hli] - ld [wcc18], a + ld [wOppCoin], a or a ret @@ -3027,7 +3027,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $12 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db STARTER_DECK_ID - 1 tx Text0448 ; deck name @@ -3038,7 +3038,7 @@ DeckIDData: db $00 ; ? db MUSIC_STOP ; duel theme db $00 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db SWEAT_ANTI_GR1_DECK_ID - 1 tx Text044d ; deck name @@ -3049,7 +3049,7 @@ DeckIDData: db $00 ; ? db MUSIC_STOP ; duel theme db $00 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db GIVE_IN_ANTI_GR2_DECK_ID - 1 tx Text0466 ; deck name @@ -3060,7 +3060,7 @@ DeckIDData: db $00 ; ? db MUSIC_STOP ; duel theme db $00 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db VENGEFUL_ANTI_GR3_DECK_ID - 1 tx Text0449 ; deck name @@ -3071,7 +3071,7 @@ DeckIDData: db $00 ; ? db MUSIC_STOP ; duel theme db $00 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db UNFORGIVING_ANTI_GR4_DECK_ID - 1 tx Text0470 ; deck name @@ -3082,7 +3082,7 @@ DeckIDData: db $00 ; ? db MUSIC_STOP ; duel theme db $00 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db UNUSED_SAMS_PRACTICE_DECK_ID - 1 tx Text04f1 ; deck name @@ -3093,7 +3093,7 @@ DeckIDData: db $00 ; ? db MUSIC_STOP ; duel theme db $00 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db UNUSED_SAMS_PRACTICE_DECK_ID tx Text04d6 ; deck name @@ -3104,7 +3104,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $12 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db AARON_PRACTICE_DECK1_ID tx Text04af ; deck name @@ -3115,7 +3115,7 @@ DeckIDData: db $00 ; ? db MUSIC_STOP ; duel theme db $00 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db AARONS_STEP1_DECK_ID tx Text0433 ; deck name @@ -3126,7 +3126,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $12 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db AARON_PRACTICE_DECK2_ID tx Text04b0 ; deck name @@ -3137,7 +3137,7 @@ DeckIDData: db $00 ; ? db MUSIC_STOP ; duel theme db $00 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db AARONS_STEP2_DECK_ID tx Text0434 ; deck name @@ -3148,7 +3148,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $12 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db AARON_PRACTICE_DECK3_ID tx Text04b1 ; deck name @@ -3159,7 +3159,7 @@ DeckIDData: db $00 ; ? db MUSIC_STOP ; duel theme db $00 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db AARONS_STEP3_DECK_ID tx Text0435 ; deck name @@ -3170,7 +3170,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $12 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db BRICK_WALK_DECK_ID tx Text043e ; deck name @@ -3181,7 +3181,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $12 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db BENCH_TRAP_DECK_ID tx Text044b ; deck name @@ -3192,7 +3192,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $12 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db SKY_SPARK_DECK_ID tx Text049d ; deck name @@ -3203,7 +3203,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_2 ; duel theme db $09 ; ? - db $05 ; ? + db COIN_PIKACHU ; coin db ELECTRIC_SELFDESTRUCT_DECK_ID tx Text04c1 ; deck name @@ -3214,7 +3214,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_2 ; duel theme db $09 ; ? - db $05 ; ? + db COIN_PIKACHU ; coin db OVERFLOW_DECK_ID tx Text0481 ; deck name @@ -3225,7 +3225,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $01 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db TRIPLE_ZAPDOS_DECK_ID tx Text04ad ; deck name @@ -3236,7 +3236,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $01 ; ? - db $05 ; ? + db COIN_PIKACHU ; coin db I_LOVE_PIKACHU_DECK_ID tx Text04c4 ; deck name @@ -3247,7 +3247,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $01 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db TEN_THOUSAND_VOLTS_DECK_ID tx Text0426 ; deck name @@ -3258,7 +3258,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $01 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db HAND_OVER_GR_DECK_ID tx Text0471 ; deck name @@ -3269,7 +3269,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_2 ; duel theme db $0a ; ? - db $06 ; ? + db COIN_ALAKAZAM ; coin db PSYCHIC_ELITE_DECK_ID tx Text0453 ; deck name @@ -3280,7 +3280,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_2 ; duel theme db $0a ; ? - db $06 ; ? + db COIN_ALAKAZAM ; coin db PSYCHOKINESIS_DECK_ID tx Text0496 ; deck name @@ -3291,7 +3291,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $02 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db PHANTOM_DECK_ID tx Text046e ; deck name @@ -3302,7 +3302,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $02 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db PUPPET_MASTER_DECK_ID tx Text045f ; deck name @@ -3313,7 +3313,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $02 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db EVEN3_YEARS_ON_A_ROCK_DECK_ID tx Text0438 ; deck name @@ -3324,7 +3324,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_2 ; duel theme db $0b ; ? - db $07 ; ? + db COIN_KABUTO ; coin db ROLLING_STONE_DECK_ID tx Text04f3 ; deck name @@ -3335,7 +3335,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $03 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db GREAT_EARTHQUAKE_DECK_ID tx Text044f ; deck name @@ -3346,7 +3346,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $03 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db AWESOME_FOSSIL_DECK_ID tx Text0498 ; deck name @@ -3357,7 +3357,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $03 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db RAGING_BILLOW_OF_FISTS_DECK_ID tx Text04b2 ; deck name @@ -3368,7 +3368,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_2 ; duel theme db $0c ; ? - db $0c ; ? + db COIN_MACHAMP ; coin db YOU_CAN_DO_IT_MACHOP_DECK_ID tx Text0440 ; deck name @@ -3379,7 +3379,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $04 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db NEW_MACHOKE_DECK_ID tx Text04b7 ; deck name @@ -3390,7 +3390,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $04 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db SKILLED_WARRIOR_DECK_ID tx Text046a ; deck name @@ -3401,7 +3401,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $04 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db I_LOVE_TO_FIGHT_DECK_ID tx Text04bb ; deck name @@ -3412,7 +3412,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $04 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db MAX_ENERGY_DECK_ID tx Text042c ; deck name @@ -3423,7 +3423,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_2 ; duel theme db $0d ; ? - db $02 ; ? + db COIN_ODDISH ; coin db REMAINING_GREEN_DECK_ID tx Text0461 ; deck name @@ -3434,7 +3434,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $05 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db POISON_CURSE_DECK_ID tx Text045d ; deck name @@ -3445,7 +3445,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $05 ; ? - db $02 ; ? + db COIN_ODDISH ; coin db GLITTERING_SCALES_DECK_ID tx Text043c ; deck name @@ -3456,7 +3456,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $05 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db STEADY_INCREASE_DECK_ID tx Text04b3 ; deck name @@ -3467,7 +3467,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $05 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db DARK_SCIENCE_DECK_ID tx Text04a6 ; deck name @@ -3478,7 +3478,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_2 ; duel theme db $0e ; ? - db $08 ; ? + db COIN_MAGNEMITE ; coin db NATURAL_SCIENCE_DECK_ID tx Text044a ; deck name @@ -3489,7 +3489,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $06 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db POISONOUS_SWAMP_DECK_ID tx Text045b ; deck name @@ -3500,7 +3500,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $06 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db GATHERING_NIDORAN_DECK_ID tx Text042f ; deck name @@ -3511,7 +3511,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $06 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db RAIN_DANCE_CONFUSION_DECK_ID tx Text0431 ; deck name @@ -3522,7 +3522,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_2 ; duel theme db $0f ; ? - db $04 ; ? + db COIN_STARMIE ; coin db CONSERVING_WATER_DECK_ID tx Text0460 ; deck name @@ -3533,7 +3533,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $07 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db ENERGY_REMOVAL_DECK_ID tx Text0480 ; deck name @@ -3544,7 +3544,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $07 ; ? - db $04 ; ? + db COIN_STARMIE ; coin db SPLASHING_ABOUT_DECK_ID tx Text0467 ; deck name @@ -3555,7 +3555,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $07 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db BEACH_DECK_ID tx Text045e ; deck name @@ -3566,7 +3566,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $07 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db GO_ARCANINE_DECK_ID tx Text046f ; deck name @@ -3577,7 +3577,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_2 ; duel theme db $10 ; ? - db $03 ; ? + db COIN_CHARMANDER ; coin db FLAME_FESTIVAL_DECK_ID tx Text0465 ; deck name @@ -3588,7 +3588,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $08 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db IMMORTAL_FLAME_DECK_ID tx Text0463 ; deck name @@ -3599,7 +3599,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $08 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db ELECTRIC_CURRENT_SHOCK_DECK_ID tx Text0459 ; deck name @@ -3610,7 +3610,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $08 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db GREAT_ROCKET4_DECK_ID tx Text0490 ; deck name @@ -3621,7 +3621,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $16 ; ? - db $01 ; ? + db COIN_GR ; coin db GREAT_ROCKET1_DECK_ID tx Text048d ; deck name @@ -3632,7 +3632,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $16 ; ? - db $01 ; ? + db COIN_GR ; coin db GREAT_ROCKET2_DECK_ID tx Text048e ; deck name @@ -3643,7 +3643,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $16 ; ? - db $01 ; ? + db COIN_GR ; coin db GREAT_ROCKET3_DECK_ID tx Text048f ; deck name @@ -3654,7 +3654,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $16 ; ? - db $01 ; ? + db COIN_GR ; coin db GRAND_FIRE_DECK_ID tx Text048b ; deck name @@ -3665,7 +3665,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_3 ; duel theme db $11 ; ? - db $03 ; ? + db COIN_CHARMANDER ; coin db LEGENDARY_FOSSIL_DECK_ID tx Text0458 ; deck name @@ -3676,7 +3676,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_3 ; duel theme db $11 ; ? - db $05 ; ? + db COIN_PIKACHU ; coin db WATER_LEGEND_DECK_ID tx Text047c ; deck name @@ -3687,7 +3687,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_3 ; duel theme db $11 ; ? - db $04 ; ? + db COIN_STARMIE ; coin db GREAT_DRAGON_DECK_ID tx Text0450 ; deck name @@ -3698,7 +3698,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_3 ; duel theme db $11 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db BUG_COLLECTING_DECK_ID tx Text0447 ; deck name @@ -3709,7 +3709,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $17 ; ? - db $01 ; ? + db COIN_GR ; coin db DEMONIC_FOREST_DECK_ID tx Text042e ; deck name @@ -3720,7 +3720,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $17 ; ? - db $01 ; ? + db COIN_GR ; coin db STICKY_POISON_GAS_DECK_ID tx Text045c ; deck name @@ -3731,7 +3731,7 @@ DeckIDData: db $01 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $17 ; ? - db $01 ; ? + db COIN_GR ; coin db MAD_PETALS_DECK_ID tx Text0445 ; deck name @@ -3742,7 +3742,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $1d ; ? - db $08 ; ? + db COIN_MAGNEMITE ; coin db DANGEROUS_BENCH_DECK_ID tx Text0441 ; deck name @@ -3753,7 +3753,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $26 ; ? - db $00 ; ? + db COIN_CHANSEY ; coin db CHAIN_LIGHTNING_BY_PIKACHU_DECK_ID tx Text04c5 ; deck name @@ -3764,7 +3764,7 @@ DeckIDData: db $07 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $18 ; ? - db $01 ; ? + db COIN_GR ; coin db THIS_IS_THE_POWER_OF_ELECTRICITY_DECK_ID tx Text0456 ; deck name @@ -3775,7 +3775,7 @@ DeckIDData: db $02 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $18 ; ? - db $01 ; ? + db COIN_GR ; coin db QUICK_ATTACK_DECK_ID tx Text0457 ; deck name @@ -3786,7 +3786,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $1e ; ? - db $09 ; ? + db COIN_GOLBAT ; coin db COMPLETE_COMBUSTION_DECK_ID tx Text043f ; deck name @@ -3797,7 +3797,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $19 ; ? - db $01 ; ? + db COIN_GR ; coin db FIREBALL_DECK_ID tx Text04c6 ; deck name @@ -3808,7 +3808,7 @@ DeckIDData: db $03 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $19 ; ? - db $01 ; ? + db COIN_GR ; coin db EEVEE_SHOWDOWN_DECK_ID tx Text0477 ; deck name @@ -3819,7 +3819,7 @@ DeckIDData: db $08 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $19 ; ? - db $01 ; ? + db COIN_GR ; coin db GAZE_UPON_THE_POWER_OF_FIRE_DECK_ID tx Text0468 ; deck name @@ -3830,7 +3830,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $1f ; ? - db $0a ; ? + db COIN_MAGMAR ; coin db WHIRLPOOL_SHOWER_DECK_ID tx Text0439 ; deck name @@ -3841,7 +3841,7 @@ DeckIDData: db $04 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $1a ; ? - db $01 ; ? + db COIN_GR ; coin db PARALYZED_PARALYZED_DECK_ID tx Text04d1 ; deck name @@ -3852,7 +3852,7 @@ DeckIDData: db $09 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $1a ; ? - db $01 ; ? + db COIN_GR ; coin db BENCH_CALL_DECK_ID tx Text04c7 ; deck name @@ -3863,7 +3863,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $1a ; ? - db $01 ; ? + db COIN_GR ; coin db WATER_STREAM_DECK_ID tx Text047b ; deck name @@ -3874,7 +3874,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $20 ; ? - db $0b ; ? + db COIN_PSYDUCK ; coin db ROCK_BLAST_DECK_ID tx Text04f4 ; deck name @@ -3885,7 +3885,7 @@ DeckIDData: db $0c ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $1b ; ? - db $01 ; ? + db COIN_GR ; coin db FULL_STRENGTH_DECK_ID tx Text0451 ; deck name @@ -3896,7 +3896,7 @@ DeckIDData: db $05 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $1b ; ? - db $01 ; ? + db COIN_GR ; coin db RUNNING_WILD_DECK_ID tx Text0430 ; deck name @@ -3907,7 +3907,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $21 ; ? - db $0c ; ? + db COIN_MACHAMP ; coin db DIRECT_HIT_DECK_ID tx Text0454 ; deck name @@ -3918,7 +3918,7 @@ DeckIDData: db $06 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $1c ; ? - db $01 ; ? + db COIN_GR ; coin db SUPERDESTRUCTIVE_POWER_DECK_ID tx Text0452 ; deck name @@ -3929,7 +3929,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $1c ; ? - db $01 ; ? + db COIN_GR ; coin db BAD_DREAM_DECK_ID tx Text04ba ; deck name @@ -3940,7 +3940,7 @@ DeckIDData: db $0a ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $1c ; ? - db $01 ; ? + db COIN_GR ; coin db POKEMON_POWER_DECK_ID tx Text04cb ; deck name @@ -3951,7 +3951,7 @@ DeckIDData: db $0d ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $1c ; ? - db $01 ; ? + db COIN_GR ; coin db SPIRITED_AWAY_DECK_ID tx Text043d ; deck name @@ -3962,7 +3962,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $22 ; ? - db $0d ; ? + db COIN_MEW ; coin db SNORLAX_GUARD_DECK_ID tx Text0484 ; deck name @@ -3973,7 +3973,7 @@ DeckIDData: db $0e ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $23 ; ? - db $0e ; ? + db COIN_SNORLAX ; coin db EYE_OF_THE_STORM_DECK_ID tx Text044c ; deck name @@ -3984,7 +3984,7 @@ DeckIDData: db $0f ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $23 ; ? - db $0e ; ? + db COIN_SNORLAX ; coin db SUDDEN_GROWTH_DECK_ID tx Text0443 ; deck name @@ -3995,7 +3995,7 @@ DeckIDData: db $10 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $23 ; ? - db $0e ; ? + db COIN_SNORLAX ; coin db VERY_RARE_CARD_DECK_ID tx Text045a ; deck name @@ -4006,7 +4006,7 @@ DeckIDData: db $00 ; ? db MUSIC_ISHIHARA ; duel theme db $14 ; ? - db $13 ; ? + db COIN_JIGGLYPUFF ; coin db BAD_GUYS_DECK_ID tx Text0472 ; deck name @@ -4017,7 +4017,7 @@ DeckIDData: db $0b ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $24 ; ? - db $11 ; ? + db COIN_HORSEA ; coin db POISON_MIST_DECK_ID tx Text04ca ; deck name @@ -4028,7 +4028,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $24 ; ? - db $12 ; ? + db COIN_ARBOK ; coin db ULTRA_REMOVAL_DECK_ID tx Text047e ; deck name @@ -4039,7 +4039,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $24 ; ? - db $13 ; ? + db COIN_JIGGLYPUFF ; coin db PSYCHIC_BATTLE_DECK_ID tx Text0495 ; deck name @@ -4050,7 +4050,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $24 ; ? - db $15 ; ? + db COIN_GENGAR ; coin db STOP_LIFE_DECK_ID tx Text0437 ; deck name @@ -4061,7 +4061,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_3 ; duel theme db $25 ; ? - db $0f ; ? + db COIN_TOGEPI ; coin db SCORCHER_DECK_ID tx Text046d ; deck name @@ -4072,7 +4072,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_3 ; duel theme db $25 ; ? - db $0f ; ? + db COIN_TOGEPI ; coin db TSUNAMI_STARTER_DECK_ID tx Text044e ; deck name @@ -4083,7 +4083,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_3 ; duel theme db $25 ; ? - db $0f ; ? + db COIN_TOGEPI ; coin db SMASH_TO_MINCEMEAT_DECK_ID tx Text0455 ; deck name @@ -4094,7 +4094,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_3 ; duel theme db $25 ; ? - db $0f ; ? + db COIN_TOGEPI ; coin db TEST_YOUR_LUCK_DECK_ID tx Text043a ; deck name @@ -4105,7 +4105,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_1 ; duel theme db $27 ; ? - db $13 ; ? + db COIN_JIGGLYPUFF ; coin db PROTOHISTORIC_DECK_ID tx Text0446 ; deck name @@ -4116,7 +4116,7 @@ DeckIDData: db $00 ; ? db MUSIC_DUELTHEME_2 ; duel theme db $27 ; ? - db $13 ; ? + db COIN_JIGGLYPUFF ; coin db TEXTURE_TUNER7_DECK_ID tx Text04a8 ; deck name @@ -4127,7 +4127,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $27 ; ? - db $13 ; ? + db COIN_JIGGLYPUFF ; coin db COLORLESS_ENERGY_DECK_ID tx Text046b ; deck name @@ -4138,7 +4138,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_1 ; duel theme db $27 ; ? - db $13 ; ? + db COIN_JIGGLYPUFF ; coin db POWERFUL_POKEMON_DECK_ID tx Text0444 ; deck name @@ -4149,7 +4149,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $27 ; ? - db $13 ; ? + db COIN_JIGGLYPUFF ; coin db WEIRD_DECK_ID tx Text0464 ; deck name @@ -4160,7 +4160,7 @@ DeckIDData: db $00 ; ? db MUSIC_IMAKUNI ; duel theme db $13 ; ? - db $0b ; ? + db COIN_PSYDUCK ; coin db STRANGE_DECK_ID tx Text0442 ; deck name @@ -4171,7 +4171,7 @@ DeckIDData: db $00 ; ? db MUSIC_IMAKUNI2 ; duel theme db $13 ; ? - db $13 ; ? + db COIN_JIGGLYPUFF ; coin db RONALDS_UNCOOL_DECK_ID tx Text04e8 ; deck name @@ -4182,7 +4182,7 @@ DeckIDData: db $00 ; ? db MUSIC_RONALD ; duel theme db $15 ; ? - db $16 ; ? + db COIN_RAICHU ; coin db RONALDS_GRX_DECK_ID tx Text04e7 ; deck name @@ -4193,7 +4193,7 @@ DeckIDData: db $00 ; ? db MUSIC_RONALD ; duel theme db $16 ; ? - db $16 ; ? + db COIN_RAICHU ; coin db RONALDS_POWER_DECK_ID tx Text04eb ; deck name @@ -4204,7 +4204,7 @@ DeckIDData: db $00 ; ? db MUSIC_RONALD ; duel theme db $15 ; ? - db $16 ; ? + db COIN_RAICHU ; coin db RONALDS_PSYCHIC_DECK_ID tx Text04ea ; deck name @@ -4215,7 +4215,7 @@ DeckIDData: db $00 ; ? db MUSIC_RONALD ; duel theme db $15 ; ? - db $16 ; ? + db COIN_RAICHU ; coin db RONALDS_ULTRA_DECK_ID tx Text04e9 ; deck name @@ -4226,7 +4226,7 @@ DeckIDData: db $00 ; ? db MUSIC_RONALD ; duel theme db $15 ; ? - db $16 ; ? + db COIN_RAICHU ; coin db EVERYBODYS_FRIEND_DECK_ID tx Text0469 ; deck name @@ -4237,7 +4237,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $28 ; ? - db $17 ; ? + db COIN_LUGIA ; coin db IMMORTAL_POKEMON_DECK_ID tx Text0462 ; deck name @@ -4248,7 +4248,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $28 ; ? - db $17 ; ? + db COIN_LUGIA ; coin db TORRENTIAL_FLOOD_DECK_ID tx Text043b ; deck name @@ -4259,7 +4259,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $28 ; ? - db $17 ; ? + db COIN_LUGIA ; coin db TRAINER_IMPRISON_DECK_ID tx Text04ae ; deck name @@ -4270,7 +4270,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $28 ; ? - db $17 ; ? + db COIN_LUGIA ; coin db BLAZING_FLAME_DECK_ID tx Text046c ; deck name @@ -4281,7 +4281,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $28 ; ? - db $17 ; ? + db COIN_LUGIA ; coin db DAMAGE_CHAOS_DECK_ID tx Text04a7 ; deck name @@ -4292,7 +4292,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $28 ; ? - db $17 ; ? + db COIN_LUGIA ; coin db BIG_THUNDER_DECK_ID tx Text04c0 ; deck name @@ -4303,7 +4303,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $28 ; ? - db $17 ; ? + db COIN_LUGIA ; coin db POWER_OF_DARKNESS_DECK_ID tx Text0436 ; deck name @@ -4314,7 +4314,7 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $28 ; ? - db $17 ; ? + db COIN_LUGIA ; coin db POISON_STORM_DECK_ID tx Text04c9 ; deck name @@ -4325,6 +4325,6 @@ DeckIDData: db $00 ; ? db MUSIC_GRDUELTHEME_2 ; duel theme db $28 ; ? - db $17 ; ? + db COIN_LUGIA ; coin db $ff ; end diff --git a/src/engine/bank1a.asm b/src/engine/bank1a.asm index e4c272d..0a1f196 100644 --- a/src/engine/bank1a.asm +++ b/src/engine/bank1a.asm @@ -32,6 +32,66 @@ Func_6809a: ret ; 0x680a0 +SECTION "Bank 1a@42f4", ROMX[$42f4], BANK[$1a] + +; applies HP recovery on Pokemon after an attack +; with HP recovery effect, and handles its animation. +; input: +; d = damage effectiveness +; e = HP amount to recover +ApplyAndAnimateHPRecovery: + push de + ld hl, wccbd + ld [hl], e + inc hl + ld [hl], d + +; get Arena card's damage + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + pop de + or a + ret z ; return if no damage + +; load correct animation + push de + ld a, ATK_ANIM_HEAL + ld [wLoadedAttackAnimation], a + farcall ResetAttackAnimationIsPlaying + + ldh a, [hWhoseTurn] + ld h, a + lb bc, PLAY_AREA_ARENA, $1 ; arrow + farcall PlayAttackAnimation + +; compare HP to be restored with max HP +; if HP to be restored would cause HP to +; be larger than max HP, cap it accordingly + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + ld b, $00 + pop de + ld a, DUELVARS_ARENA_CARD_HP + get_turn_duelist_var + add e + ld e, a + ld a, 0 + adc d + ld d, a + ; de = damage dealt + current HP + ; bc = max HP of card + call CompareDEtoBC + jr c, .skip_cap + ; cap de to value in bc + ld e, c + ld d, b + +.skip_cap + ld [hl], e ; apply new HP to arena card + farcall WaitAttackAnimation + ret +; 0x68335 + SECTION "Bank 1a@43ec", ROMX[$43ec], BANK[$1a] ; makes a list in wDuelTempList with the deck indices diff --git a/src/home/duel.asm b/src/home/duel.asm index f520436..41cc6be 100644 --- a/src/home/duel.asm +++ b/src/home/duel.asm @@ -1369,7 +1369,7 @@ UseAttackOrPokemonPower:: PlayAttackAnimation_DealAttackDamage: call Func_14f1 bank1call SetDarkWaveAndDarknessVeilDamageModifiers - farcall Func_18a14 + farcall ResetAttackAnimationIsPlaying ld a, [wLoadedAttackCategory] and RESIDUAL jr nz, .deal_damage @@ -1398,9 +1398,9 @@ PlayAttackAnimation_DealAttackDamage: call GetNonTurnDuelistVariable push de push hl - farcall $6, $4ac1 ; PlayAttackAnimation - farcall $6, $4a19 ; Func_741a - farcall $6, $4ab1 ; WaitAttackAnimation + farcall PlayAttackAnimation + farcall $6, $4a19 ; PlayStatusConditionQueueAnimations + farcall WaitAttackAnimation pop hl pop de call SubtractHP @@ -1485,7 +1485,7 @@ HandleConfusionDamageToSelf: ; use Pokemon Power UsePokemonPower: call ClearTwoTurnDuelVars - farcall Func_18a14 + farcall ResetAttackAnimationIsPlaying ld a, EFFECTCMDTYPE_INITIAL_EFFECT_2 call TryExecuteEffectCommandFunction jr c, DrawWideTextBox_WaitForInput_ReturnCarry @@ -1631,7 +1631,7 @@ DealConfusionDamageToSelf: ld [wNoDamageOrEffect], a ld a, $01 ld [wIsDamageToSelf], a - farcall Func_18a14 + farcall ResetAttackAnimationIsPlaying ld hl, wTempNonTurnDuelistCardID ld e, [hl] inc hl diff --git a/src/home/unsorted.asm b/src/home/unsorted.asm index d3d4597..4747487 100644 --- a/src/home/unsorted.asm +++ b/src/home/unsorted.asm @@ -885,10 +885,10 @@ CallMappedFunction:: scf ret -Func_355c:: +CallHL2:: jp hl -Func_355d:: +CallBC:: push bc ret @@ -1750,7 +1750,7 @@ GetFramesetData:: ld a, d xor $ff inc a - ld d, a + ld d, a ; d = -d .asm_39ba ld a, [wd970] bit 6, a @@ -1758,7 +1758,7 @@ GetFramesetData:: ld a, e xor $ff inc a - ld e, a + ld e, a ; e = -e .asm_39c6 pop af call BankswitchROM @@ -1901,12 +1901,12 @@ Func_3a81:: push bc push de push hl - farcall $7, $6088 - ld a, [$dcea] + farcall Func_1e088 + ld a, [wActiveScreenAnim] cp $ff - jr nz, .asm_3a94 + jr nz, .skip_update_sprites farcall UpdateSpriteAnims -.asm_3a94 +.skip_update_sprites pop hl pop de pop bc @@ -2258,8 +2258,8 @@ FinishQueuedAnimations:: .asm_3c60 xor a ld [wdc57], a - ld [wdc5e + 0], a - ld [wdc5e + 1], a + ld [wDuelAnimBufferSize], a + ld [wDuelAnimBufferCurPos], a farcall Func_1dfb9 pop af ret @@ -2270,66 +2270,72 @@ FinishQueuedAnimations:: ; input: ; - a = animation index PlayDuelAnimation:: - ld [$dce2], a - call Func_3c77 + ld [wCurAnimation], a ; hold an animation temporarily + call .LoadDuelAnimationToBuffer ret -Func_3c77:: +.LoadDuelAnimationToBuffer: ldh a, [hBankROM] push af - ld [$dce9], a - farcall $7, $5ff5 + ld [wDuelAnimReturnBank], a + farcall _LoadDuelAnimationToBuffer pop af call BankswitchROM ret -; return nc if wActiveScreenAnim, wd4c0, and wAnimationQueue[] are all equal to $ff -; nc means no animation is playing (or animation(s) has/have ended) +; return c if an animation is still playing CheckAnyAnimationPlaying:: - farcall $7, $6420 + farcall _CheckAnyAnimationPlaying scf ret nz ccf ret Func_3c8e:: - ld a, [$dce2] - cp $9e + ld a, [wCurAnimation] + cp DUEL_ANIM_158_UNUSED jr z, .asm_3ca8 - ld a, [$dce2] + ld a, [wCurAnimation] sub $96 add a ld c, a ld b, $00 - ld hl, Data_3cb3 + ld hl, .pointer_table add hl, bc ld a, [hli] ld h, [hl] ld l, a jp Func_3cc3 + .asm_3ca8 - ld a, [$dce6] + ld a, [wDuelAnimDamage] ld l, a - ld a, [$dce7] + ld a, [wDuelAnimDamage + 1] ld h, a jp Func_3cc3 -Data_3cb3:: - dw $4C62, $4CA0, $4D07, $4D0B - dw $4D0B, $4D0B, $4D0B, $4D0B +.pointer_table + dw SetScreenForDuelAnimation ; DUEL_ANIM_SET_SCREEN + dw PrintDamageText ; DUEL_ANIM_SHOW_DAMAGE + dw UpdateMainSceneHUD ; DUEL_ANIM_UPDATE_HUD + dw DuelAnim153 ; DUEL_ANIM_153_UNUSED + dw DuelAnim154 ; DUEL_ANIM_154_UNUSED + dw DuelAnim155 ; DUEL_ANIM_155_UNUSED + dw DuelAnim156 ; DUEL_ANIM_156_UNUSED + dw DuelAnim157 ; DUEL_ANIM_157_UNUSED Func_3cc3:: ld a, $ff - ld [$dcf0], a + ld [wdcf0], a ldh a, [hBankROM] push af - ld a, [$dce9] + ld a, [wDuelAnimReturnBank] call BankswitchROM - call Func_355c + call CallHL2 pop af call BankswitchROM xor a - ld [$dcf0], a + ld [wdcf0], a ret Func_3cdd:: @@ -2653,116 +2659,121 @@ Func_3e7a:: pop af ret -Func_3e87:: +; apply background scroll for lines 0 to 96 using the values at BGScrollData +; skip if wApplyBGScroll is non-0 +ApplyBackgroundScroll:: push af push hl + ldh a, [rSVBK] push af - ld a, $01 + ld a, BANK("WRAM1") ldh [rSVBK], a - call Func_3f53 + + call DisableInt_LYCoincidence ld hl, rSTAT - res 2, [hl] + res STAT_LYCFLAG, [hl] ; reset coincidence flag ei - ld hl, $de66 + ld hl, wApplyBGScroll ld a, [hl] or a - jr nz, .asm_3edd + jr nz, .done inc [hl] push bc push de xor a - ld [$de67], a -.asm_3ea7 - ld a, [$de67] + ld [wNextScrollLY], a +.ly_loop + ld a, [wNextScrollLY] ld b, a -.asm_3eab +.wait_ly ldh a, [rLY] cp $60 - jr nc, .asm_3ec8 - cp b - jr c, .asm_3eab - call Func_3f23 + jr nc, .ly_over_0x60 + cp b ; already hit LY=b? + jr c, .wait_ly + call GetNextBackgroundScroll ld hl, rSTAT -.asm_3eba - bit 1, [hl] - jr nz, .asm_3eba +.wait_hblank_or_vblank + bit STAT_BUSY, [hl] + jr nz, .wait_hblank_or_vblank ldh [rSCX], a ldh a, [rLY] inc a - ld [$de67], a - jr .asm_3ea7 -.asm_3ec8 + ld [wNextScrollLY], a + jr .ly_loop +.ly_over_0x60 xor a ldh [rSCX], a ld a, $00 ldh [rLYC], a - call Func_3f23 + call GetNextBackgroundScroll ldh [hSCX], a pop de pop bc xor a - ld [$de66], a - call Func_3f45 -.asm_3edd + ld [wApplyBGScroll], a + call EnableInt_LYCoincidence +.done pop af ldh [rSVBK], a pop hl pop af ret -Data_3ee3:: - db $00, $00, $00, $01, $01, $01, $02, $02 - db $02, $03, $03, $03, $03, $03, $03, $03 - db $04, $03, $03, $03, $03, $03, $03, $03 - db $02, $02, $02, $01, $01, $01, $00, $00 - db $00, $FF, $FF, $FF, $FE, $FE, $FE, $FD - db $FD, $FD, $FC, $FC, $FC, $FC, $FC, $FC - db $FB, $FC, $FC, $FC, $FC, $FC, $FC, $FD - db $FD, $FD, $FE, $FE, $FE, $FF, $FF, $FF +BGScrollData:: + db 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3 + db 4, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0 + db 0, -1, -1, -1, -2, -2, -2, -3, -3, -3, -4, -4, -4, -4, -4, -4 + db -5, -4, -4, -4, -4, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1, -1 -Func_3f23:: +; x = BGScrollData[(wVBlankCounter + a) & $3f] +; return, in register a, x rotated right [wBGScrollMod]-1 times (max 3 times) +GetNextBackgroundScroll:: ld hl, wVBlankCounter add [hl] and $3f ld c, a ld b, $00 - ld hl, Data_3ee3 + ld hl, BGScrollData add hl, bc - ld a, [$de65] + ld a, [wBGScrollMod] ld c, a ld a, [hl] dec c - jr z, .asm_3f44 + jr z, .done dec c - jr z, .asm_3f42 + jr z, .halve dec c - jr z, .asm_3f40 + jr z, .quarter +; effectively zero sra a -.asm_3f40 +.quarter sra a -.asm_3f42 +.halve sra a -.asm_3f44 +.done ret -Func_3f45:: +; enable lcdc interrupt on LYC=LC coincidence +EnableInt_LYCoincidence:: push hl ld hl, rSTAT - set 6, [hl] + set STAT_LYC, [hl] xor a ld hl, rIE - set 1, [hl] + set INT_LCD_STAT, [hl] pop hl ret -Func_3f53:: +; disable lcdc interrupt and the LYC=LC coincidence trigger +DisableInt_LYCoincidence:: push hl ld hl, rSTAT - res 6, [hl] + res STAT_LYC, [hl] xor a ld hl, rIE - res 1, [hl] + res INT_LCD_STAT, [hl] pop hl ret diff --git a/src/macros.asm b/src/macros.asm index 1e8b1a3..200896b 100644 --- a/src/macros.asm +++ b/src/macros.asm @@ -2,5 +2,6 @@ INCLUDE "macros/audio.asm" INCLUDE "macros/constants.asm" INCLUDE "macros/code.asm" INCLUDE "macros/data.asm" +INCLUDE "macros/animations.asm" INCLUDE "macros/text.asm" INCLUDE "macros/wram.asm" diff --git a/src/macros/animations.asm b/src/macros/animations.asm new file mode 100644 index 0000000..cf05b55 --- /dev/null +++ b/src/macros/animations.asm @@ -0,0 +1,38 @@ + const_def + + const ANIMCMD_END ; $0 +MACRO anim_end + db ANIMCMD_END +ENDM + + const ANIMCMD_NORMAL ; $1 +MACRO anim_normal + db ANIMCMD_NORMAL, \1 +ENDM + + const ANIMCMD_PLAYER_SIDE ; $2 +MACRO anim_player + db ANIMCMD_PLAYER_SIDE, \1 +ENDM + + const ANIMCMD_OPP_SIDE ; $3 +MACRO anim_opponent + db ANIMCMD_OPP_SIDE, \1 +ENDM + + const ANIMCMD_SET_SCREEN ; $4 +MACRO anim_screen + db ANIMCMD_SET_SCREEN, \1 +ENDM + + const ANIMCMD_PLAY_AREA ; $5 +MACRO anim_play_area + db ANIMCMD_PLAY_AREA, \1 +ENDM + + const ANIMCMD_END_UNUSED ; $6 +MACRO anim_end2 + db ANIMCMD_END_UNUSED +ENDM + +DEF NUM_ANIM_COMMANDS EQU const_value diff --git a/src/macros/constants.asm b/src/macros/constants.asm index a285758..72efb18 100644 --- a/src/macros/constants.asm +++ b/src/macros/constants.asm @@ -10,3 +10,11 @@ MACRO const DEF \1 EQU const_value DEF const_value = const_value + 1 ENDM + +MACRO const_skip + if _NARG > 0 + DEF const_value += \1 + else + DEF const_value += 1 + endc +ENDM diff --git a/src/wram.asm b/src/wram.asm index e3a9e85..2a855c2 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -636,10 +636,14 @@ wNPCDuelDeckID:: ; cc16 wDuelTheme:: ; cc17 ds $1 -wcc18:: ; cc18 +; which coin the opponent is using for this duel +; holds a COIN_* constant +wOppCoin:: ; cc18 ds $1 -wcc19:: ; cc19 +; which coin the player is using for this duel +; holds a COIN_* constant +wPlayerCoin:: ; cc19 ds $1 wcc1a:: ; cc1a @@ -686,6 +690,8 @@ wAIMinDamage:: ; cccb wAIMaxDamage:: ; cccc ds $1 +; only written, never read +wccbd:: ; cccd ds $2 ; damage dealt by an attack to a target @@ -1766,10 +1772,20 @@ wGlossaryMenu:: ; d0d1 wd0d2:: ; d0d2 ds $1 -wd0d3:: ; d0d3 +wAttackAnimationIsPlaying:: ; d0d3 ds $1 - ds $5 +wDamageAnimAmount:: ; d0d4 + ds $2 + +wDamageAnimPlayAreaLocation:: ; d0d6 + ds $1 + +wDamageAnimEffectiveness:: ; d0d7 + ds $1 + +wDamageAnimPlayAreaSide:: ; d0d8 + ds $1 ; buffer to store data that will be sent/received through IR wIRDataBuffer:: ; d0d9 @@ -2792,34 +2808,74 @@ wdc06:: ; dc06 ds $1 wdc08:: ; dc08 - ds $2 + ds $1 + +wdc09:: ; dc09 + ds $1 ds $5 -wdc0f:: ; dc0f +; store settings for animation enabled/disabled +; FALSE means enabled, TRUE means disabled +wAnimationsDisabled:: ; dc0f ds $1 - ds $47 +; temporarily holds the palettes from +; wBackgroundPalettesCGB +wTempBackgroundPalettesCGB:: ; dc10 + ds NUM_BACKGROUND_PALETTES palettes + + ds $7 wdc57:: ; dc57 ds $1 +wdc58:: ; dc58 ds $1 -wdc59:: ; dc59 +wNumActiveAnimations:: ; dc59 ds $1 - ds $4 +wdc5a:: ; dc5a + ds $1 -wdc5e:: ; dc5e - ds $2 + ds $1 + +wAnimFlags:: ; dc5c + ds $1 + +wAnimAllowedFlags:: ; dc5d + ds $1 -wdc60:: ; dc60 - ds $80 +wDuelAnimBufferSize:: ; dc5e + ds $1 + +wDuelAnimBufferCurPos:: ; dc5e + ds $1 + +wDuelAnimBuffer:: ; dc60 + duel_anim_struct wDuelAnim1 + duel_anim_struct wDuelAnim2 + duel_anim_struct wDuelAnim3 + duel_anim_struct wDuelAnim4 + duel_anim_struct wDuelAnim5 + duel_anim_struct wDuelAnim6 + duel_anim_struct wDuelAnim7 + duel_anim_struct wDuelAnim8 + duel_anim_struct wDuelAnim9 + duel_anim_struct wDuelAnim10 + duel_anim_struct wDuelAnim11 + duel_anim_struct wDuelAnim12 + duel_anim_struct wDuelAnim13 + duel_anim_struct wDuelAnim14 + duel_anim_struct wDuelAnim15 + duel_anim_struct wDuelAnim16 +wDuelAnimBufferEnd:: ds $2 -wdce2:: ; dce2 +; holds an animation to play +wCurAnimation:: ; dce2 ds $1 ; used to know what coordinate offsets to use to place animations @@ -2846,19 +2902,54 @@ wDuelAnimLocationParam:: ; dce5 wDuelAnimDamage:: ; dce6 ds $2 -wdce8:: ; dce8 +wDuelAnimSetScreen:: ; dce8 +wDuelAnimEffectiveness:: ds $1 +; bank number to return to after processing animation +wDuelAnimReturnBank:: ; dce9 ds $1 -wdcea:: ; dcea +wActiveScreenAnim:: ; dcea ds $1 - ds $5 +; pointer to a function to update +; the current screen animation +wScreenAnimUpdatePtr:: ; dceb + ds $2 + +; duration of the current screen animation +wScreenAnimDuration:: ; dced + ds $1 + +wdcee:: ; dcee + ds $2 wdcf0:: ; dcf0 ds $1 +wAnimationTileset:: ; dcf1 + ds $2 + +wAnimationSpriteAnim:: ; dcf3 + ds $2 + +wAnimationFrameset:: ; dcf5 + ds $2 + +wAnimationPalette:: ; dcf7 + ds $2 + +wAnimationDataFlags:: ; dcf9 + ds $1 + +wAnimationSFX:: ; dcfa + ds $1 + +; only written, always equals 0 +wAnimationUnknownParam:: ; dcfb + ds $1 + SECTION "WRAM1@dd02", WRAMX ; stores the player's result in a duel (0: win, 1: loss, 2: ???, -1: transmission error?) @@ -3028,7 +3119,19 @@ wPlayerName:: ; de54 wde64:: ; de64 ds $1 - ds $4 +; used by GetNextBackgroundScroll +wBGScrollMod:: ; de65 + ds $1 + +; used by ApplyBackgroundScroll +wApplyBGScroll:: ; de66 + ds $1 + +; used by ApplyBackgroundScroll +wNextScrollLY:: ; de67 + ds $1 + + ds $1 wde69:: ; de69 ds $2 From 14aeab18b9c87a21bb9842f517692049a3641ebe Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Thu, 5 Jun 2025 12:01:38 +0100 Subject: [PATCH 2/2] Some anim corrections --- src/constants/animation_constants.asm | 2 +- src/constants/attack_animation_constants.asm | 2 +- src/constants/sprite_anim_constants.asm | 16 +++--- src/engine/bank06.asm | 2 +- src/engine/bank07.asm | 54 ++++++++++---------- src/home/unsorted.asm | 12 ++--- 6 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/constants/animation_constants.asm b/src/constants/animation_constants.asm index e3f2507..22748fa 100644 --- a/src/constants/animation_constants.asm +++ b/src/constants/animation_constants.asm @@ -173,7 +173,7 @@ DEF DUEL_ANIM_STRUCT_ID RB ; $0 DEF DUEL_ANIM_STRUCT_SCREEN RB ; $1 DEF DUEL_ANIM_STRUCT_DUELIST_SIDE RB ; $2 DEF DUEL_ANIM_STRUCT_LOCATION_PARAM RB ; $3 -DEF DUEL_ANIM_STRUCT_DAMAGE Rw ; $4 +DEF DUEL_ANIM_STRUCT_DAMAGE RW ; $4 DEF DUEL_ANIM_STRUCT_UNKNOWN_2 RB ; $6 DEF DUEL_ANIM_STRUCT_BANK RB ; $7 DEF DUEL_ANIM_STRUCT_SIZE EQU _RS diff --git a/src/constants/attack_animation_constants.asm b/src/constants/attack_animation_constants.asm index 05e1335..414c536 100644 --- a/src/constants/attack_animation_constants.asm +++ b/src/constants/attack_animation_constants.asm @@ -257,4 +257,4 @@ const ATK_ANIM_SURPRISE_THUNDER ; $fc const ATK_ANIM_PUSH_ASIDE ; $fd const ATK_ANIM_BONE_HEADBUTT ; $fe - const ATK_ANIM_FF ; $ff + const ATK_ANIM_UNUSED_FF ; $ff diff --git a/src/constants/sprite_anim_constants.asm b/src/constants/sprite_anim_constants.asm index 5e4887b..028a750 100644 --- a/src/constants/sprite_anim_constants.asm +++ b/src/constants/sprite_anim_constants.asm @@ -599,20 +599,20 @@ DEF SPRITEANIMSTRUCT_DIR_MASK EQU %00001110 ; wAnimationDataFlags and wAnimFlags values const_def - const SPRITE_ANIM_FLAG_X_FLIP_F ; $0 - const SPRITE_ANIM_FLAG_Y_FLIP_F ; $1 + const SPRITE_ANIM_FLAG_X_INVERTED_F ; $0 + const SPRITE_ANIM_FLAG_Y_INVERTED_F ; $1 const SPRITE_ANIM_FLAG_CENTERED_F ; $2 const SPRITE_ANIM_FLAG_3_F ; $3 const SPRITE_ANIM_FLAG_8x16_F ; $4 - const SPRITE_ANIM_FLAG_X_INVERTED_F ; $5 - const SPRITE_ANIM_FLAG_Y_INVERTED_F ; $6 + const SPRITE_ANIM_FLAG_X_FLIP_F ; $5 + const SPRITE_ANIM_FLAG_Y_FLIP_F ; $6 const SPRITE_ANIM_FLAG_UNSKIPPABLE_F ; $7 -DEF SPRITE_ANIM_FLAG_X_FLIP EQU 1 << SPRITE_ANIM_FLAG_X_FLIP_F -DEF SPRITE_ANIM_FLAG_Y_FLIP EQU 1 << SPRITE_ANIM_FLAG_Y_FLIP_F +DEF SPRITE_ANIM_FLAG_X_INVERTED EQU 1 << SPRITE_ANIM_FLAG_X_INVERTED_F +DEF SPRITE_ANIM_FLAG_Y_INVERTED EQU 1 << SPRITE_ANIM_FLAG_Y_INVERTED_F DEF SPRITE_ANIM_FLAG_CENTERED EQU 1 << SPRITE_ANIM_FLAG_CENTERED_F DEF SPRITE_ANIM_FLAG_3 EQU 1 << SPRITE_ANIM_FLAG_3_F DEF SPRITE_ANIM_FLAG_8x16 EQU 1 << SPRITE_ANIM_FLAG_8x16_F -DEF SPRITE_ANIM_FLAG_X_INVERTED EQU 1 << SPRITE_ANIM_FLAG_X_INVERTED_F -DEF SPRITE_ANIM_FLAG_Y_INVERTED EQU 1 << SPRITE_ANIM_FLAG_Y_INVERTED_F +DEF SPRITE_ANIM_FLAG_X_FLIP EQU 1 << SPRITE_ANIM_FLAG_X_FLIP_F +DEF SPRITE_ANIM_FLAG_Y_FLIP EQU 1 << SPRITE_ANIM_FLAG_Y_FLIP_F DEF SPRITE_ANIM_FLAG_UNSKIPPABLE EQU 1 << SPRITE_ANIM_FLAG_UNSKIPPABLE_F diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm index 3f0ca20..d3c63a4 100644 --- a/src/engine/bank06.asm +++ b/src/engine/bank06.asm @@ -687,7 +687,7 @@ PointerTable_AttackAnimation: dw AttackAnimation_SurpriseThunder ; ATK_ANIM_SURPRISE_THUNDER dw AttackAnimation_PushAside ; ATK_ANIM_PUSH_ASIDE dw AttackAnimation_BoneHeadbutt ; ATK_ANIM_BONE_HEADBUTT - dw AttackAnimation_UnusedFF ; ATK_ANIM_FF + dw AttackAnimation_UnusedFF ; ATK_ANIM_UNUSED_FF AttackAnimation_Hit: AttackAnimation_Earthquake: diff --git a/src/engine/bank07.asm b/src/engine/bank07.asm index a2ff99a..cf3322c 100644 --- a/src/engine/bank07.asm +++ b/src/engine/bank07.asm @@ -2806,9 +2806,9 @@ Func_1e171: farcall Func_10989 farcall Func_1098d ld a, [wAnimAllowedFlags] - and SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED + and SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP farcall Func_10989 - bit SPRITE_ANIM_FLAG_Y_INVERTED_F, a + bit SPRITE_ANIM_FLAG_Y_FLIP_F, a jr z, .asm_1e234 push af ld a, e @@ -2823,7 +2823,7 @@ Func_1e171: .asm_1e233 pop af .asm_1e234 - bit SPRITE_ANIM_FLAG_X_INVERTED_F, a + bit SPRITE_ANIM_FLAG_X_FLIP_F, a jr z, .asm_1e23e push af ld a, d @@ -2831,7 +2831,7 @@ Func_1e171: ld d, a pop af .asm_1e23e - and SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP + and SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED swap a sla a farcall Func_1098d @@ -3038,7 +3038,7 @@ GetAnimCoordsAndFlags: .centered ; if centered and y inverted/flipped ld a, [wAnimFlags] - cp SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_Y_INVERTED + cp SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_Y_FLIP jr nz, .calc_addr ld a, [wDuelAnimDuelistSide] cp PLAYER_TURN @@ -3079,11 +3079,11 @@ AnimationCoordinatesIndex: AnimationCoordinates: ; x coord, y coord, animation flags db 88, 88, NONE ; $0 - db 88, 56, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_Y_INVERTED ; $1 + db 88, 56, SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_Y_FLIP ; $1 ; animations in the Duel Main Scene db 40, 80, NONE ; $2 - db 136, 48, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED ; $3 + db 136, 48, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP ; $3 ; animations in the Player's Play Area, for each Play Area Pokemon db 88, 72, NONE ; $4 @@ -3958,9 +3958,9 @@ Animations: ; DUEL_ANIM_LEER animation TILESET_EVIL_EYES, SPRITE_ANIM_14, FRAMESET_027, PALETTE_0EC, NONE, SFX_26, $00 ; DUEL_ANIM_BEAM - animation TILESET_BEAM, SPRITE_ANIM_15, FRAMESET_028, PALETTE_0ED, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_27, $00 + animation TILESET_BEAM, SPRITE_ANIM_15, FRAMESET_028, PALETTE_0ED, SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_Y_FLIP, SFX_27, $00 ; DUEL_ANIM_HYPER_BEAM - animation TILESET_HYPER_BEAM, SPRITE_ANIM_16, FRAMESET_029, PALETTE_0EE, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_28, $00 + animation TILESET_HYPER_BEAM, SPRITE_ANIM_16, FRAMESET_029, PALETTE_0EE, SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_Y_FLIP, SFX_28, $00 ; DUEL_ANIM_ROCK_THROW animation TILESET_ROCK, SPRITE_ANIM_17, FRAMESET_02A, PALETTE_0EF, NONE, SFX_29, $00 ; DUEL_ANIM_STONE_BARRAGE @@ -3972,7 +3972,7 @@ Animations: ; DUEL_ANIM_FIRE_PUNCH animation TILESET_PUNCH, SPRITE_ANIM_18, FRAMESET_02E, PALETTE_0F0, NONE, SFX_53, $00 ; DUEL_ANIM_STRETCH_KICK - animation TILESET_STRETCH_KICK, SPRITE_ANIM_19, FRAMESET_02F, PALETTE_0F1, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_2C, $00 + animation TILESET_STRETCH_KICK, SPRITE_ANIM_19, FRAMESET_02F, PALETTE_0F1, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_X_FLIP, SFX_2C, $00 ; DUEL_ANIM_SLASH animation TILESET_SLASH, SPRITE_ANIM_1A, FRAMESET_030, PALETTE_0F2, NONE, SFX_2D, $00 ; DUEL_ANIM_WHIP @@ -3982,7 +3982,7 @@ Animations: ; DUEL_ANIM_FURY_SWIPES animation TILESET_SLASH, SPRITE_ANIM_1A, FRAMESET_031, PALETTE_0F2, NONE, SFX_2F, $00 ; DUEL_ANIM_DRILL - animation TILESET_HORN_DRILL, SPRITE_ANIM_1D, FRAMESET_034, PALETTE_0F5, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_30, $00 + animation TILESET_HORN_DRILL, SPRITE_ANIM_1D, FRAMESET_034, PALETTE_0F5, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_X_FLIP, SFX_30, $00 ; DUEL_ANIM_POT_SMASH animation TILESET_POT_SMASH, SPRITE_ANIM_1E, FRAMESET_035, PALETTE_0F6, NONE, SFX_31, $00 ; DUEL_ANIM_BONEMERANG @@ -4004,7 +4004,7 @@ Animations: ; DUEL_ANIM_BOYFRIENDS animation TILESET_HEART, SPRITE_ANIM_27, FRAMESET_03E, PALETTE_0FF, NONE, SFX_3A, $00 ; DUEL_ANIM_LURE - animation TILESET_LURE, SPRITE_ANIM_28, FRAMESET_03F, PALETTE_100, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_3B, $00 + animation TILESET_LURE, SPRITE_ANIM_28, FRAMESET_03F, PALETTE_100, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_X_FLIP, SFX_3B, $00 ; DUEL_ANIM_TOXIC animation TILESET_SKULL, SPRITE_ANIM_29, FRAMESET_040, PALETTE_101, NONE, SFX_3C, $00 ; DUEL_ANIM_CONFUSE_RAY @@ -4108,15 +4108,15 @@ Animations: ; DUEL_ANIM_63 animation TILESET_HIT, SPRITE_ANIM_00, FRAMESET_000, PALETTE_0D8, SPRITE_ANIM_FLAG_UNSKIPPABLE, SFX_2E, $00 ; DUEL_ANIM_64 - animation TILESET_FIREBALLS, SPRITE_ANIM_3B, FRAMESET_056, PALETTE_114, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_64, $00 + animation TILESET_FIREBALLS, SPRITE_ANIM_3B, FRAMESET_056, PALETTE_114, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP, SFX_64, $00 ; DUEL_ANIM_65 - animation TILESET_FIREBALLS, SPRITE_ANIM_3B, FRAMESET_057, PALETTE_114, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_65, $00 + animation TILESET_FIREBALLS, SPRITE_ANIM_3B, FRAMESET_057, PALETTE_114, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP, SFX_65, $00 ; DUEL_ANIM_66 - animation TILESET_BENCH_MANIP, SPRITE_ANIM_3C, FRAMESET_058, PALETTE_115, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_66, $00 + animation TILESET_BENCH_MANIP, SPRITE_ANIM_3C, FRAMESET_058, PALETTE_115, SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_CENTERED | SPRITE_ANIM_FLAG_Y_FLIP, SFX_66, $00 ; DUEL_ANIM_67 - animation TILESET_PSYCHIC_BEAM, SPRITE_ANIM_3D, FRAMESET_059, PALETTE_116, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_67, $00 + animation TILESET_PSYCHIC_BEAM, SPRITE_ANIM_3D, FRAMESET_059, PALETTE_116, SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_Y_FLIP, SFX_67, $00 ; DUEL_ANIM_68 - animation TILESET_BENCH_PSYCHIC_BEAM, SPRITE_ANIM_3E, FRAMESET_05A, PALETTE_117, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_3 | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_68, $00 + animation TILESET_BENCH_PSYCHIC_BEAM, SPRITE_ANIM_3E, FRAMESET_05A, PALETTE_117, SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_3 | SPRITE_ANIM_FLAG_Y_FLIP, SFX_68, $00 ; DUEL_ANIM_69 animation TILESET_ROCK_THROW, SPRITE_ANIM_3F, FRAMESET_05B, PALETTE_118, NONE, SFX_69, $00 ; DUEL_ANIM_6A @@ -4132,13 +4132,13 @@ Animations: ; DUEL_ANIM_6F animation TILESET_TAIL_SLAP, SPRITE_ANIM_45, FRAMESET_061, PALETTE_11E, NONE, SFX_6F, $00 ; DUEL_ANIM_70 - animation TILESET_TAIL_WHIP, SPRITE_ANIM_46, FRAMESET_062, PALETTE_11F, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_70, $00 + animation TILESET_TAIL_WHIP, SPRITE_ANIM_46, FRAMESET_062, PALETTE_11F, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_X_FLIP, SFX_70, $00 ; DUEL_ANIM_71 animation TILESET_SLAP, SPRITE_ANIM_47, FRAMESET_063, PALETTE_120, NONE, SFX_71, $00 ; DUEL_ANIM_72 animation TILESET_QUESTION_MARK_SMALL, SPRITE_ANIM_48, FRAMESET_064, PALETTE_121, NONE, SFX_72, $00 ; DUEL_ANIM_73 - animation TILESET_SKULL_BASH, SPRITE_ANIM_49, FRAMESET_065, PALETTE_122, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_73, $00 + animation TILESET_SKULL_BASH, SPRITE_ANIM_49, FRAMESET_065, PALETTE_122, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_X_FLIP, SFX_73, $00 ; DUEL_ANIM_74 animation TILESET_COIN_HURL, SPRITE_ANIM_4A, FRAMESET_066, PALETTE_123, NONE, SFX_74, $00 ; DUEL_ANIM_75 @@ -4146,15 +4146,15 @@ Animations: ; DUEL_ANIM_76 animation TILESET_FOLLOW_ME, SPRITE_ANIM_4C, FRAMESET_069, PALETTE_125, NONE, SFX_76, $00 ; DUEL_ANIM_77 - animation TILESET_SWIFT, SPRITE_ANIM_4D, FRAMESET_06A, PALETTE_126, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_77, $00 + animation TILESET_SWIFT, SPRITE_ANIM_4D, FRAMESET_06A, PALETTE_126, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_X_FLIP, SFX_77, $00 ; DUEL_ANIM_78 animation TILESET_3D_ATTACK, SPRITE_ANIM_4E, FRAMESET_06B, PALETTE_127, NONE, SFX_78, $00 ; DUEL_ANIM_79 animation TILESET_WATER_DROP, SPRITE_ANIM_0E, FRAMESET_021, PALETTE_0E6, SPRITE_ANIM_FLAG_CENTERED, SFX_79, $00 ; DUEL_ANIM_7A - animation TILESET_FOCUS_BLAST, SPRITE_ANIM_50, FRAMESET_06D, PALETTE_129, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_7A, $00 + animation TILESET_FOCUS_BLAST, SPRITE_ANIM_50, FRAMESET_06D, PALETTE_129, SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_Y_FLIP, SFX_7A, $00 ; DUEL_ANIM_7B - animation TILESET_FOCUS_BLAST_BENCH, SPRITE_ANIM_51, FRAMESET_06E, PALETTE_12A, SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_3 | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_7B, $00 + animation TILESET_FOCUS_BLAST_BENCH, SPRITE_ANIM_51, FRAMESET_06E, PALETTE_12A, SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_3 | SPRITE_ANIM_FLAG_Y_FLIP, SFX_7B, $00 ; DUEL_ANIM_7C animation TILESET_BONE2, SPRITE_ANIM_52, FRAMESET_06F, PALETTE_12B, NONE, SFX_8C, $00 ; DUEL_ANIM_7D @@ -4162,18 +4162,18 @@ Animations: ; DUEL_ANIM_7E animation TILESET_BIG_SNORE, SPRITE_ANIM_53, FRAMESET_070, PALETTE_12C, NONE, SFX_8E, $00 ; DUEL_ANIM_7F - animation TILESET_RAZOR_LEAF, SPRITE_ANIM_54, FRAMESET_071, PALETTE_12D, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_92, $00 + animation TILESET_RAZOR_LEAF, SPRITE_ANIM_54, FRAMESET_071, PALETTE_12D, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_X_FLIP, SFX_92, $00 ; DUEL_ANIM_80 animation TILESET_GUILLOTINE, SPRITE_ANIM_55, FRAMESET_072, PALETTE_12E, NONE, SFX_93, $00 ; DUEL_ANIM_81 - animation TILESET_VINE_PULL, SPRITE_ANIM_56, FRAMESET_073, PALETTE_12F, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP | SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED, SFX_94, $00 + animation TILESET_VINE_PULL, SPRITE_ANIM_56, FRAMESET_073, PALETTE_12F, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_Y_INVERTED | SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_Y_FLIP, SFX_94, $00 ; DUEL_ANIM_82 animation TILESET_PERPLEX, SPRITE_ANIM_57, FRAMESET_074, PALETTE_130, NONE, SFX_95, $00 ; DUEL_ANIM_83 animation TILESET_NINE_TAILS, SPRITE_ANIM_58, FRAMESET_075, PALETTE_131, NONE, SFX_96, $00 ; DUEL_ANIM_84 - animation TILESET_BONE_HEADBUTT, SPRITE_ANIM_59, FRAMESET_076, PALETTE_132, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_97, $00 + animation TILESET_BONE_HEADBUTT, SPRITE_ANIM_59, FRAMESET_076, PALETTE_132, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_X_FLIP, SFX_97, $00 ; DUEL_ANIM_85 - animation TILESET_DRILL_DIVE, SPRITE_ANIM_5A, FRAMESET_077, PALETTE_133, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_98, $00 + animation TILESET_DRILL_DIVE, SPRITE_ANIM_5A, FRAMESET_077, PALETTE_133, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_X_FLIP, SFX_98, $00 ; DUEL_ANIM_86 - animation TILESET_DARK_SONG, SPRITE_ANIM_5B, FRAMESET_078, PALETTE_134, SPRITE_ANIM_FLAG_X_FLIP | SPRITE_ANIM_FLAG_X_INVERTED, SFX_99, $00 + animation TILESET_DARK_SONG, SPRITE_ANIM_5B, FRAMESET_078, PALETTE_134, SPRITE_ANIM_FLAG_X_INVERTED | SPRITE_ANIM_FLAG_X_FLIP, SFX_99, $00 diff --git a/src/home/unsorted.asm b/src/home/unsorted.asm index 4747487..15d8917 100644 --- a/src/home/unsorted.asm +++ b/src/home/unsorted.asm @@ -1665,13 +1665,13 @@ Func_3924:: add e ld e, a ld a, [wd96f] - bit 6, a - jr z, .asm_3953 + bit SPRITE_ANIM_FLAG_Y_FLIP_F, a + jr z, .got_y ld a, e xor $ff inc a ld e, a -.asm_3953 +.got_y ldh a, [hSCY] ld c, a ld a, e @@ -1682,13 +1682,13 @@ Func_3924:: add d ld d, a ld a, [wd96f] - bit 5, a - jr z, .asm_3968 + bit SPRITE_ANIM_FLAG_X_FLIP_F, a + jr z, .got_x ld a, d xor $ff inc a ld d, a -.asm_3968 +.got_x ldh a, [hSCX] ld c, a ld a, d