INCROM $1c000, $1c056 Func_1c056: ; 1c056 (7:4056) push hl push bc push de ld a, [wCurMap] add a ld c, a ld b, $0 ld hl, WarpDataPointers add hl, bc ld a, [hli] ld h, [hl] ld l, a ld bc, $0005 ld a, [wPlayerXCoord] ld d, a ld a, [wPlayerYCoord] ld e, a .asm_1c072 ld a, [hli] or [hl] jr z, .asm_1c095 ld a, [hld] cp e jr nz, .asm_1c07e ld a, [hl] cp d jr z, .asm_1c081 .asm_1c07e add hl, bc jr .asm_1c072 .asm_1c081 inc hl inc hl ld a, [hli] ld [wTempMap], a ld a, [hli] ld [wTempPlayerXCoord], a ld a, [hli] ld [wTempPlayerYCoord], a ld a, [wPlayerDirection] ld [wTempPlayerDirection], a .asm_1c095 pop de pop bc pop hl ret INCLUDE "data/warps.asm" Func_1c33b: ; 1c33b (7:433b) push hl push bc push de ld a, [wCurMap] add a ld c, a add a add c ld c, a ld b, $0 ld hl, MapHeaders add hl, bc ld a, [hli] ld [wd131], a ld a, [hli] ld c, a ld a, [hli] ld [wd28f], a ld a, [hli] ld [wd132], a ld a, [hli] ld [wd290], a ld a, [hli] ld [wd111], a ld a, [wConsole] cp $2 jr nz, .asm_1c370 ld a, c or a jr z, .asm_1c370 ld [wd131], a .asm_1c370 pop de pop bc pop hl ret INCLUDE "data/map_headers.asm" Func_1c440: ; 1c440 (7:4440) INCROM $1c440, $1c455 GetNPCDirection: ; 1c455 (7:4455) push hl ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_DIRECTION call GetItemInLoadedNPCIndex ld a, [hl] pop hl ret Func_1c461: ; 1c461 (7:4461) push hl push bc call Func_1c719 ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_COORD_X call GetItemInLoadedNPCIndex ld a, b ld [hli], a ld [hl], c call Func_1c6e3 pop bc pop hl ret Func_1c477: ; 1c477 (7:4477) push hl ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_COORD_X call GetItemInLoadedNPCIndex ld a, [hli] ld b, a ld c, [hl] pop hl ret ; Loads NPC Sprite Data Func_1c485: ; 1c485 (7:4485) push hl push bc push de xor a ld [wLoadedNPCTempIndex], a ld b, a ld c, LOADED_NPC_MAX ld hl, wLoadedNPCs ld de, LOADED_NPC_LENGTH .findEmptyIndexLoop ld a, [hl] or a jr z, .foundEmptyIndex add hl, de inc b dec c jr nz, .findEmptyIndexLoop ld hl, wLoadedNPCs debug_ret jr .exit .foundEmptyIndex ld a, b ld [wLoadedNPCTempIndex], a ld a, [wNPCSpriteID] farcall CreateSpriteAndAnimBufferEntry jr c, .exit ld a, [wLoadedNPCTempIndex] call GetLoadedNPCID push hl ld a, [wTempNPC] ld [hli], a ld a, [wWhichSprite] ld [hli], a ld a, [wLoadNPCXPos] ld [hli], a ld a, [wLoadNPCYPos] ld [hli], a ld a, [wLoadNPCDirection] ld [hli], a ld a, [wd3b2] ld [hli], a ld a, [wd3b1] ld [hli], a ld a, [wLoadNPCDirection] ld [hli], a call Func_1c58e call Func_1c5b9 ld hl, wd349 inc [hl] pop hl call Func_1c665 call Func_1c6e3 ld a, [wTempNPC] call Func_1c4fa jr nc, .exit ld a, $01 ld [wd3b8], a .exit pop de pop bc pop hl ret Func_1c4fa: ; 1c4fa (7:44fa) cp NPC_RONALD1 jr z, .asm_1c508 cp NPC_RONALD2 jr z, .asm_1c508 cp NPC_RONALD3 jr z, .asm_1c508 or a ret .asm_1c508 scf ret Func_1c50a: ; 1c50a (7:450a) push hl call Func_1c719 ld a, [wLoadedNPCTempIndex] call GetLoadedNPCID ld a, [hl] or a jr z, .asm_1c52c call Func_1c4fa jr nc, .asm_1c521 xor a ld [wd3b8], a .asm_1c521 xor a ld [hli], a ld a, [hl] farcall Func_129fd ld hl, wd349 dec [hl] .asm_1c52c pop hl ret Func_1c52e: ; 1c52e (7:452e) push hl push af ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_FIELD_07 call GetItemInLoadedNPCIndex pop af ld [hl], a call Func_1c5e9 pop hl ret Func_1c53f: ; 1c53f (7:453f) push hl push bc ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_DIRECTION call GetItemInLoadedNPCIndex ld a, [hl] ld bc, $0003 add hl, bc ld [hl], a push af call Func_1c5e9 pop af pop bc pop hl ret Func_1c557: ; 1c557 (7:4557) push bc ld c, a ld a, [wLoadedNPCTempIndex] push af ld a, [wTempNPC] push af ld a, c ld [wTempNPC], a ld c, $0 call FindLoadedNPC jr c, .asm_1c570 call Func_1c53f ld c, a .asm_1c570 pop af ld [wTempNPC], a pop af ld [wLoadedNPCTempIndex], a ld a, c pop bc ret Func_1c57b: ; 1c57b (7:457b) push hl push bc push af ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_FIELD_06 call GetItemInLoadedNPCIndex pop af ld [hl], a call Func_1c58e pop bc pop hl ret Func_1c58e: ; 1c58e (7:458e) push hl push bc ld a, [wWhichSprite] push af ld a, [wLoadedNPCTempIndex] call GetLoadedNPCID ld a, [hli] or a jr z, .quit ld a, [hl] ld [wWhichSprite], a ld bc, LOADED_NPC_FIELD_06 - LOADED_NPC_SPRITE add hl, bc ld a, [hld] bit 4, [hl] jr nz, .asm_1c5ae dec hl add [hl] inc hl .asm_1c5ae farcall StartNewSpriteAnimation .quit pop af ld [wWhichSprite], a pop bc pop hl ret Func_1c5b9: ; 1c5b9 (7:45b9) INCROM $1c5b9, $1c5e9 Func_1c5e9: ; 1c5e9 (7:45e9) push hl push bc ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_FIELD_07 call GetItemInLoadedNPCIndex ld a, [hl] ld bc, -3 add hl, bc ld [hl], a call Func_1c58e pop bc pop hl ret ; 0x1c5ff Func_1c5ff: ; 1c5ff (7:45ff) INCROM $1c5ff, $1c610 Func_1c610: ; 1c610 (7:4610) INCROM $1c610, $1c665 Func_1c665: ; 1c665 (7:4665) INCROM $1c665, $1c6e3 Func_1c6e3: ; 1c6e3 (7:46e3) push hl push bc ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_COORD_X call GetItemInLoadedNPCIndex ld a, [hli] ld b, a ld c, [hl] ld a, $40 call SetPermissionOfMapPosition pop bc pop hl ret Func_1c6f8: ; 1c6f8 (7:46f8) INCROM $1c6f8, $1c719 Func_1c719: ; 1c719 (7:4719) push hl push bc ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_COORD_X call GetItemInLoadedNPCIndex ld a, [hli] ld b, a ld c, [hl] ld a, $40 call UpdatePermissionOfMapPosition pop bc pop hl ret ; Find NPC at coords b (x) c (y) FindNPCAtLocation: ; 1c72e (7:472e) push hl push bc push de ld d, $00 ld e, LOADED_NPC_MAX ld hl, wLoadedNPC1CoordX .findValidNPCLoop ld a, [hli] cp b jr nz, .noValidNPCHere ld a, [hl] cp c jr nz, .noValidNPCHere push hl inc hl inc hl bit 6, [hl] pop hl jr nz, .noValidNPCHere push hl dec hl dec hl ld a, [hl] or a pop hl jr nz, .foundNPCExit .noValidNPCHere ld a, LOADED_NPC_LENGTH - 1 add l ld l, a ld a, h adc $00 ld h, a inc d dec e jr nz, .findValidNPCLoop scf jr .exit .foundNPCExit ld a, d ld [wLoadedNPCTempIndex], a or a .exit pop de pop bc pop hl ret ; Probably needs a new name. Loads data for NPC that the next Script is for ; Sets direction, Loads Image data for it, loads name, and more SetNewScriptNPC: ; 1c768 (7:4768) push hl ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_DIRECTION call GetItemInLoadedNPCIndex ld a, [wPlayerDirection] xor $02 ld [hl], a call Func_1c58e ld a, $02 farcall Func_c29b ld a, [wLoadedNPCTempIndex] call GetLoadedNPCID ld a, [hl] farcall GetNPCNameAndScript pop hl ret Func_1c78d: ; 1c78d (7:478d) push hl ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_FIELD_05 call GetItemInLoadedNPCIndex set 5, [hl] ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_FIELD_08 call GetItemInLoadedNPCIndex xor a ld [hli], a .asm_1c7a2 ld [hl], c inc hl ld [hl], b dec hl call Func_39ea cp $f0 jr nc, .asm_1c7bb push af and $7f call Func_1c5ff pop af bit 7, a jr z, .asm_1c7dc inc bc jr .asm_1c7a2 .asm_1c7bb cp $ff jr z, .asm_1c7d2 inc bc call Func_39ea push hl ld l, a ld h, $0 bit 7, l jr z, .asm_1c7cc dec h .asm_1c7cc add hl, bc ld c, l ld b, h pop hl jr .asm_1c7a2 .asm_1c7d2 ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_FIELD_05 call GetItemInLoadedNPCIndex res 5, [hl] .asm_1c7dc pop hl ret Func_1c7de: ; 1c7de (7:47de) ld a, [wc3b7] and $20 ret ; 0x1c7e4 INCROM $1c7e4, $1c82e Func_1c82e: ; 1c82e (7:482e) INCROM $1c82e, $1c83d Func_1c83d: ; 1c83d (7:483d) push hl push bc ld b, a ld c, $a ld hl, wd3bb .asm_1c845 ld a, [hl] or a jr z, .asm_1c853 cp b jr z, .asm_1c855 inc hl dec c jr nz, .asm_1c845 debug_ret jr .asm_1c855 .asm_1c853 ld a, b ld [hl], a .asm_1c855 pop bc pop hl ret Func_1c858: ; 1c858 (7:4858) INCROM $1c858, $1c8bc Func_1c8bc: ; 1c8bc (7:48bc) push hl push bc call Set_OBJ_8x8 ld a, LOW(Func_3ba2) ld [wDoFrameFunction], a ld a, HIGH(Func_3ba2) ld [wDoFrameFunction + 1], a ld a, $ff ld hl, wAnimationQueue ld c, ANIMATION_QUEUE_LENGTH .fill_queue ld [hli], a dec c jr nz, .fill_queue ld [wd42a], a ld [wd4c0], a xor a ld [wDuelAnimBufferCurPos], a ld [wDuelAnimBufferSize], a ld [wd4b3], a call DefaultScreenAnimationUpdate call Func_3ca0 pop bc pop hl ret ; 0x1c8ef PlayLoadedDuelAnimation: ; 1c8ef (7:48ef) ld a, [wDoFrameFunction + 0] cp LOW(Func_3ba2) jr nz, .error ld a, [wDoFrameFunction + 1] cp HIGH(Func_3ba2) jr z, .okay .error debug_ret ret .okay ld a, [wTempAnimation] ld [wd4bf], a cp DUEL_SPECIAL_ANIMS jp nc, Func_1cb5e push hl push bc push de call GetAnimationData ; hl: pointer ld a, [wAnimationsDisabled] or a jr z, .check_to_play_sfx ; animations are disabled push hl ld bc, ANIM_SPRITE_ANIM_FLAGS add hl, bc ld a, [hl] ; if flag is set, play animation anyway and (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) pop hl jr z, .return .check_to_play_sfx push hl ld bc, ANIM_SOUND_FX_ID add hl, bc ld a, [hl] pop hl or a jr z, .calc_addr call PlaySFX .calc_addr ; this data field is always $00, ; so this calculation is unnecessary ; seems like there was supposed to be ; more than 1 function to handle animation push hl ld bc, ANIM_HANDLER_FUNCTION add hl, bc ld a, [hl] rlca add LOW(.address) ; $48 ld l, a ; LO ld a, HIGH(.address) ; $49 adc 0 ld h, a ; HI ; hl: pointer ld a, [hli] ld b, [hl] ld c, a pop hl call CallBC .return pop de pop bc pop hl ret .address dw .handler_func .handler_func ; 1c94a (7:494a) ; if any of ANIM_SPRITE_ID, ANIM_PALETTE_ID and ANIM_SPRITE_ANIM_ID ; are 0, then return ld e, l ld d, h ld c, ANIM_SPRITE_ANIM_ID + 1 .loop ld a, [de] or a jr z, .return_with_carry inc de dec c jr nz, .loop ld a, [hli] ; ANIM_SPRITE_ID farcall CreateSpriteAndAnimBufferEntry ld a, [wWhichSprite] ld [wAnimationQueue], a ; push an animation to the queue xor a ld [wVRAMTileOffset], a ld [wd4cb], a ld a, [hli] ; ANIM_PALETTE_ID farcall LoadPaletteData ld a, [hli] ; ANIM_SPRITE_ANIM_ID push af ld a, [hli] ; ANIM_SPRITE_ANIM_FLAGS ld [wAnimFlags], a call LoadAnimCoordsAndFlags pop af farcall StartNewSpriteAnimation or a jr .done .return_with_carry scf .done ret ; loads the correct coordinates/flags for ; sprite animation in wAnimationQueue LoadAnimCoordsAndFlags: ; 1c980 (7:4980) push hl push bc ld a, [wAnimationQueue] ld c, SPRITE_ANIM_ATTRIBUTES call GetSpriteAnimBufferProperty_SpriteInA call GetAnimCoordsAndFlags push af and (1 << SPRITE_ANIM_FLAG_6) | (1 << SPRITE_ANIM_FLAG_5) or [hl] ld [hli], a ld a, b ld [hli], a ; SPRITE_ANIM_COORD_X ld [hl], c ; SPRITE_ANIM_COORD_Y pop af ld bc, SPRITE_ANIM_FLAGS - SPRITE_ANIM_COORD_Y add hl, bc ld c, a ; useless and (1 << SPRITE_ANIM_FLAG_Y_SUBTRACT) | (1 << SPRITE_ANIM_FLAG_X_SUBTRACT) or [hl] ld [hl], a pop bc pop hl ret ; outputs x and y coordinates for the sprite animation ; taking into account who the turn duelist is. ; also returns in a the allowed animation flags of ; the configuration that is selected. ; output: ; a = anim flags ; b = x coordinate ; c = y coordinate GetAnimCoordsAndFlags: ; 1c9a2 (7:49a2) push hl ld c, 0 ld a, [wAnimFlags] and (1 << SPRITE_ANIM_FLAG_SPEED) jr nz, .calc_addr 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] .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 b, [hl] ; x coord inc hl ld c, [hl] ; y coord inc hl ld a, [wAnimFlags] and [hl] ; flags pop hl ret AnimationCoordinatesIndex: ; animations in the Duel Main Scene db $01, $01, $01, $01, $01, $01 ; player db $02, $02, $02, $02, $02, $02 ; opponent ; animations in the Player's Play Area, for each Play Area Pokemon db $03, $04, $05, $06, $07, $08 ; player db $03, $04, $05, $06, $07, $08 ; opponent ; animations in the Opponent's Play Area, for each Play Area Pokemon db $09, $0a, $0b, $0c, $0d, $0e ; player db $09, $0a, $0b, $0c, $0d, $0e ; opponent anim_coords: MACRO db \1 db \2 db \3 ENDM AnimationCoordinates: ; x coord, y coord, animation flags anim_coords 88, 88, (1 << SPRITE_ANIM_FLAG_3) ; animations in the Duel Main Scene anim_coords 40, 80, $00 anim_coords 136, 48, (1 << SPRITE_ANIM_FLAG_6) | (1 << SPRITE_ANIM_FLAG_5) | (1 << SPRITE_ANIM_FLAG_Y_SUBTRACT) | (1 << SPRITE_ANIM_FLAG_X_SUBTRACT) ; animations in the Player's Play Area, for each Play Area Pokemon anim_coords 88, 72, $00 anim_coords 24, 96, $00 anim_coords 56, 96, $00 anim_coords 88, 96, $00 anim_coords 120, 96, $00 anim_coords 152, 96, $00 ; animations in the Opponent's Play Area, for each Play Area Pokemon anim_coords 88, 80, $00 anim_coords 152, 40, $00 anim_coords 120, 40, $00 anim_coords 88, 40, $00 anim_coords 56, 40, $00 anim_coords 24, 40, $00 ; appends to end of wDuelAnimBuffer ; the current duel animation LoadDuelAnimationToBuffer: ; 1ca31 (7:4a31) push hl push bc ld a, [wDuelAnimBufferCurPos] ld b, a ld hl, wDuelAnimBufferSize ld a, [hl] ld c, a add DUEL_ANIM_STRUCT_SIZE and %01111111 cp b jp z, .skip ld [hl], a ld b, $00 ld hl, wDuelAnimBuffer add hl, bc ld a, [wTempAnimation] ld [hli], a ld a, [wDuelAnimationScreen] ld [hli], a ld a, [wDuelAnimDuelistSide] ld [hli], a ld a, [wDuelAnimLocationParam] ld [hli], a ld a, [wDuelAnimDamage] ld [hli], a ld a, [wDuelAnimDamage + 1] ld [hli], a ld a, [wd4b3] ld [hli], a ld a, [wDuelAnimReturnBank] ld [hl], a .skip pop bc pop hl ret ; loads the animations from wDuelAnimBuffer ; in acending order, starting at wDuelAnimBufferCurPos PlayBufferedDuelAnimations: ; 1ca6e (7:4a6e) push hl push bc .next_duel_anim ld a, [wDuelAnimBufferSize] ld b, a ld a, [wDuelAnimBufferCurPos] cp b jr z, .skip ld c, a add DUEL_ANIM_STRUCT_SIZE and %01111111 ld [wDuelAnimBufferCurPos], a ld b, $00 ld hl, wDuelAnimBuffer add hl, bc ld a, [hli] ld [wTempAnimation], a ld a, [hli] ld [wDuelAnimationScreen], a ld a, [hli] ld [wDuelAnimDuelistSide], a ld a, [hli] ld [wDuelAnimLocationParam], a ld a, [hli] ld [wDuelAnimDamage], a ld a, [hli] ld [wDuelAnimDamage + 1], a ld a, [hli] ld [wd4b3], a ld a, [hl] ld [wDuelAnimReturnBank], a call PlayLoadedDuelAnimation call CheckAnyAnimationPlaying jr nc, .next_duel_anim .skip pop bc pop hl ret ; 0x1cab3 ; gets data from Animations for anim ID in a ; outputs the pointer to the data in hl GetAnimationData: ; 1cab3 (7:4ab3) push bc ld a, [wTempAnimation] ld l, a ld h, 0 add hl, hl ; hl = anim * 2 ld b, h ld c, l add hl, hl ; hl = anim * 4 add hl, bc ; hl = anim * 6 ld bc, Animations add hl, bc pop bc ret Func_1cac5: ; 1cac5 (7:4ac5) ld a, [wd42a] cp $ff jr nz, .asm_1cb03 ld a, [wd4c0] or a jr z, .asm_1cafb cp $80 jr z, .asm_1cb11 ld hl, wAnimationQueue ld c, ANIMATION_QUEUE_LENGTH .loop_queue push af push bc ld a, [hl] cp $ff jr z, .next ld [wWhichSprite], a farcall GetSpriteAnimCounter cp $ff jr nz, .next farcall Func_129fa ld a, $ff ld [hl], a .next pop bc pop af and [hl] inc hl dec c jr nz, .loop_queue .asm_1cafb cp $ff jr nz, .skip_play_anims call PlayBufferedDuelAnimations .skip_play_anims ret .asm_1cb03 ld hl, wScreenAnimUpdatePtr ld a, [hli] ld h, [hl] ld l, a call CallHL2 ld a, [wd42a] jr .asm_1cafb .asm_1cb11 ld a, $ff ld [wd4c0], a jr .asm_1cafb ; 0x1cb18 Func_1cb18: ; 1cb18 (7:4b18) push hl push bc push de ld a, [wDoFrameFunction] cp LOW(Func_3ba2) jr nz, .asm_1cb5b ld a, [wDoFrameFunction + 1] cp HIGH(Func_3ba2) jr nz, .asm_1cb5b ld a, $ff ld [wd4c0], a ld a, [wd42a] cp $ff call nz, Func_1ccd4 ld hl, wAnimationQueue ld c, $07 .asm_1cb3b push bc ld a, [hl] cp $ff jr z, .asm_1cb4b ld [wWhichSprite], a farcall Func_129fa ld a, $ff ld [hl], a .asm_1cb4b pop bc inc hl dec c jr nz, .asm_1cb3b xor a ld [wDuelAnimBufferCurPos], a ld [wDuelAnimBufferSize], a .asm_1cb57 pop de pop bc pop hl ret .asm_1cb5b scf jr .asm_1cb57 ; 0x1cb5e Func_1cb5e: ; 1cb5e (7:4b5e) cp $96 jp nc, Func_1ce03 cp $8c jp nz, InitScreenAnimation jr .asm_1cb6a ; redundant .asm_1cb6a ld a, [wDuelAnimDamage + 1] cp $03 jr nz, .asm_1cb76 ld a, [wDuelAnimDamage] cp $e8 .asm_1cb76 ret nc xor a ld [wd4b8], a ld [wVRAMTileOffset], a ld [wd4cb], a ld a, $25 farcall LoadPaletteData call Func_1cba6 ld hl, wd4b3 bit 0, [hl] call nz, Func_1cc3e ld a, $12 ld [wd4b8], a bit 1, [hl] call nz, Func_1cc4e bit 2, [hl] call nz, Func_1cc66 xor a ld [wd4b3], a ret ; 0x1cba6 Func_1cba6: ; 1cba6 (7:4ba6) call Func_1cc03 xor a ld [wd4b7], a ld hl, wd4b4 ld de, wAnimationQueue + 1 .asm_1cbb3 push hl push de ld a, [hl] or a jr z, .asm_1cbbc call Func_1cbcc .asm_1cbbc pop de pop hl inc hl inc de ld a, [wd4b7] inc a ld [wd4b7], a cp $03 jr c, .asm_1cbb3 ret ; 0x1cbcc Func_1cbcc: ; 1cbcc (7:4bcc) push af ld a, SPRITE_DUEL_4 farcall CreateSpriteAndAnimBufferEntry ld a, [wWhichSprite] ld [de], a ld a, (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) ld [wAnimFlags], a ld c, SPRITE_ANIM_COORD_X call GetSpriteAnimBufferProperty call GetAnimCoordsAndFlags ld a, [wd4b7] add -3 ld e, a ld a, $4b adc 0 ld d, a ld a, [de] add b ld [hli], a ; SPRITE_ANIM_COORD_X ld [hl], c ; SPRITE_ANIM_COORD_Y ld a, [wd4b8] ld c, a pop af farcall Func_12ac9 ret ; 0x1cbfd INCROM $1cbfd, $1cc03 Func_1cc03: ; 1cc03 (7:4c03) ld a, [wDuelAnimDamage] ld l, a ld a, [wDuelAnimDamage + 1] ld h, a ld de, wd4b4 ld bc, -100 call .Func_1cc2f ld bc, -10 call .Func_1cc2f ld a, l add $4f ld [de], a ld hl, wd4b4 ld c, 2 .asm_1cc23 ld a, [hl] cp $4f jr nz, .asm_1cc2e ld [hl], $00 inc hl dec c jr nz, .asm_1cc23 .asm_1cc2e ret ; 0x1cc2f .Func_1cc2f ld a, $4e .loop inc a add hl, bc jr c, .loop ld [de], a inc de ld a, l sub c ld l, a ld a, h sbc b ld h, a ret ; 0x1cc3e Func_1cc3e: ; 1cc3e (7:4c3e) push hl ld a, $03 ld [wd4b7], a ld de, wAnimationQueue + 4 ld a, $5b call Func_1cbcc pop hl ret ; 0x1cc4e Func_1cc4e: ; 1cc4e (7:4c4e) push hl ld a, $04 ld [wd4b7], a ld de, wAnimationQueue + 5 ld a, $5a call Func_1cbcc ld a, [wd4b8] add $12 ld [wd4b8], a pop hl ret ; 0x1cc66 Func_1cc66: ; 1cc66 (7:4c66) push hl ld a, $05 ld [wd4b7], a ld de, wAnimationQueue + 6 ld a, $59 call Func_1cbcc pop hl ret ; 0x1cc76 ; initializes a screen animation from wTempAnimation ; loads a function pointer for updating a frame ; and initializes the duration of the animation. InitScreenAnimation: ; 1cc76 (7:4c76) ld a, [wAnimationsDisabled] or a jr nz, .skip ld a, [wTempAnimation] ld [wd42a], a sub DUEL_SCREEN_ANIMS add a add a ld c, a ld b, $00 ld hl, Data_1cc9f 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 ; 0x1cc9f ; for the following animations, these functions ; are run with the corresponding duration. ; this duration decides different effects, ; depending on which function runs ; and is decreased by one each time. ; when it is down to 0, the animation is done. screen_effect: MACRO dw \1 ; function pointer db \2 ; duration db $00 ; padding ENDM Data_1cc9f: ; 1cc9f (7:4c9f) ; function pointer, duration screen_effect ShakeScreenX_Small, 24 ; DUEL_ANIM_SMALL_SHAKE_X screen_effect ShakeScreenX_Big, 32 ; DUEL_ANIM_BIG_SHAKE_X screen_effect ShakeScreenY_Small, 24 ; DUEL_ANIM_SMALL_SHAKE_Y screen_effect ShakeScreenY_Big, 32 ; DUEL_ANIM_BIG_SHAKE_Y screen_effect WhiteFlashScreen, 8 ; DUEL_ANIM_FLASH screen_effect DistortScreen, 63 ; DUEL_ANIM_DISTORT ; checks if screen animation duration is over ; and if so, loads the default update function LoadDefaultScreenAnimationUpdateWhenFinished: ; 1ccb7 (7:4cb7) ld a, [wScreenAnimDuration] or a ret nz ; fallthrough ; function called for the screen animation update when it is over DefaultScreenAnimationUpdate: ; 1ccbc (7:4cbc) ld a, $ff ld [wd42a], a 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 ; 0x1ccd4 Func_1ccd4: ; 1ccd4 (7:4cd4) ld a, 1 ld [wScreenAnimDuration], a ld hl, wScreenAnimUpdatePtr ld a, [hli] ld h, [hl] ld l, a call CallHL2 jr DefaultScreenAnimationUpdate ; 0x1cce4 ShakeScreenX_Small: ; 1cce4 (7:4ce4) ld hl, SmallShakeOffsets jr ShakeScreenX ShakeScreenX_Big: ; 1cce9 (7:4ce9) ld hl, BigShakeOffsets jr ShakeScreenX ShakeScreenX: ; 1ccee (7:4cee) ld a, l ld [wd4bc], a ld a, h ld [wd4bc + 1], a ld hl, wScreenAnimUpdatePtr ld [hl], LOW(.update) inc hl ld [hl], HIGH(.update) ret .update call DecrementScreenAnimDuration call UpdateShakeOffset jp nc, LoadDefaultScreenAnimationUpdateWhenFinished ldh a, [hSCX] add [hl] ldh [hSCX], a jp LoadDefaultScreenAnimationUpdateWhenFinished ; 0x1cd10 ShakeScreenY_Small: ; 1cd10 (7:4d10) ld hl, SmallShakeOffsets jr ShakeScreenY ShakeScreenY_Big: ; 1cd15 (7:4d15) ld hl, BigShakeOffsets jr ShakeScreenY ShakeScreenY: ; 1cd1a (7:4d1a) ld a, l ld [wd4bc], a ld a, h ld [wd4bc + 1], a ld hl, wScreenAnimUpdatePtr ld [hl], LOW(.update) inc hl ld [hl], HIGH(.update) ret .update call DecrementScreenAnimDuration call UpdateShakeOffset jp nc, LoadDefaultScreenAnimationUpdateWhenFinished ldh a, [hSCY] add [hl] ldh [hSCY], a jp LoadDefaultScreenAnimationUpdateWhenFinished ; 0x1cd3c ; get the displacement of the current frame ; depending on the value of wScreenAnimDuration ; returns carry if displacement was updated UpdateShakeOffset: ; 1cd3c (7:4d3c) ld hl, wd4bc ld a, [hli] ld h, [hl] ld l, a ld a, [wScreenAnimDuration] cp [hl] ret nc inc hl push hl inc hl ld a, l ld [wd4bc], a ld a, h ld [wd4bc + 1], a pop hl scf ret ; 0x1cd55 SmallShakeOffsets: ; 1cd55 (7:4d55) db 21, 2 db 17, -2 db 13, 2 db 9, -2 db 5, 1 db 1, -1 BigShakeOffsets: ; 1cd61 (7:4d61) db 29, 4 db 25, -4 db 21, 4 db 17, -4 db 13, 3 db 9, -3 db 5, 2 db 1, -2 DecrementScreenAnimDuration: ; 1cd71 (7:4d71) ld hl, wScreenAnimDuration dec [hl] ret ; 0x1cd76 WhiteFlashScreen: ; 1cd76 (7:4d76) ld hl, wScreenAnimUpdatePtr ld [hl], LOW(.update) inc hl ld [hl], HIGH(.update) ld a, [wBGP] ld [wd4bc], a ; backup the current background pals ld hl, wBackgroundPalettesCGB ld de, wTempBackgroundPalettesCGB ld bc, 8 palettes call CopyDataHLtoDE_SaveRegisters ld de, $7fff ; rgb 31, 31, 31 ld hl, wBackgroundPalettesCGB ld bc, (8 palettes) / 2 call FillMemoryWithDE xor a call SetBGP call FlushAllPalettes .update call DecrementScreenAnimDuration ld a, [wScreenAnimDuration] or a ret nz ; retreive the previous background pals ld hl, wTempBackgroundPalettesCGB ld de, wBackgroundPalettesCGB ld bc, 8 palettes call CopyDataHLtoDE_SaveRegisters ld a, [wd4bc] call SetBGP call FlushAllPalettes jp DefaultScreenAnimationUpdate ; 0x1cdc3 DistortScreen: ; 1cdc3 (7:4dc3) ld hl, wScreenAnimUpdatePtr ld [hl], LOW(.update) inc hl ld [hl], HIGH(.update) 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 .update 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 call DecrementScreenAnimDuration 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 ; 0x1ce03 Func_1ce03: ; 1ce03 (7:4e03) cp DUEL_ANIM_158 jr z, .asm_1ce17 sub $96 add a ld c, a ld b, $00 ld hl, .pointer_table add hl, bc ld a, [hli] ld h, [hl] ld l, a jp Func_3bb5 .asm_1ce17 ld a, [wDuelAnimDamage] ld l, a ld a, [wDuelAnimDamage + 1] ld h, a jp Func_3bb5 .pointer_table dw Func_190f4 ; DUEL_ANIM_150 dw PrintDamageText ; DUEL_ANIM_PRINT_DAMAGE dw UpdateMainSceneHUD ; DUEL_ANIM_UPDATE_HUD dw Func_191a3 ; DUEL_ANIM_153 dw Func_191a3 ; DUEL_ANIM_154 dw Func_191a3 ; DUEL_ANIM_155 dw Func_191a3 ; DUEL_ANIM_156 dw Func_191a3 ; DUEL_ANIM_157 INCLUDE "data/duel_animations.asm" Func_1d078: ; 1d078 (7:5078) ld a, [wd627] or a jr z, .asm_1d0c7 .asm_1d07e ld a, MUSIC_STOP call PlaySong call Func_3ca0 call Func_1d335 call Func_1d3ce xor a ld [wd635], a ld a, $3c ld [wd626], a .asm_1d095 call DoFrameIfLCDEnabled call UpdateRNGSources call Func_1d614 ld hl, wd635 inc [hl] call AssertSongFinished or a jr nz, .asm_1d0ae farcall Func_10ab4 jr .asm_1d07e .asm_1d0ae ld hl, wd626 ld a, [hl] or a jr z, .asm_1d0b8 dec [hl] jr .asm_1d095 .asm_1d0b8 ldh a, [hKeysPressed] and A_BUTTON | START jr z, .asm_1d095 ld a, SFX_02 call PlaySFX farcall Func_10ab4 .asm_1d0c7 call Func_1d0fa call Func_1d11c ld a, [wd628] cp $2 jr nz, .asm_1d0db call Func_1d289 jr c, Func_1d078 jr .asm_1d0e7 .asm_1d0db ld a, [wd628] cp $1 jr nz, .asm_1d0e7 call Func_1d2b8 jr c, Func_1d078 .asm_1d0e7 ld a, [wd628] cp $0 jr nz, .asm_1d0f3 call Func_1d2dd jr c, Func_1d078 .asm_1d0f3 call ResetDoFrameFunction call Func_3ca0 ret Func_1d0fa: ; 1d0fa (7:50fa) INCROM $1d0fa, $1d11c Func_1d11c: ; 1d11c (7:511c) ld a, MUSIC_PC_MAIN_MENU call PlaySong call DisableLCD farcall Func_10000 lb de, $30, $8f call SetupText call Func_3ca0 xor a ld [wLineSeparation], a call Func_1d1e1 call Func_1d17f ld a, $ff ld [wd626], a ld a, [wd627] cp $4 jr c, .asm_1d14f ld a, [wd624] or a jr z, .asm_1d14f ld a, $1 .asm_1d14f ld hl, wd636 farcall Func_111e9 farcall Func_10031 .asm_1d15a call DoFrameIfLCDEnabled call UpdateRNGSources call HandleMenuInput push af call Func_1d1e9 pop af jr nc, .asm_1d15a ldh a, [hCurMenuItem] cp e jr nz, .asm_1d15a ld [wd627], a ld a, [wd624] or a jr nz, .asm_1d17a inc e inc e .asm_1d17a ld a, e ld [wd628], a ret Func_1d17f: ; 1d17f (7:517f) INCROM $1d17f, $1d1e1 Func_1d1e1: ; 1d1e1 (7:51e1) INCROM $1d1e1, $1d1e9 Func_1d1e9: ; 1d1e9 (7:51e9) INCROM $1d1e9, $1d289 Func_1d289: ; 1d289 (7:5289) INCROM $1d289, $1d2b8 Func_1d2b8: ; 1d2b8 (7:52b8) INCROM $1d2b8, $1d2dd Func_1d2dd: ; 1d2dd (7:52dd) INCROM $1d2dd, $1d306 Func_1d306: ; 1d306 (7:5306) INCROM $1d306, $1d335 Func_1d335: ; 1d335 (7:5335) INCROM $1d335, $1d386 Titlescreen_1d386: ; 1d386 (7:5386) call AssertSongFinished or a jr nz, .asm_1d39f call DisableLCD ld a, MUSIC_TITLESCREEN call PlaySong ld bc, $0000 ld a, $0 call Func_3df3 call Func_1d59c .asm_1d39f call Func_3ca0 call Func_1d3a9 call EnableLCD ret Func_1d3a9: ; 1d3a9 (7:53a9) INCROM $1d3a9, $1d3ce Func_1d3ce: ; 1d3ce (7:53ce) INCROM $1d3ce, $1d42e Func_1d42e: ; 1d42e (7:542e) INCROM $1d42e, $1d519 Titlescreen_1d519: ; 1d519 (7:5519) ld a, MUSIC_TITLESCREEN call PlaySong call Func_1d42e scf ret ; 0x1d523 INCROM $1d523, $1d59c Func_1d59c: ; 1d59c (7:559c) INCROM $1d59c, $1d614 Func_1d614: ; 1d614 (7:5614) INCROM $1d614, $1d6ad Credits_1d6ad: ; 1d6ad (7:56ad) ld a, MUSIC_STOP call PlaySong call Func_1d705 call Func_1c858 xor a ld [wd324], a ld a, MUSIC_CREDITS call PlaySong farcall Func_10031 call Func_1d7fc .asm_1d6c8 call DoFrameIfLCDEnabled call Func_1d765 call Func_1d80b ld a, [wd633] cp $ff jr nz, .asm_1d6c8 call WaitForSongToFinish ld a, $8 farcall Func_12863 ld a, MUSIC_STOP call PlaySong farcall Func_10ab4 call Func_3ca4 call Set_WD_off call Func_1d758 call EnableLCD call DoFrameIfLCDEnabled call DisableLCD ld hl, wLCDC set 1, [hl] call ResetDoFrameFunction ret Func_1d705: ; 1d705 (7:5705) INCROM $1d705, $1d758 Func_1d758: ; 1d758 (7:5758) INCROM $1d758, $1d765 Func_1d765: ; 1d765 (7:5765) INCROM $1d765, $1d7fc Func_1d7fc: ; 1d7fc (7:57fc) INCROM $1d7fc, $1d80b Func_1d80b: ; 1d80b (7:580b) INCROM $1d80b, $1e1c4