diff options
Diffstat (limited to 'engine/gfx')
-rwxr-xr-x | engine/gfx/mon_icons.asm | 337 | ||||
-rwxr-xr-x | engine/gfx/sprite_anims.asm | 2800 | ||||
-rwxr-xr-x | engine/gfx/sprites.asm | 1220 |
3 files changed, 2412 insertions, 1945 deletions
diff --git a/engine/gfx/mon_icons.asm b/engine/gfx/mon_icons.asm new file mode 100755 index 00000000..d0d3856e --- /dev/null +++ b/engine/gfx/mon_icons.asm @@ -0,0 +1,337 @@ +LoadOverworldMonIcon: + ld a, e + call ReadMonMenuIcon + ld l, a + ld h, 0 + add hl, hl + ld de, IconPointers + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + ld b, BANK(Icons) + ld c, 8 + ret + +LoadMenuMonIcon: + push hl + push de + push bc + call .LoadIcon + pop bc + pop de + pop hl + ret + +.LoadIcon: + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: +; entries correspond to MONICON_* constants + dw PartyMenu_InitAnimatedMonIcon ; MONICON_PARTYMENU + dw NamingScreen_InitAnimatedMonIcon ; MONICON_NAMINGSCREEN + dw MoveList_InitAnimatedMonIcon ; MONICON_MOVES + dw Trade_LoadMonIconGFX ; MONICON_TRADE + +PartyMenu_InitAnimatedMonIcon: + ld a, [wCurIconTile] + push af + ldh a, [hObjectStructIndexBuffer] + ld hl, wPartySpecies + ld e, a + ld d, 0 + add hl, de + ld a, [hl] + call ReadMonMenuIcon + ld [wCurIcon], a + call GetMemIconGFX + ldh a, [hObjectStructIndexBuffer] +; y coord + add a + add a + add a + add a + add $1c + ld d, a +; x coord + ld e, $10 +; type is partymon icon + ld a, SPRITE_ANIM_INDEX_PARTY_MON + call _InitSpriteAnimStruct + pop af + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], a + + call .SpawnItemIcon + call SetPartyMonIconAnimSpeed + ret + +.SpawnItemIcon: + push bc + ldh a, [hObjectStructIndexBuffer] + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop bc + ld a, [hl] + and a + ret z + push hl + push bc + ld d, a + callfar ItemIsMail + pop bc + pop hl + jr c, .mail + ld a, SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_ITEM + jr .okay + +.mail + ld a, SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_MAIL +.okay + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], a + ret + +SetPartyMonIconAnimSpeed: + push bc + ldh a, [hObjectStructIndexBuffer] + ld b, a + call .getspeed + ld a, b + pop bc + ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET + add hl, bc + ld [hl], a + rlca + rlca + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], a + ret + +.getspeed + farcall PlacePartymonHPBar + call GetHPPal + ld e, d + ld d, 0 + ld hl, .speeds + add hl, de + ld b, [hl] + ret + +.speeds + db $00 ; HP_GREEN + db $40 ; HP_YELLOW + db $80 ; HP_RED + +NamingScreen_InitAnimatedMonIcon: + ld a, [wTempIconSpecies] + call ReadMonMenuIcon + ld [wCurIcon], a + xor a + call GetIconGFX + depixel 4, 4, 4, 0 + ld a, SPRITE_ANIM_INDEX_PARTY_MON + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], SPRITE_ANIM_SEQ_NULL + ret + +MoveList_InitAnimatedMonIcon: + ld a, [wTempIconSpecies] + call ReadMonMenuIcon + ld [wCurIcon], a + xor a + call GetIconGFX + ld d, 3 * 8 + 2 ; depixel 3, 4, 2, 4 + ld e, 4 * 8 + 4 + ld a, SPRITE_ANIM_INDEX_PARTY_MON + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], SPRITE_ANIM_SEQ_NULL + ret + +Trade_LoadMonIconGFX: + ld a, [wTempIconSpecies] + call ReadMonMenuIcon + ld [wCurIcon], a + ld a, $62 + ld [wCurIconTile], a + call GetMemIconGFX + ret + +GetSpeciesIcon: +; Load species icon into VRAM at tile a + push de + ld a, [wTempIconSpecies] + call ReadMonMenuIcon + ld [wCurIcon], a + pop de + ld a, e + call GetIconGFX + ret + +GetMemIconGFX: + ld a, [wCurIconTile] +GetIconGFX: +; Load icon graphics into VRAM starting from tile a. + ld l, a + ld h, 0 + +; One tile is 16 bytes long. +rept 4 + add hl, hl +endr + + ld de, vTiles0 + add hl, de + push hl + +; The icons are contiguous, in order and of the same +; size, so the pointer table is somewhat redundant. + ld a, [wCurIcon] + push hl + ld l, a + ld h, 0 + add hl, hl + ld de, IconPointers + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + pop hl + + lb bc, BANK(Icons), 8 + call Request2bpp + + pop hl + ld de, 8 tiles + add hl, de + ld de, HeldItemIcons + lb bc, BANK(HeldItemIcons), 2 + call Request2bpp + ld a, [wCurIconTile] + add 10 + ld [wCurIconTile], a + ret + +HeldItemIcons: +INCBIN "gfx/icons/mail.2bpp" +INCBIN "gfx/icons/item.2bpp" + +FreezeMonIcons: + ld hl, wSpriteAnimationStructs + ld e, PARTY_LENGTH + ld a, [wMenuCursorY] + ld d, a +.loop + ld a, [hl] + and a + jr z, .next + cp d + jr z, .loadwithtwo + ld a, SPRITE_ANIM_SEQ_NULL + jr .ok + +.loadwithtwo + ld a, SPRITE_ANIM_SEQ_PARTY_MON_SWITCH + +.ok + push hl + ld c, l + ld b, h + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], a + pop hl + +.next + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ret + +UnfreezeMonIcons: + ld hl, wSpriteAnimationStructs + ld e, PARTY_LENGTH +.loop + ld a, [hl] + and a + jr z, .next + push hl + ld c, l + ld b, h + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], SPRITE_ANIM_SEQ_PARTY_MON + pop hl +.next + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ret + +HoldSwitchmonIcon: + ld hl, wSpriteAnimationStructs + ld e, PARTY_LENGTH + ld a, [wSwitchMon] + ld d, a +.loop + ld a, [hl] + and a + jr z, .next + cp d + jr z, .is_switchmon + ld a, SPRITE_ANIM_SEQ_PARTY_MON_SELECTED + jr .join_back + +.is_switchmon + ld a, SPRITE_ANIM_SEQ_PARTY_MON_SWITCH +.join_back + push hl + ld c, l + ld b, h + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], a + pop hl +.next + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ret + +ReadMonMenuIcon: + cp EGG + jr z, .egg + dec a + ld hl, MonMenuIcons + ld e, a + ld d, 0 + add hl, de + ld a, [hl] + ret +.egg + ld a, ICON_EGG + ret + +INCLUDE "data/pokemon/menu_icons.asm" + +INCLUDE "data/icon_pointers.asm" + +INCLUDE "gfx/icons.asm" diff --git a/engine/gfx/sprite_anims.asm b/engine/gfx/sprite_anims.asm index 2877539d..a6e717e8 100755 --- a/engine/gfx/sprite_anims.asm +++ b/engine/gfx/sprite_anims.asm @@ -1,1361 +1,1497 @@ -DoAnimFrame: ; 8d463 - ld hl, $2 ; 23:5463 - add hl, bc ; 23:5466 - ld e, [hl] ; 23:5467 - ld d, $0 ; 23:5468 - ld hl, .Jumptable ; 23:546a - add hl, de ; 23:546d - add hl, de ; 23:546e - ld a, [hli] ; 23:546f - ld h, [hl] ; 23:5470 - ld l, a ; 23:5471 - jp hl ; 23:5472 - -.Jumptable: ; 23:5473 - dw Function8d4c7 - dw Function8d4c8 - dw Function8d4df - dw Function8d510 - dw Function8d528 - dw Function8d54e - dw Function8d55d - dw Function8d5a2 - dw Function8d5bf - dw Function8d623 - dw Function8d66b - dw Function8d690 - dw Function8d702 - dw Function8d765 - dw Function8d7b1 - dw Function8d7ef - dw Function8d82d - dw Function8d897 - dw Function8d8b8 - dw Function8d8bf - dw Function8d909 - dw Function8d91a - dw Function8d928 - dw Function8d92f - dw Function8d971 - dw Function8d9d0 - dw Function8d9d7 - dw Function8d9ec - dw Function8d921 - dw Function8da1c - dw Function8da2a - dw Function8da23 - dw Function8da31 - dw Function8dad8 - dw Function8daf0 - dw Function8daf7 - dw Function8db25 - dw Function8db2c - dw Function8db5d - dw Function8db8f - dw Function8dbb4 - dw Function8d885 - -Function8d4c7: ; 8d4c7 - ret ; 23:54c7 - -Function8d4c8: ; 8d4c8 - ld a, [$cee0] ; 23:54c8 - ld hl, $0 ; 23:54cb - add hl, bc ; 23:54ce - cp [hl] ; 23:54cf - jr z, Function8d4df ; 23:54d0 - ld hl, $4 ; 23:54d2 - add hl, bc ; 23:54d5 - ld [hl], $10 ; 23:54d6 - ld hl, $7 ; 23:54d8 - add hl, bc ; 23:54db - ld [hl], $0 ; 23:54dc - ret ; 23:54de - -Function8d4df: ; 8d4df - ld hl, $4 ; 23:54df - add hl, bc ; 23:54e2 - ld [hl], $18 ; 23:54e3 - ld hl, $c ; 23:54e5 - add hl, bc ; 23:54e8 - ld a, [hl] ; 23:54e9 - ld d, a ; 23:54ea - inc [hl] ; 23:54eb - and $f ; 23:54ec - ret nz ; 23:54ee - ld hl, $d ; 23:54ef - add hl, bc ; 23:54f2 - ld e, [hl] ; 23:54f3 - ld hl, $7 ; 23:54f4 - add hl, bc ; 23:54f7 - ld a, d ; 23:54f8 - and $10 ; 23:54f9 - jr z, .asm_8d505 ; 23:54fb - ld a, e ; 23:54fd - and a ; 23:54fe - jr z, Function8d50c ; 23:54ff - cp $1 ; 23:5501 - jr z, Function8d508 ; 23:5503 -.asm_8d505 - xor a ; 23:5505 - ld [hl], a ; 23:5506 - ret ; 23:5507 - -Function8d508: ; 8d508 - ld a, $ff ; 23:5508 - ld [hl], a ; 23:550a - ret ; 23:550b - -Function8d50c: ; 8d50c - ld a, $fe ; 23:550c - ld [hl], a ; 23:550e - ret ; 23:550f - -Function8d510: ; 8d510 - ld a, [$cee0] ; 23:5510 - ld hl, $0 ; 23:5513 - add hl, bc ; 23:5516 - cp [hl] ; 23:5517 - jr z, Function8d521 ; 23:5518 - ld hl, $4 ; 23:551a - add hl, bc ; 23:551d - ld [hl], $10 ; 23:551e - ret ; 23:5520 - -Function8d521: ; 8d521 - ld hl, $4 ; 23:5521 - add hl, bc ; 23:5524 - ld [hl], $18 ; 23:5525 - ret ; 23:5527 - -Function8d528: ; 8d528 - ld hl, $d ; 23:5528 - add hl, bc ; 23:552b - ld a, [hl] ; 23:552c - inc [hl] ; 23:552d - cp $40 ; 23:552e - jr nc, Function8d54a ; 23:5530 - ld hl, $7 ; 23:5532 - add hl, bc ; 23:5535 - dec [hl] ; 23:5536 - ld hl, $c ; 23:5537 - add hl, bc ; 23:553a - ld a, [hl] ; 23:553b - add a, $2 ; 23:553c - ld [hl], a ; 23:553e - ld d, $8 ; 23:553f - call Function8dbf6 ; 23:5541 - ld hl, $6 ; 23:5544 - add hl, bc ; 23:5547 - ld [hl], a ; 23:5548 - ret ; 23:5549 - -Function8d54a: ; 8d54a - call DeinitializeSprite ; 23:554a - ret ; 23:554d - -Function8d54e: ; 8d54e - ld a, [$c5c7] ; 23:554e - ld hl, $5 ; 23:5551 - add hl, bc ; 23:5554 - add [hl] ; 23:5555 - cp $b0 ; 23:5556 - ret c ; 23:5558 - call DeinitializeSprite ; 23:5559 - ret ; 23:555c - -Function8d55d: ; 8d55d - call Function8dbdd ; 23:555d - jp hl ; 23:5560 - -; anonymous jumptable - dw Function8d565 - dw Function8d576 - -Function8d565: ; 8d565 - call Function8dbf0 ; 23:5565 - ld hl, $0 ; 23:5568 - add hl, bc ; 23:556b - ld a, [hl] ; 23:556c - and $3 ; 23:556d - swap a ; 23:556f - ld hl, $c ; 23:5571 - add hl, bc ; 23:5574 - ld [hl], a ; 23:5575 -Function8d576: ; 8d576 - ld de, $201 ; 23:5576 - ldh a, [$ffe9] ; 23:5579 - and a ; 23:557b - jr z, .asm_8d581 ; 23:557c - ld de, $402 ; 23:557e +DoAnimFrame: + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: +; entries correspond to SPRITE_ANIM_SEQ_* constants + dw .Null + dw .PartyMon + dw .PartyMonSwitch + dw .PartyMonSelected + dw .GSIntroBubble + dw .GSIntroShellder + dw .GSIntroMagikarp + dw .GSIntroLapras + dw .GSIntroLapras2 + dw .GSIntroNote + dw .GSIntroJigglypuff + dw .GSIntroPikachu + dw .GSIntroPikachuTail + dw .GSIntroFireball + dw .GSIntroChikoritaTotodile + dw .GSIntroCyndaquil + dw .GSTitleTrail + dw .UnusedPikachu + dw .UnusedPikachuTail + dw .UnusedNote + dw .UnusedJigglypuff + dw .NamingScreenCursor + dw .GameFreakLogo + dw .GSIntroStar + dw .GSIntroSparkle + dw .SlotsGolem + dw .SlotsChansey + dw .SlotsChanseyEgg + dw .MailCursor + dw .UnusedCursor + dw .DummyGameCursor + dw .PokegearArrow + dw .TradePokeBall + dw .TradeTubeBulge + dw .TrademonInTube + dw .RevealNewMon + dw .RadioTuningKnob + dw .CutLeaves + dw .FlyFrom + dw .FlyLeaf + dw .FlyTo + dw .GSIntroHoOhLugia + +.Null: + ret + +.PartyMon + ld a, [wMenuCursorY] + + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + cp [hl] + jr z, .PartyMonSwitch + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], 8 * 2 + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], 0 + ret + +.PartyMonSwitch + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], 8 * 3 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + ld d, a + inc [hl] + and $f + ret nz + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld e, [hl] + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld a, d + and $10 ; bit 4 + jr z, .load_zero + ld a, e + and a + jr z, .load_minus_two + cp $1 + jr z, .load_minus_one +.load_zero + xor a + ld [hl], a + ret + +.load_minus_one + ld a, -1 + ld [hl], a + ret + +.load_minus_two + ld a, -2 + ld [hl], a + ret + +.PartyMonSelected + ld a, [wMenuCursorY] + + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + cp [hl] + jr z, .three_offset_right + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], 8 * 2 + ret + +.three_offset_right + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], 8 * 3 + ret + +.GSIntroBubble + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + inc [hl] + cp $40 + jr nc, .asm_8d54a + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + dec [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add $02 + ld [hl], a + ld d, $08 + call .Sprites_Sine + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.asm_8d54a + call DeinitializeSprite + ret + +.GSIntroShellder + ld a, [wGlobalAnimYOffset] + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + add [hl] + cp $b0 + ret c + call DeinitializeSprite + ret + +.GSIntroMagikarp + call .AnonymousJumptable + jp hl + +; Anonymous dw (see .AnonymousJumptable) + dw .Function8d565 + dw .Function8d576 + +.Function8d565 + call .IncrementJumptableIndex + + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld a, [hl] + + and $03 + swap a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + +.Function8d576 + ld de, $0201 + ldh a, [hSGB] + and a + jr z, .asm_8d581 + ld de, $0402 + .asm_8d581 - ld hl, $6 ; 23:5581 - add hl, bc ; 23:5584 - ld a, [hl] ; 23:5585 - cp $f0 ; 23:5586 - jr nc, Function8d59e ; 23:5588 - add d ; 23:558a - ld [hl], a ; 23:558b - ld hl, $c ; 23:558c - add hl, bc ; 23:558f - ld a, [hl] ; 23:5590 - add e ; 23:5591 - ld [hl], a ; 23:5592 - ld d, $8 ; 23:5593 - call Function8dbf6 ; 23:5595 - ld hl, $7 ; 23:5598 - add hl, bc ; 23:559b - ld [hl], a ; 23:559c - ret ; 23:559d - -Function8d59e: ; 8d59e - call DeinitializeSprite ; 23:559e - ret ; 23:55a1 - -Function8d5a2: ; 8d5a2 - ld hl, $4 ; 23:55a2 - add hl, bc ; 23:55a5 - ld a, [hl] ; 23:55a6 - cp $b0 ; 23:55a7 - jr nc, Function8d5bb ; 23:55a9 - inc [hl] ; 23:55ab - ld hl, $c ; 23:55ac - add hl, bc ; 23:55af - ld a, [hl] ; 23:55b0 - inc [hl] ; 23:55b1 - and $1 ; 23:55b2 - ret z ; 23:55b4 - ld hl, $5 ; 23:55b5 - add hl, bc ; 23:55b8 - inc [hl] ; 23:55b9 - ret ; 23:55ba - -Function8d5bb: ; 8d5bb - call DeinitializeSprite ; 23:55bb - ret ; 23:55be - -Function8d5bf: ; 8d5bf - call Function8dbdd ; 23:55bf - jp hl ; 23:55c2 + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + cp $f0 + jr nc, .asm_8d59e + + add d + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add e + ld [hl], a + ld d, $08 + call .Sprites_Sine + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.asm_8d59e + call DeinitializeSprite + ret + +.GSIntroLapras + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $b0 + jr nc, .asm_8d5bb + + inc [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc [hl] + and $1 + ret z + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + inc [hl] + ret + +.asm_8d5bb + call DeinitializeSprite + ret + +.GSIntroLapras2 + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d5c9 - dw Function8d5e2 - dw Function8d5f3 - -Function8d5c9: ; 8d5c9 - call Function8d60b ; 23:55c9 - ret z ; 23:55cc - ld hl, $4 ; 23:55cd - add hl, bc ; 23:55d0 - ld a, [hl] ; 23:55d1 - cp $58 ; 23:55d2 - jr c, Function8d5d8 ; 23:55d4 - dec [hl] ; 23:55d6 - ret ; 23:55d7 - -Function8d5d8: ; 8d5d8 - call Function8dbf0 ; 23:55d8 - ld hl, $d ; 23:55db - add hl, bc ; 23:55de - ld [hl], $b0 ; 23:55df - ret ; 23:55e1 - -Function8d5e2: ; 8d5e2 - call Function8d60b ; 23:55e2 - ld hl, $d ; 23:55e5 - add hl, bc ; 23:55e8 - ld a, [hl] ; 23:55e9 - and a ; 23:55ea - jr z, Function8d5ef ; 23:55eb - dec [hl] ; 23:55ed - ret ; 23:55ee - -Function8d5ef: ; 8d5ef - call Function8dbf0 ; 23:55ef - ret ; 23:55f2 - -Function8d5f3: ; 8d5f3 - call Function8d60b ; 23:55f3 - ret z ; 23:55f6 - ld hl, $4 ; 23:55f7 - add hl, bc ; 23:55fa - ld a, [hl] ; 23:55fb - cp $d0 ; 23:55fc - jr z, Function8d602 ; 23:55fe - dec [hl] ; 23:5600 - ret ; 23:5601 - -Function8d602: ; 8d602 - call DeinitializeSprite ; 23:5602 - ld a, $1 ; 23:5605 - ld [$cb19], a ; 23:5607 - ret ; 23:560a - -Function8d60b: ; 8d60b - ld hl, $c ; 23:560b - add hl, bc ; 23:560e - ld a, [hl] ; 23:560f - inc [hl] ; 23:5610 - ld d, $4 ; 23:5611 - call Function8dbf6 ; 23:5613 - ld hl, $7 ; 23:5616 - add hl, bc ; 23:5619 - ld [hl], a ; 23:561a - ld hl, $c ; 23:561b - add hl, bc ; 23:561e - ld a, [hl] ; 23:561f - and $1 ; 23:5620 - ret ; 23:5622 - -Function8d623: ; 8d623 - call Function8dbdd ; 23:5623 - jp hl ; 23:5626 + dw .Function8d5c9 + dw .Function8d5e2 + dw .Function8d5f3 + +.Function8d5c9 + call .Function8d60b + ret z + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $58 + jr c, .asm_8d5d8 + + dec [hl] + ret + + +.asm_8d5d8 + call .IncrementJumptableIndex + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $b0 + ret + +.Function8d5e2 + call .Function8d60b + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .asm_8d5ef + + dec [hl] + ret + +.asm_8d5ef + call .IncrementJumptableIndex + ret + +.Function8d5f3 + call .Function8d60b + ret z + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $d0 + jr z, .asm_8d602 + dec [hl] + ret + +.asm_8d602 + call DeinitializeSprite + ld a, $1 + ld [wBattleMonLevel], a + ret + +.Function8d60b + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc [hl] + ld d, 4 + call .Sprites_Sine + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and $1 + ret + +.GSIntroNote + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d62b - dw Function8d63e - -Function8d62b: ; 8d62b - call Function8dbf0 ; 23:562b - ld hl, $0 ; 23:562e - add hl, bc ; 23:5631 - ld a, [hl] ; 23:5632 - and $1 ; 23:5633 - swap a ; 23:5635 - sla a ; 23:5637 - ld hl, $c ; 23:5639 - add hl, bc ; 23:563c - ld [hl], a ; 23:563d -Function8d63e: ; 8d63e - ld hl, $6 ; 23:563e - add hl, bc ; 23:5641 - ld a, [hl] ; 23:5642 - cp $80 ; 23:5643 - jr nc, Function8d667 ; 23:5645 - inc [hl] ; 23:5647 - ld d, $4 ; 23:5648 - ld hl, $c ; 23:564a - add hl, bc ; 23:564d - ld a, [hl] ; 23:564e - add a, $2 ; 23:564f - ld [hl], a ; 23:5651 - call Function8dbf6 ; 23:5652 - ld hl, $7 ; 23:5655 - add hl, bc ; 23:5658 - ld [hl], a ; 23:5659 - ld hl, $c ; 23:565a - add hl, bc ; 23:565d - and $2 ; 23:565e - ret z ; 23:5660 - ld hl, $5 ; 23:5661 - add hl, bc ; 23:5664 - dec [hl] ; 23:5665 - ret ; 23:5666 - -Function8d667: ; 8d667 - call DeinitializeSprite ; 23:5667 - ret ; 23:566a - -Function8d66b: ; 8d66b - call Function8dbdd ; 23:566b - jp hl ; 23:566e + dw .Function8d62b + dw .Function8d63e + +.Function8d62b + call .IncrementJumptableIndex + ld hl, 0 + add hl, bc + ld a, [hl] + and $1 + swap a + sla a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a +.Function8d63e + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + cp $80 + jr nc, .asm_8d667 + inc [hl] + ld d, $04 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add $02 + ld [hl], a + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + and $2 + ret z + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + ret + +.asm_8d667 + call DeinitializeSprite + ret + +.GSIntroJigglypuff + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d673 - dw Function8d680 - -Function8d673: ; 8d673 - ld a, [$cb19] ; 23:5673 - and a ; 23:5676 - ret z ; 23:5677 - call Function8dbf0 ; 23:5678 - ld a, $c ; 23:567b - call Function8d332 ; 23:567d -Function8d680: ; 8d680 - ld hl, $4 ; 23:5680 - add hl, bc ; 23:5683 - ld a, [hl] ; 23:5684 - cp $d0 ; 23:5685 - jr z, Function8d68c ; 23:5687 - dec [hl] ; 23:5689 - dec [hl] ; 23:568a - ret ; 23:568b - -Function8d68c: ; 8d68c - call DeinitializeSprite ; 23:568c - ret ; 23:568f - -Function8d690: ; 8d690 - call Function8dbdd ; 23:5690 - jp hl ; 23:5693 + dw .Function8d673 + dw .Function8d680 + +.Function8d673 + ld a, [wBattleMonLevel] + and a + ret z + call .IncrementJumptableIndex + ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_JIGGLYPUFF_2 + call _ReinitSpriteAnimFrame +.Function8d680 + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $d0 + jr z, .asm_8d68c + dec [hl] + dec [hl] + ret + +.asm_8d68c + call DeinitializeSprite + ret + +.GSIntroPikachu + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d69c - dw Function8d6b6 - dw Function8d6c9 - dw Function8d6f2 -Function8d69c: - ld hl, $4 ; 23:569c - add hl, bc ; 23:569f - ld a, [hl] ; 23:56a0 - cp $80 ; 23:56a1 - jr z, Function8d6a7 ; 23:56a3 - dec [hl] ; 23:56a5 - ret ; 23:56a6 - -Function8d6a7: ; 8d6a7 - call Function8dbf0 ; 23:56a7 - ld hl, $d ; 23:56aa - add hl, bc ; 23:56ad - ld [hl], $30 ; 23:56ae - ld a, $e ; 23:56b0 - call Function8d332 ; 23:56b2 - ret ; 23:56b5 - -Function8d6b6: ; 8d6b6 - ld hl, $d ; 23:56b6 - add hl, bc ; 23:56b9 - ld a, [hl] ; 23:56ba - and a ; 23:56bb - jr z, Function8d6c0 ; 23:56bc - dec [hl] ; 23:56be - ret ; 23:56bf - -Function8d6c0: ; 8d6c0 - call Function8dbf0 ; 23:56c0 - ld a, $f ; 23:56c3 - call Function8d332 ; 23:56c5 - ret ; 23:56c8 - -Function8d6c9: ; 8d6c9 - ld hl, $c ; 23:56c9 - add hl, bc ; 23:56cc - ld a, [hl] ; 23:56cd - add a, $4 ; 23:56ce - ld [hl], a ; 23:56d0 - ld d, $4 ; 23:56d1 - call Function8dbf6 ; 23:56d3 - ld hl, $7 ; 23:56d6 - add hl, bc ; 23:56d9 - ld [hl], a ; 23:56da - ld hl, $4 ; 23:56db - add hl, bc ; 23:56de - ld a, [hl] ; 23:56df - cp $50 ; 23:56e0 - jr z, Function8d6e9 ; 23:56e2 - dec [hl] ; 23:56e4 - dec [hl] ; 23:56e5 - dec [hl] ; 23:56e6 - dec [hl] ; 23:56e7 - ret ; 23:56e8 - -Function8d6e9: ; 8d6e9 - ld a, $1 ; 23:56e9 - ld [$cb19], a ; 23:56eb - call Function8dbf0 ; 23:56ee - ret ; 23:56f1 - -Function8d6f2: ; 8d6f2 - ld hl, $4 ; 23:56f2 - add hl, bc ; 23:56f5 - ld a, [hl] ; 23:56f6 - cp $d0 ; 23:56f7 - jr z, Function8d6fe ; 23:56f9 - dec [hl] ; 23:56fb - dec [hl] ; 23:56fc - ret ; 23:56fd - -Function8d6fe: ; 8d6fe - call DeinitializeSprite ; 23:56fe - ret ; 23:5701 - -Function8d702: ; 8d702 - call Function8dbdd ; 23:5702 - jp hl ; 23:5705 + dw .Function8d69c + dw .Function8d6b6 + dw .Function8d6c9 + dw .Function8d6f2 + +.Function8d69c + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $80 + jr z, .asm_8d6a7 + dec [hl] + ret + +.asm_8d6a7 + call .IncrementJumptableIndex + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $30 + ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_2 + call _ReinitSpriteAnimFrame + ret + +.Function8d6b6 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .asm_8d6c0 + dec [hl] + ret + +.asm_8d6c0 + call .IncrementJumptableIndex + ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_3 + call _ReinitSpriteAnimFrame + ret + +.Function8d6c9 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add $04 + ld [hl], a + ld d, $04 + call .Sprites_Sine + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $50 + jr z, .asm_8d6e9 + dec [hl] + dec [hl] + dec [hl] + dec [hl] + ret + +.asm_8d6e9 + ld a, 1 + ld [wBattleMonLevel], a + call .IncrementJumptableIndex + ret + +.Function8d6f2 + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $d0 + jr z, .asm_8d6fe + dec [hl] + dec [hl] + ret + +.asm_8d6fe + call DeinitializeSprite + ret + +.GSIntroPikachuTail + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d70c - dw Function8d726 - dw Function8d73c - -Function8d70c: ; 8d70c - ld hl, $4 ; 23:570c - add hl, bc ; 23:570f - ld a, [hl] ; 23:5710 - cp $80 ; 23:5711 - jr z, Function8d717 ; 23:5713 - dec [hl] ; 23:5715 - ret ; 23:5716 - -Function8d717: ; 8d717 - call Function8dbf0 ; 23:5717 - ld hl, $d ; 23:571a - add hl, bc ; 23:571d - ld [hl], $30 ; 23:571e - ld a, $11 ; 23:5720 - call Function8d332 ; 23:5722 - ret ; 23:5725 - -Function8d726: ; 8d726 - ld hl, $d ; 23:5726 - add hl, bc ; 23:5729 - ld a, [hl] ; 23:572a - and a ; 23:572b - jr z, Function8d738 ; 23:572c - dec [hl] ; 23:572e - cp $20 ; 23:572f - ret nz ; 23:5731 - ld a, $10 ; 23:5732 - call Function8d332 ; 23:5734 - ret ; 23:5737 - -Function8d738: ; 8d738 - call Function8dbf0 ; 23:5738 - ret ; 23:573b - -Function8d73c: ; 8d73c - ld hl, $c ; 23:573c - add hl, bc ; 23:573f - ld a, [hl] ; 23:5740 - add a, $4 ; 23:5741 - ld [hl], a ; 23:5743 - ld d, $4 ; 23:5744 - call Function8dbf6 ; 23:5746 - ld hl, $7 ; 23:5749 - add hl, bc ; 23:574c - ld [hl], a ; 23:574d - ld hl, $4 ; 23:574e - add hl, bc ; 23:5751 - ld a, [hl] ; 23:5752 - cp $d0 ; 23:5753 - jr z, Function8d761 ; 23:5755 - dec [hl] ; 23:5757 - dec [hl] ; 23:5758 - ld a, [$cb19] ; 23:5759 - and a ; 23:575c - ret nz ; 23:575d - dec [hl] ; 23:575e - dec [hl] ; 23:575f - ret ; 23:5760 - -Function8d761: ; 8d761 - call DeinitializeSprite ; 23:5761 - ret ; 23:5764 - -Function8d765: ; 8d765 - call Function8dbdd ; 23:5765 - jp hl ; 23:5768 + dw .Function8d70c + dw .Function8d726 + dw .Function8d73c + +.Function8d70c + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $80 + jr z, .asm_8d717 + dec [hl] + ret + +.asm_8d717 + call .IncrementJumptableIndex + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $30 + ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_TAIL_2 + call _ReinitSpriteAnimFrame + ret + +.Function8d726 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .asm_8d738 + dec [hl] + cp $20 + ret nz + ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_TAIL + call _ReinitSpriteAnimFrame + ret + +.asm_8d738 + call .IncrementJumptableIndex + ret + +.Function8d73c + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add $04 + ld [hl], a + ld d, $04 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $d0 + jr z, .asm_8d761 + dec [hl] + dec [hl] + ld a, [wBattleMonLevel] + and a + ret nz + dec [hl] + dec [hl] + ret + +.asm_8d761 + call DeinitializeSprite + ret + +.GSIntroFireball + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d76d - dw Function8d786 - -Function8d76d: ; 8d76d - call Function8dbf0 ; 23:576d - ld hl, $0 ; 23:5770 - add hl, bc ; 23:5773 - ld a, [hl] ; 23:5774 - and $4 ; 23:5775 - sla a ; 23:5777 - ld e, a ; 23:5779 - ld a, [hl] ; 23:577a - and $3 ; 23:577b - swap a ; 23:577d - add e ; 23:577f - ld hl, $c ; 23:5780 - add hl, bc ; 23:5783 - ld [hl], a ; 23:5784 - ret ; 23:5785 - -Function8d786: ; 8d786 - ld hl, $4 ; 23:5786 - add hl, bc ; 23:5789 - dec [hl] ; 23:578a - dec [hl] ; 23:578b - dec [hl] ; 23:578c - dec [hl] ; 23:578d - ld hl, $d ; 23:578e - add hl, bc ; 23:5791 - ld a, [hl] ; 23:5792 - ld d, a ; 23:5793 - add a, $8 ; 23:5794 - ld [hl], a ; 23:5796 - ld hl, $c ; 23:5797 - add hl, bc ; 23:579a - ld a, [hl] ; 23:579b - push af ; 23:579c - push de ; 23:579d - call Function8dbf6 ; 23:579e - ld hl, $7 ; 23:57a1 - add hl, bc ; 23:57a4 - ld [hl], a ; 23:57a5 - pop de ; 23:57a6 - pop af ; 23:57a7 - call Function8dbfa ; 23:57a8 - ld hl, $6 ; 23:57ab - add hl, bc ; 23:57ae - ld [hl], a ; 23:57af - ret ; 23:57b0 - -Function8d7b1: ; 8d7b1 - call Function8dbdd ; 23:57b1 - jp hl ; 23:57b4 + dw .Function8d76d + dw .Function8d786 + +.Function8d76d + call .IncrementJumptableIndex + ld hl, 0 + add hl, bc + ld a, [hl] + and $4 + sla a + ld e, a + ld a, [hl] + and $3 + swap a + add e + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + ret + +.Function8d786 + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + dec [hl] + dec [hl] + dec [hl] + dec [hl] + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + ld d, a + add $8 + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +; flash down/right +.GSIntroChikoritaTotodile + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d7b9 - dw Function8d7c9 - -Function8d7b9: ; 8d7b9 - call Function8dbf0 ; 23:57b9 - ld hl, $c ; 23:57bc - add hl, bc ; 23:57bf - ld [hl], $30 ; 23:57c0 - ld hl, $d ; 23:57c2 - add hl, bc ; 23:57c5 - ld [hl], $30 ; 23:57c6 - ret ; 23:57c8 - -Function8d7c9: ; 8d7c9 - ld hl, $c ; 23:57c9 - add hl, bc ; 23:57cc - ld a, [hl] ; 23:57cd - cp $3c ; 23:57ce - ret nc ; 23:57d0 - inc [hl] ; 23:57d1 - inc [hl] ; 23:57d2 - ld d, $90 ; 23:57d3 - call Function8dbf6 ; 23:57d5 - ld hl, $7 ; 23:57d8 - add hl, bc ; 23:57db - ld [hl], a ; 23:57dc - ld hl, $d ; 23:57dd - add hl, bc ; 23:57e0 - ld a, [hl] ; 23:57e1 - inc [hl] ; 23:57e2 - inc [hl] ; 23:57e3 - ld d, $90 ; 23:57e4 - call Function8dbfa ; 23:57e6 - ld hl, $6 ; 23:57e9 - add hl, bc ; 23:57ec - ld [hl], a ; 23:57ed - ret ; 23:57ee - -Function8d7ef: ; 8d7ef - call Function8dbdd ; 23:57ef - jp hl ; 23:57f2 + dw .Function8d7b9 + dw .Function8d7c9 + +.Function8d7b9 + call .IncrementJumptableIndex + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $30 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $30 + ret + +.Function8d7c9 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $3c + ret nc + + inc [hl] + inc [hl] + ld d, $90 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + ld d, $90 + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +; flash down/left +.GSIntroCyndaquil + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d7f7 - dw Function8d807 - -Function8d7f7: ; 8d7f7 - call Function8dbf0 ; 23:57f7 - ld hl, $c ; 23:57fa - add hl, bc ; 23:57fd - ld [hl], $30 ; 23:57fe - ld hl, $d ; 23:5800 - add hl, bc ; 23:5803 - ld [hl], $10 ; 23:5804 - ret ; 23:5806 - -Function8d807: ; 8d807 - ld hl, $c ; 23:5807 - add hl, bc ; 23:580a - ld a, [hl] ; 23:580b - cp $3c ; 23:580c - ret nc ; 23:580e - inc [hl] ; 23:580f - inc [hl] ; 23:5810 - ld d, $90 ; 23:5811 - call Function8dbf6 ; 23:5813 - ld hl, $7 ; 23:5816 - add hl, bc ; 23:5819 - ld [hl], a ; 23:581a - ld hl, $d ; 23:581b - add hl, bc ; 23:581e - ld a, [hl] ; 23:581f - inc [hl] ; 23:5820 - inc [hl] ; 23:5821 - ld d, $90 ; 23:5822 - call Function8dbfa ; 23:5824 - ld hl, $6 ; 23:5827 - add hl, bc ; 23:582a - ld [hl], a ; 23:582b - ret ; 23:582c - -Function8d82d: ; 8d82d - call Function8dbdd ; 23:582d - jp hl ; 23:5830 + dw .Function8d7f7 + dw .Function8d807 + +.Function8d7f7 + call .IncrementJumptableIndex + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $30 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $10 + ret + +.Function8d807 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $3c + ret nc + inc [hl] + inc [hl] + ld d, $90 + call .Sprites_Sine + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + ld d, $90 + call .Sprites_Cosine + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret +.GSTitleTrail + call .AnonymousJumptable + jp hl + +IF DEF(_GOLD) ; anonymous jumptable - dw Function8d835 - dw Function8d84c - -Function8d835: ; 8d835 - call Function8dbf0 ; 23:5835 - ld hl, $0 ; 23:5838 - add hl, bc ; 23:583b - ld a, [hl] ; 23:583c - ld hl, $d ; 23:583d - add hl, bc ; 23:5840 - and $3 ; 23:5841 - ld [hl], a ; 23:5843 - inc [hl] ; 23:5844 - swap a ; 23:5845 - ld hl, $c ; 23:5847 - add hl, bc ; 23:584a - ld [hl], a ; 23:584b -Function8d84c: ; 8d84c - ld hl, $4 ; 23:584c - add hl, bc ; 23:584f - ld a, [hl] ; 23:5850 - cp $a4 ; 23:5851 - jr nc, Function8d881 ; 23:5853 - ld hl, $d ; 23:5855 - add hl, bc ; 23:5858 - add a, $4 ; 23:5859 - ld hl, $4 ; 23:585b - add hl, bc ; 23:585e - ld [hl], a ; 23:585f - ld hl, $5 ; 23:5860 - add hl, bc ; 23:5863 - inc [hl] ; 23:5864 - ld hl, $d ; 23:5865 - add hl, bc ; 23:5868 - ld a, [hl] ; 23:5869 - sla a ; 23:586a - sla a ; 23:586c - ld d, $2 ; 23:586e - ld hl, $c ; 23:5870 - add hl, bc ; 23:5873 - ld a, [hl] ; 23:5874 - add a, $3 ; 23:5875 - ld [hl], a ; 23:5877 - call Function8dbf6 ; 23:5878 - ld hl, $7 ; 23:587b - add hl, bc ; 23:587e - ld [hl], a ; 23:587f - ret ; 23:5880 - -Function8d881: ; 8d881 - call DeinitializeSprite ; 23:5881 - ret ; 23:5884 - -Function8d885: ; 8d885 - ld hl, $c ; 23:5885 - add hl, bc ; 23:5888 - ld a, [hl] ; 23:5889 - inc a ; 23:588a - ld [hl], a ; 23:588b - ld d, $2 ; 23:588c - call Function8dbf6 ; 23:588e - ld hl, $7 ; 23:5891 - add hl, bc ; 23:5894 - ld [hl], a ; 23:5895 - ret ; 23:5896 - -Function8d897: ; 8d897 - push bc ; 23:5897 - callba_hc $38, $4000 ; 23:5898 ; 23:589d - pop bc ; 23:589e - ld hl, $c704 ; 23:589f - ld a, [hl] ; 23:58a2 - and $3 ; 23:58a3 - ret z ; 23:58a5 - ld [hl], $0 ; 23:58a6 - ld e, a ; 23:58a8 - ld d, $0 ; 23:58a9 - ld hl, $58b4 ; 23:58ab - add hl, de ; 23:58ae - ld a, [hl] ; 23:58af - call Function8d332 ; 23:58b0 - ret ; 23:58b3 - -Function8d8b4: ; 8d8b4 - db $17 - db $18 - db $17 - db $19 - -Function8d8b8: ; 8d8b8 - callba_hc $38, $4000 ; 23:58b8 ; 23:58bd - ret ; 23:58be - -Function8d8bf: ; 8d8bf - call Function8dbdd ; 23:58bf - jp hl ; 23:58c2 + dw .Function8d835 + dw .Function8d84c + +.Function8d835 + call .IncrementJumptableIndex + + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld a, [hl] + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + and $3 + ld [hl], a + inc [hl] + swap a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + +.Function8d84c + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $a4 + jr nc, .asm_8d881 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + add $4 + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + inc [hl] + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + sla a + sla a + ld d, 2 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add $3 + ld [hl], a + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.asm_8d881 + call DeinitializeSprite + ret + +ELIF DEF(_SILVER) +; anonymous jumptable + dw .Function8d835 + dw .Function8d856 + +.Function8d835 + ld a, [wIntroSceneTimer] + and $30 + swap a + add $3 + ld d, a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [wIntroSceneTimer] + and $30 + swap a + add $07 + add [hl] + ld [hl], a + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a +.Function8d856 + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $a4 + jr nc, .asm_8d863 + add $4 + ld [hl], a + ret + +.asm_8d863 + call DeinitializeSprite + ret +ENDC + +.GSIntroHoOhLugia + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] +IF DEF(_GOLD) + inc a + ld [hl], a + ld d, 2 +ELIF DEF(_SILVER) + dec a + ld [hl], a + ld d, 8 +ENDC + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.UnusedPikachu + push bc + farcall ret_e0000 + pop bc + ld hl, wc704 + ld a, [hl] + and $3 + ret z + ld [hl], 0 + ld e, a + ld d, 0 + ld hl, .Data_8d8b4 + add hl, de + ld a, [hl] + call _ReinitSpriteAnimFrame + ret + +.Data_8d8b4 + db SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU + db SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU_2 + db SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU + db SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU_3 + +.UnusedPikachuTail + farcall ret_e0000 + ret + +.UnusedNote + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d8c7 - dw Function8d8d9 - -Function8d8c7: ; 8d8c7 - call Function8d8e1 ; 23:58c7 - ld a, [$c717] ; 23:58ca - ld hl, $4 ; 23:58cd - add hl, bc ; 23:58d0 - add [hl] ; 23:58d1 - ld [hl], a ; 23:58d2 - cp $c0 ; 23:58d3 - ret nc ; 23:58d5 - cp $a8 ; 23:58d6 - ret c ; 23:58d8 -Function8d8d9: - call DeinitializeSprite ; 23:58d9 - ld hl, $c5bc ; 23:58dc - dec [hl] ; 23:58df - ret ; 23:58e0 - -Function8d8e1: ; 8d8e1 - ld hl, $c ; 23:58e1 - add hl, bc ; 23:58e4 - ld a, [hl] ; 23:58e5 - inc [hl] ; 23:58e6 - and $1f ; 23:58e7 - srl a ; 23:58e9 - ld e, a ; 23:58eb - ld d, $0 ; 23:58ec - ld hl, Data_8d8f9 ; 23:58ee - add hl, de ; 23:58f1 - ld a, [hl] ; 23:58f2 - ld hl, $7 ; 23:58f3 - add hl, bc ; 23:58f6 - ld [hl], a ; 23:58f7 - ret ; 23:58f8 - -Data_8d8f9: ; 8d8f9 - db $04 - db $07 - db $09 - db $0a - db $09 - db $07 - db $04 - db $00 - db $fc - db $f9 - db $f7 - db $f6 - db $f7 - db $f9 - db $fc - db $00 - -Function8d909: ; 8d909 - ld a, [$c717] - ld hl, $4 + dw .Function8d8c7 + dw .Function8d8d9 + +.Function8d8c7 + call .Function8d8e1 + ld a, [wc717] + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + add [hl] + ld [hl], a + cp $c0 + ret nc + cp $a8 + ret c +.Function8d8d9 + call DeinitializeSprite + ld hl, wSpriteAnimCount + dec [hl] + ret + +.Function8d8e1 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc [hl] + and $1f + srl a + ld e, a + ld d, 0 + ld hl, .Data_8d8f9 + add hl, de + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.Data_8d8f9 + db 4, 7, 9, 10, 9, 7, 4, 0 + db -4, -7, -9, -10, -9, -7, -4, 0 + +.UnusedJigglypuff + ld a, [wc717] + + ld hl, SPRITEANIMSTRUCT_XCOORD add hl, bc add [hl] ld [hl], a cp $30 ret nz xor a - ld [$c717], a - ret ; 23:5919 - -Function8d91a: ; 8d91a - callab_hc $4, $5dfa ; 23:591a ; 23:591f - ret ; 23:5920 - -Function8d921: ; 8d921 - callab_hc $4, $648e ; 23:5921 ; 23:5926 - ret ; 23:5927 - -Function8d928: ; 8d928 - callab_hc $39, $4b20 ; 23:5928 ; 23:592d - ret ; 23:592e - -Function8d92f: ; 8d92f - ld hl, $c ; 23:592f - add hl, bc ; 23:5932 - ld a, [hl] ; 23:5933 - and a ; 23:5934 - jr z, Function8d968 ; 23:5935 - dec [hl] ; 23:5937 - dec [hl] ; 23:5938 - ld d, a ; 23:5939 - and $1f ; 23:593a - jr nz, .asm_8d943 ; 23:593c - ld hl, $d ; 23:593e - add hl, bc ; 23:5941 - dec [hl] ; 23:5942 + ld [wc717], a + ret + +.NamingScreenCursor + callfar NamingScreen_AnimateCursor + ret + +.MailCursor + callfar ComposeMail_AnimateCursor + ret + +.GameFreakLogo: + callfar GFPresents_UpdateLogoPal + ret + +.GSIntroStar + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .asm_8d968 + dec [hl] + dec [hl] + ld d, a + and $1f + jr nz, .asm_8d943 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + dec [hl] .asm_8d943 - ld hl, $b ; 23:5943 - add hl, bc ; 23:5946 - ld a, [hl] ; 23:5947 - push af ; 23:5948 - push de ; 23:5949 - call Function8dbf6 ; 23:594a - ld hl, $7 ; 23:594d - add hl, bc ; 23:5950 - ld [hl], a ; 23:5951 - pop de ; 23:5952 - pop af ; 23:5953 - call Function8dbfa ; 23:5954 - ld hl, $6 ; 23:5957 - add hl, bc ; 23:595a - ld [hl], a ; 23:595b - ld hl, $d ; 23:595c - add hl, bc ; 23:595f - ld a, [hl] ; 23:5960 - ld hl, $b ; 23:5961 - add hl, bc ; 23:5964 - add [hl] ; 23:5965 - ld [hl], a ; 23:5966 - ret ; 23:5967 - -Function8d968: ; 8d968 - ld a, $1 ; 23:5968 - ld [$ce64], a ; 23:596a - call DeinitializeSprite ; 23:596d - ret ; 23:5970 - -Function8d971: ; 8d971 - ld hl, $c ; 23:5971 - add hl, bc ; 23:5974 - ld a, [hli] ; 23:5975 - or [hl] ; 23:5976 - jr z, Function8d9cc ; 23:5977 - ld hl, $f ; 23:5979 - add hl, bc ; 23:597c - ld d, [hl] ; 23:597d - ld hl, $b ; 23:597e - add hl, bc ; 23:5981 - ld a, [hl] ; 23:5982 - push af ; 23:5983 - push de ; 23:5984 - call Function8dbf6 ; 23:5985 - ld hl, $7 ; 23:5988 - add hl, bc ; 23:598b - ld [hl], a ; 23:598c - pop de ; 23:598d - pop af ; 23:598e - call Function8dbfa ; 23:598f - ld hl, $6 ; 23:5992 - add hl, bc ; 23:5995 - ld [hl], a ; 23:5996 - ld hl, $c ; 23:5997 - add hl, bc ; 23:599a - ld e, [hl] ; 23:599b - inc hl ; 23:599c - ld d, [hl] ; 23:599d - ld hl, $e ; 23:599e - add hl, bc ; 23:59a1 - ld a, [hli] ; 23:59a2 - ld h, [hl] ; 23:59a3 - ld l, a ; 23:59a4 - add hl, de ; 23:59a5 - ld e, l ; 23:59a6 - ld d, h ; 23:59a7 - ld hl, $e ; 23:59a8 - add hl, bc ; 23:59ab - ld [hl], e ; 23:59ac - inc hl ; 23:59ad - ld [hl], d ; 23:59ae - ld hl, $c ; 23:59af - add hl, bc ; 23:59b2 - ld a, [hli] ; 23:59b3 - ld h, [hl] ; 23:59b4 - ld l, a ; 23:59b5 - ld de, $fff0 ; 23:59b6 - add hl, de ; 23:59b9 - ld e, l ; 23:59ba - ld d, h ; 23:59bb - ld hl, $c ; 23:59bc - add hl, bc ; 23:59bf - ld [hl], e ; 23:59c0 - inc hl ; 23:59c1 - ld [hl], d ; 23:59c2 - ld hl, $b ; 23:59c3 - add hl, bc ; 23:59c6 - ld a, [hl] ; 23:59c7 - xor $20 ; 23:59c8 - ld [hl], a ; 23:59ca - ret ; 23:59cb - -Function8d9cc: ; 8d9cc - call DeinitializeSprite ; 23:59cc - ret ; 23:59cf - -Function8d9d0: ; 8d9d0 - callab_hc $24, $7772 ; 23:59d0 ; 23:59d5 - ret ; 23:59d6 - -Function8d9d7: ; 8d9d7 - callab_hc $24, $7801 ; 23:59d7 ; 23:59dc - ld hl, $ce64 ; 23:59dd - ld a, [hl] ; 23:59e0 - cp $2 ; 23:59e1 - ret nz ; 23:59e3 - ld [hl], $3 ; 23:59e4 - ld a, $21 ; 23:59e6 - call Function8d332 ; 23:59e8 - ret ; 23:59eb - -Function8d9ec: ; 8d9ec - ld hl, $b ; 23:59ec - add hl, bc ; 23:59ef - ld a, [hl] ; 23:59f0 - dec [hl] ; 23:59f1 - ld e, a ; 23:59f2 - and $1 ; 23:59f3 - jr z, .asm_8da10 ; 23:59f5 - ld hl, $4 ; 23:59f7 - add hl, bc ; 23:59fa - ld a, [hl] ; 23:59fb - cp $78 ; 23:59fc - jr c, asm_8da0f ; 23:59fe - call DeinitializeSprite ; 23:5a00 - ld a, $4 ; 23:5a03 - ld [$ce64], a ; 23:5a05 - ld de, $1e ; 23:5a08 - call $3e24 ; 23:5a0b - ret ; 23:5a0e - -.asm_8da0f - inc [hl] ; 23:5a0f -.asm_8da10 - ld a, e ; 23:5a10 - ld d, $20 ; 23:5a11 - call Function8dbf6 ; 23:5a13 - ld hl, $7 ; 23:5a16 - add hl, bc ; 23:5a19 - ld [hl], a ; 23:5a1a - ret ; 23:5a1b - -Function8da1c: ; 8da1c - callab_hc $38, $4908 ; 23:5a1c ; 23:5a21 - ret ; 23:5a22 - -Function8da23: ; 8da23 - callab_hc $24, $4d0b ; 23:5a23 ; 23:5a28 - ret ; 23:5a29 - -Function8da2a: ; 8da2a - callab_hc $38, $69ae ; 23:5a2a ; 23:5a2f - ret ; 23:5a30 - -Function8da31: ; 8da31 - call Function8dbdd ; 23:5a31 - jp hl ; 23:5a34 - ld b, c ; 23:5a35 - ld e, d ; 23:5a36 - add e ; 23:5a37 - ld e, d ; 23:5a38 - ld d, e ; 23:5a39 - ld e, d ; 23:5a3a - ld h, [hl] ; 23:5a3b - ld e, d ; 23:5a3c - sub [hl] ; 23:5a3d - ld e, d ; 23:5a3e - call nc, $3e5a ; 23:5a3f - ld h, $cd ; 23:5a42 - ld [hld], a ; 23:5a44 - ld d, e ; 23:5a45 - ld hl, $b ; 23:5a46 - add hl, bc ; 23:5a49 - ld [hl], $2 ; 23:5a4a - ld hl, $c ; 23:5a4c - add hl, bc ; 23:5a4f - ld [hl], $20 ; 23:5a50 - ret ; 23:5a52 - -Function8da53: ; 8da53 - ld hl, $c ; 23:5a53 - add hl, bc ; 23:5a56 - ld a, [hl] ; 23:5a57 - and a ; 23:5a58 - jr z, Function8da5d ; 23:5a59 - dec [hl] ; 23:5a5b - ret ; 23:5a5c - -Function8da5d: ; 8da5d - call Function8dbf0 ; 23:5a5d - ld hl, $c ; 23:5a60 - add hl, bc ; 23:5a63 - ld [hl], $40 ; 23:5a64 - ld hl, $c ; 23:5a66 - add hl, bc ; 23:5a69 - ld a, [hl] ; 23:5a6a - cp $30 ; 23:5a6b - jr c, Function8da7b ; 23:5a6d - dec [hl] ; 23:5a6f - ld d, $28 ; 23:5a70 - call Function8dbf6 ; 23:5a72 - ld hl, $7 ; 23:5a75 - add hl, bc ; 23:5a78 - ld [hl], a ; 23:5a79 - ret ; 23:5a7a - -Function8da7b: ; 8da7b - ld de, $c ; 23:5a7b - call $3e24 ; 23:5a7e - jr Function8dad4 ; 23:5a81 - ld hl, $b ; 23:5a83 - add hl, bc ; 23:5a86 - ld [hl], $4 ; 23:5a87 - ld hl, $c ; 23:5a89 - add hl, bc ; 23:5a8c - ld [hl], $30 ; 23:5a8d - ld hl, $d ; 23:5a8f - add hl, bc ; 23:5a92 - ld [hl], $24 ; 23:5a93 - ret ; 23:5a95 - -Function8da96: ; 8da96 - ld hl, $d ; 23:5a96 - add hl, bc ; 23:5a99 - ld a, [hl] ; 23:5a9a - and a ; 23:5a9b - jr z, Function8daca ; 23:5a9c - ld d, a ; 23:5a9e - ld hl, $c ; 23:5a9f - add hl, bc ; 23:5aa2 - ld a, [hl] ; 23:5aa3 - call Sprites_Sine ; 23:5aa4 - ld hl, $7 ; 23:5aa7 - add hl, bc ; 23:5aaa - ld [hl], a ; 23:5aab - ld hl, $c ; 23:5aac - add hl, bc ; 23:5aaf - inc [hl] ; 23:5ab0 - ld a, [hl] ; 23:5ab1 - and $3f ; 23:5ab2 - ret nz ; 23:5ab4 - ld hl, $c ; 23:5ab5 - add hl, bc ; 23:5ab8 - ld [hl], $20 ; 23:5ab9 - ld hl, $d ; 23:5abb - add hl, bc ; 23:5abe - ld a, [hl] ; 23:5abf - sub a, $c ; 23:5ac0 - ld [hl], a ; 23:5ac2 - ld de, $20 ; 23:5ac3 - call $3e24 ; 23:5ac6 - ret ; 23:5ac9 - -Function8daca: ; 8daca - xor a ; 23:5aca - ld hl, $7 ; 23:5acb - add hl, bc ; 23:5ace - ld [hl], a ; 23:5acf - call Function8dbf0 ; 23:5ad0 - ret ; 23:5ad3 - -Function8dad4: ; 8dad4 - call DeinitializeSprite ; 23:5ad4 - ret ; 23:5ad7 - -Function8dad8: ; 8dad8 - ld hl, $4 ; 23:5ad8 - add hl, bc ; 23:5adb - ld a, [hl] ; 23:5adc - inc [hl] ; 23:5add - cp $b0 ; 23:5ade - jr nc, Function8daec ; 23:5ae0 - and $3 ; 23:5ae2 - ret nz ; 23:5ae4 - ld de, $3 ; 23:5ae5 - call $3e24 ; 23:5ae8 - ret ; 23:5aeb - -Function8daec: ; 8daec - call DeinitializeSprite ; 23:5aec - ret ; 23:5aef - -Function8daf0: ; 8daf0 - callab_hc $a, $54cf ; 23:5af0 ; 23:5af5 - ret ; 23:5af6 - -Function8daf7: ; 8daf7 - ld hl, $c ; 23:5af7 - add hl, bc ; 23:5afa - ld a, [hl] ; 23:5afb - cp $80 ; 23:5afc - jr nc, Function8db21 ; 23:5afe - ld d, a ; 23:5b00 - add a, $8 ; 23:5b01 - ld [hl], a ; 23:5b03 - ld hl, $b ; 23:5b04 - add hl, bc ; 23:5b07 - ld a, [hl] ; 23:5b08 - xor $20 ; 23:5b09 - ld [hl], a ; 23:5b0b - push af ; 23:5b0c - push de ; 23:5b0d - call Function8dbf6 ; 23:5b0e - ld hl, $7 ; 23:5b11 - add hl, bc ; 23:5b14 - ld [hl], a ; 23:5b15 - pop de ; 23:5b16 - pop af ; 23:5b17 - call Function8dbfa ; 23:5b18 - ld hl, $6 ; 23:5b1b - add hl, bc ; 23:5b1e - ld [hl], a ; 23:5b1f - ret ; 23:5b20 - -Function8db21: ; 8db21 - call DeinitializeSprite ; 23:5b21 - ret ; 23:5b24 - -Function8db25: ; 8db25 - callab_hc $24, $55ff ; 23:5b25 ; 23:5b2a - ret ; 23:5b2b - -Function8db2c: ; 8db2c - ld hl, $d ; 23:5b2c - add hl, bc ; 23:5b2f - ld e, [hl] ; 23:5b30 - inc hl ; 23:5b31 - ld d, [hl] ; 23:5b32 - ld hl, $80 ; 23:5b33 - add hl, de ; 23:5b36 - ld e, l ; 23:5b37 - ld d, h ; 23:5b38 - ld hl, $d ; 23:5b39 - add hl, bc ; 23:5b3c - ld [hl], e ; 23:5b3d - inc hl ; 23:5b3e - ld [hl], d ; 23:5b3f - ld hl, $c ; 23:5b40 - add hl, bc ; 23:5b43 - ld a, [hl] ; 23:5b44 - inc [hl] ; 23:5b45 - inc [hl] ; 23:5b46 - inc [hl] ; 23:5b47 - push af ; 23:5b48 - push de ; 23:5b49 - call Function8dbf6 ; 23:5b4a - ld hl, $7 ; 23:5b4d - add hl, bc ; 23:5b50 - ld [hl], a ; 23:5b51 - pop de ; 23:5b52 - pop af ; 23:5b53 - call Function8dbfa ; 23:5b54 - ld hl, $6 ; 23:5b57 - add hl, bc ; 23:5b5a - ld [hl], a ; 23:5b5b - ret ; 23:5b5c - -Function8db5d: ; 8db5d - ld hl, $5 ; 23:5b5d - add hl, bc ; 23:5b60 - ld a, [hl] ; 23:5b61 - and a ; 23:5b62 - ret z ; 23:5b63 - ld hl, $d ; 23:5b64 - add hl, bc ; 23:5b67 - ld a, [hl] ; 23:5b68 - inc [hl] ; 23:5b69 - cp $40 ; 23:5b6a - ret c ; 23:5b6c - ld hl, $5 ; 23:5b6d - add hl, bc ; 23:5b70 - dec [hl] ; 23:5b71 - dec [hl] ; 23:5b72 - ld hl, $f ; 23:5b73 - add hl, bc ; 23:5b76 - ld a, [hl] ; 23:5b77 - ld d, a ; 23:5b78 - cp $40 ; 23:5b79 - jr nc, .asm_8db80 ; 23:5b7b - add a, $8 ; 23:5b7d - ld [hl], a ; 23:5b7f -.asm_8db80 - ld hl, $e ; 23:5b80 - add hl, bc ; 23:5b83 - ld a, [hl] ; 23:5b84 - inc [hl] ; 23:5b85 - call Function8dbfa ; 23:5b86 - ld hl, $6 ; 23:5b89 - add hl, bc ; 23:5b8c - ld [hl], a ; 23:5b8d - ret ; 23:5b8e - -Function8db8f: ; 8db8f - ld hl, $4 ; 23:5b8f - add hl, bc ; 23:5b92 - ld a, [hl] ; 23:5b93 - cp $b8 ; 23:5b94 - jr nc, Function8dbb0 ; 23:5b96 - inc [hl] ; 23:5b98 - inc [hl] ; 23:5b99 - ld hl, $5 ; 23:5b9a - add hl, bc ; 23:5b9d - dec [hl] ; 23:5b9e - ld d, $40 ; 23:5b9f - ld hl, $c ; 23:5ba1 - add hl, bc ; 23:5ba4 - ld a, [hl] ; 23:5ba5 - inc [hl] ; 23:5ba6 - call Function8dbfa ; 23:5ba7 - ld hl, $6 ; 23:5baa - add hl, bc ; 23:5bad - ld [hl], a ; 23:5bae - ret ; 23:5baf - -Function8dbb0: ; 8dbb0 - call DeinitializeSprite ; 23:5bb0 - ret ; 23:5bb3 - -Function8dbb4: ; 8dbb4 - ld hl, $5 ; 23:5bb4 - add hl, bc ; 23:5bb7 - ld a, [hl] ; 23:5bb8 - cp $54 ; 23:5bb9 - ret z ; 23:5bbb - ld hl, $5 ; 23:5bbc - add hl, bc ; 23:5bbf - inc [hl] ; 23:5bc0 - inc [hl] ; 23:5bc1 - ld hl, $f ; 23:5bc2 - add hl, bc ; 23:5bc5 - ld a, [hl] ; 23:5bc6 - ld d, a ; 23:5bc7 - and a ; 23:5bc8 - jr z, .asm_8dbce ; 23:5bc9 - sub a, $2 ; 23:5bcb - ld [hl], a ; 23:5bcd + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + add [hl] + ld [hl], a + ret + +.asm_8d968 + ld a, 1 + ld [wce64], a + call DeinitializeSprite + ret + +.GSIntroSparkle + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hli] + or [hl] + jr z, .asm_8d9cc + + ld hl, SPRITEANIMSTRUCT_0F + add hl, bc + ld d, [hl] + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + add hl, de + ld e, l + ld d, h + + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld [hl], e + inc hl + ld [hl], d + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld de, -$10 + add hl, de + ld e, l + ld d, h + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], e + inc hl + ld [hl], d + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + xor $20 + ld [hl], a + ret + +.asm_8d9cc + call DeinitializeSprite + ret + +.SlotsGolem: + callfar Slots_AnimateGolem + ret + +.SlotsChansey: + callfar Slots_AnimateChansey + ld hl, wce64 + ld a, [hl] + cp 2 + ret nz + ld [hl], 3 + ld a, SPRITE_ANIM_FRAMESET_SLOTS_CHANSEY_2 + call _ReinitSpriteAnimFrame + ret + +.SlotsChanseyEgg: + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + dec [hl] + ld e, a + and 1 + jr z, .move_vertical + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp 15 * 8 + jr c, .move_right + call DeinitializeSprite + ld a, 4 + ld [wce64], a + ld de, SFX_PLACE_PUZZLE_PIECE_DOWN + call PlaySFX + ret + +.move_right + inc [hl] +.move_vertical + ld a, e + ld d, $20 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.UnusedCursor + callfar ret_e0908 + ret + +.PokegearArrow + callfar AnimatePokegearModeIndicatorArrow + ret + +.DummyGameCursor + callfar DummyGame_InterpretJoypad_AnimateCursor + ret + +.TradePokeBall + call .AnonymousJumptable + jp hl + +; Anonymous dw (see .AnonymousJumptable) + dw .TradePokeBall_zero + dw .TradePokeBall_one + dw .TradePokeBall_two + dw .TradePokeBall_three + dw .TradePokeBall_four + dw .TradePokeBall_five + +.TradePokeBall_zero + ld a, SPRITE_ANIM_FRAMESET_TRADE_POKE_BALL_WOBBLE + call _ReinitSpriteAnimFrame + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], $2 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $20 + ret + +.TradePokeBall_two + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .asm_8da5d + dec [hl] + ret + +.asm_8da5d + call .IncrementJumptableIndex + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $40 + +.TradePokeBall_three + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $30 + jr c, .asm_8da7b + dec [hl] + ld d, $28 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.asm_8da7b + ld de, SFX_GOT_SAFARI_BALLS + call PlaySFX + jr .TradePokeBall_five + +.TradePokeBall_one + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], $4 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $30 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $24 + ret + +.TradePokeBall_four + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .asm_8daca + ld d, a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + call Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + inc [hl] + ld a, [hl] + and $3f + ret nz + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $20 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + sub $c + ld [hl], a + ld de, SFX_SWITCH_POKEMON + call PlaySFX + ret + +.asm_8daca + xor a + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + call .IncrementJumptableIndex + ret + +.TradePokeBall_five + call DeinitializeSprite + ret + +.TradeTubeBulge + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + inc [hl] + cp $b0 + jr nc, .delete + and $3 + ret nz + ld de, SFX_POKEBALLS_PLACED_ON_TABLE + call PlaySFX + ret + +.delete + call DeinitializeSprite + ret + +.TrademonInTube + callfar TradeAnim_AnimateTrademonInTube + ret + +.RevealNewMon: + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $80 + jr nc, .finish_EggShell + ld d, a + add $8 + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + xor $20 + ld [hl], a + + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.finish_EggShell + call DeinitializeSprite + ret + +.RadioTuningKnob: + callfar AnimateTuningKnob + ret + +.CutLeaves + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $80 + add hl, de + ld e, l + ld d, h + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], e + inc hl + ld [hl], d + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + inc [hl] + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.FlyFrom: + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + and a + ret z + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + inc [hl] + cp $40 + ret c + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + dec [hl] + + ld hl, SPRITEANIMSTRUCT_0F + add hl, bc + ld a, [hl] + ld d, a + cp $40 + jr nc, .skip + add $8 + ld [hl], a +.skip + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld a, [hl] + inc [hl] + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.FlyLeaf: + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp -9 * 8 + jr nc, .delete_leaf + inc [hl] + inc [hl] + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + + ld d, $40 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc [hl] + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.delete_leaf + call DeinitializeSprite + ret + +.FlyTo: + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp 10 * 8 + 4 + ret z + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + inc [hl] + inc [hl] + + ld hl, SPRITEANIMSTRUCT_0F + add hl, bc + ld a, [hl] + ld d, a + and a + jr z, .asm_8dbce + sub 2 + ld [hl], a .asm_8dbce - ld hl, $e ; 23:5bce - add hl, bc ; 23:5bd1 - ld a, [hl] ; 23:5bd2 - inc [hl] ; 23:5bd3 - call Function8dbfa ; 23:5bd4 - ld hl, $6 ; 23:5bd7 - add hl, bc ; 23:5bda - ld [hl], a ; 23:5bdb - ret ; 23:5bdc - -Function8dbdd: ; 8dbdd - ld hl, [sp+$0] ; 23:5bdd - ld e, [hl] ; 23:5bdf - inc hl ; 23:5be0 - ld d, [hl] ; 23:5be1 - inc de ; 23:5be2 - ld hl, $b ; 23:5be3 - add hl, bc ; 23:5be6 - ld l, [hl] ; 23:5be7 - ld h, $0 ; 23:5be8 - add hl, hl ; 23:5bea - add hl, de ; 23:5beb - ld a, [hli] ; 23:5bec - ld h, [hl] ; 23:5bed - ld l, a ; 23:5bee - ret ; 23:5bef - -Function8dbf0: ; 8dbf0 - ld hl, $b ; 23:5bf0 - add hl, bc ; 23:5bf3 - inc [hl] ; 23:5bf4 - ret ; 23:5bf5 - -Function8dbf6: ; 8dbf6 - call Sprites_Sine ; 23:5bf6 - ret ; 23:5bf9 - -Function8dbfa: ; 8dbfa - call Sprites_Cosine ; 23:5bfa - ret ; 23:5bfd + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld a, [hl] + inc [hl] + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.AnonymousJumptable: + ld hl, sp+$0 + ld e, [hl] + inc hl + ld d, [hl] + inc de + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld l, [hl] + ld h, 0 + add hl, hl + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +.IncrementJumptableIndex: + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ret + +.Sprites_Sine: + call Sprites_Sine + ret + +.Sprites_Cosine: + call Sprites_Cosine + ret diff --git a/engine/gfx/sprites.asm b/engine/gfx/sprites.asm index b9267d66..824ceac4 100755 --- a/engine/gfx/sprites.asm +++ b/engine/gfx/sprites.asm @@ -1,645 +1,639 @@ -ClearAnimatedObjects: ; 8d174 - ld hl, $c508 ; 23:5174 - ld bc, $c1 ; 23:5177 +ClearSpriteAnims: + ld hl, wSpriteAnimDict + ld bc, wSpriteAnimsEnd - wSpriteAnimDict .loop - ld [hl], $0 ; 23:517a - inc hl ; 23:517c - dec bc ; 23:517d - ld a, c ; 23:517e - or b ; 23:517f - jr nz, .loop ; 23:5180 - ret ; 23:5182 - -PlayAnimatedObjectationsAndDelayFrame: ; 8d182 - call PlayAnimatedObjectations ; 23:5183 - call $32e ; DelayFrame ; 23:5186 - ret ; 23:5189 - -PlayAnimatedObjectations: ; 8d189 - push hl ; 23:518a - push de ; 23:518b - push bc ; 23:518c - push af ; 23:518d - - ld a, $0 ; 23:518e - ld [$c5bd], a ; 23:5190 - call DoNextFrameForAllSprites ; 23:5193 - - pop af ; 23:5196 - pop bc ; 23:5197 - pop de ; 23:5198 - pop hl ; 23:5199 - ret ; 23:519a - -DoNextFrameForAllSprites: ; 8d19b - ld hl, $c51c ; 23:519b - ld e, $a ; 23:519e + ld [hl], 0 + inc hl + dec bc + ld a, c + or b + jr nz, .loop + ret + +PlaySpriteAnimationsAndDelayFrame: + call PlaySpriteAnimations + call DelayFrame + ret + +PlaySpriteAnimations: + push hl + push de + push bc + push af + + ld a, LOW(wVirtualOAM) + ld [wCurSpriteOAMAddr], a + call DoNextFrameForAllSprites + + pop af + pop bc + pop de + pop hl + ret + +DoNextFrameForAllSprites: + ld hl, wSpriteAnimationStructs + ld e, NUM_SPRITE_ANIM_STRUCTS + .loop - ld a, [hl] ; 23:51a0 - and a ; 23:51a1 - jr z, .skip_capacity_check ; 23:51a2 - ld c, l ; 23:51a4 - ld b, h ; 23:51a5 - push hl ; 23:51a6 - push de ; 23:51a7 - call DoAnimFrame ; 23:51a8 - call UpdateAnimFrame ; 23:51ab - pop de ; 23:51ae - pop hl ; 23:51af - jr c, .cancel ; 23:51b0 -.skip_capacity_check - ld bc, $10 ; 23:51b2 - add hl, bc ; 23:51b5 - dec e ; 23:51b6 - jr nz, .loop ; 23:51b7 - ld a, [$c5bd] ; 23:51b9 - ld l, a ; 23:51bc - ld h, $c3 ; 23:51bd -.loop2 - ld a, l ; 23:51bf - cp $a0 ; 23:51c0 - jr nc, .cancel ; 23:51c2 - xor a ; 23:51c4 - ld [hli], a ; 23:51c5 - jr .loop2 ; 23:51c6 - -.cancel - ret ; 23:51c8 - -DoNextFrameForFirst16Sprites: ; 8d1c9 - ld hl, $c51c ; 23:51c9 - ld e, $a ; 23:51cc + ld a, [hl] + and a + jr z, .next ; This struct is deinitialized. + ld c, l + ld b, h + push hl + push de + call DoAnimFrame ; Uses a massive dw + call UpdateAnimFrame + pop de + pop hl + jr c, .done + +.next + ld bc, SPRITEANIMSTRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop + + ld a, [wCurSpriteOAMAddr] + ld l, a + ld h, HIGH(wVirtualOAM) + +.loop2 ; Clear (wVirtualOAM + [wCurSpriteOAMAddr] --> wVirtualOAMEnd) + ld a, l + cp LOW(wVirtualOAMEnd) + jr nc, .done + xor a + ld [hli], a + jr .loop2 + +.done + ret + +DoNextFrameForFirst16Sprites: + ld hl, wSpriteAnimationStructs + ld e, NUM_SPRITE_ANIM_STRUCTS + .loop - ld a, [hl] ; 23:51ce - and a ; 23:51cf - jr z, .skip_capacity_check ; 23:51d0 - ld c, l ; 23:51d2 - ld b, h ; 23:51d3 - push hl ; 23:51d4 - push de ; 23:51d5 - call DoAnimFrame ; 23:51d6 - call UpdateAnimFrame ; 23:51d9 - pop de ; 23:51dc - pop hl ; 23:51dd - jr c, .cancel ; 23:51de -.skip_capacity_check - ld bc, $10 ; 23:51e0 - add hl, bc ; 23:51e3 - dec e ; 23:51e4 - jr nz, .loop ; 23:51e5 - ld a, [$c5bd] ; 23:51e7 - ld l, a ; 23:51ea - ld h, $c3 ; 23:51eb -.loop2 - ld a, l ; 23:51ed - cp $40 ; 23:51ee - jr nc, .cancel ; 23:51f0 - xor a ; 23:51f2 - ld [hli], a ; 23:51f3 - jr .loop2 ; 23:51f4 - -.cancel - ret ; 23:51f6 - -_InitSpriteAnimStruct:: ; 8d1f7 - push de ; 23:51f7 - push af ; 23:51f8 - ld hl, $c51c ; 23:51f9 - ld e, $a ; 23:51fc + ld a, [hl] + and a + jr z, .next + ld c, l + ld b, h + push hl + push de + call DoAnimFrame ; Uses a massive dw + call UpdateAnimFrame + pop de + pop hl + jr c, .done + +.next + ld bc, SPRITEANIMSTRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop + + ld a, [wCurSpriteOAMAddr] + ld l, a + ld h, HIGH(wVirtualOAMSprite16) + +.loop2 ; Clear (wVirtualOAM + [wCurSpriteOAMAddr] --> Sprites + $40) + ld a, l + cp LOW(wVirtualOAMSprite16) + jr nc, .done + xor a + ld [hli], a + jr .loop2 + +.done + ret + +_InitSpriteAnimStruct:: +; Initialize animation a at pixel x=e, y=d +; Find if there's any room in the wSpriteAnimationStructs array, which is 10x16 + push de + push af + ld hl, wSpriteAnimationStructs + ld e, NUM_SPRITE_ANIM_STRUCTS .loop - ld a, [hl] ; 23:51fe - and a ; 23:51ff - jr z, .found ; 23:5200 - ld bc, $10 ; 23:5202 - add hl, bc ; 23:5205 - dec e ; 23:5206 - jr nz, .loop ; 23:5207 - pop af ; 23:5209 - pop de ; 23:520a - scf ; 23:520b - ret ; 23:520c - -.found ; 8d20d - ld c, l ; 23:520d - ld b, h ; 23:520e - ld hl, $c5bc ; 23:520f - inc [hl] ; 23:5212 - ld a, [hl] ; 23:5213 - and a ; 23:5214 - jr nz, .initialized ; 23:5215 - inc [hl] ; 23:5217 + ld a, [hl] + and a + jr z, .found + ld bc, SPRITEANIMSTRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop +; We've reached the end. There is no more room here. +; Return carry. + pop af + pop de + scf + ret + +.found +; Back up the structure address to bc. + ld c, l + ld b, h +; Value [wSpriteAnimCount] is initially set to -1. Set it to +; the number of objects loaded into this array. + ld hl, wSpriteAnimCount + inc [hl] + ld a, [hl] + and a + jr nz, .initialized + inc [hl] + .initialized - pop af ; 23:5218 - ld e, a ; 23:5219 - ld d, $0 ; 23:521a - ld hl, AnimatedObjectSeqData ; 23:521c - add hl, de ; 23:521f - add hl, de ; 23:5220 - add hl, de ; 23:5221 - ld e, l ; 23:5222 - ld d, h ; 23:5223 - ld hl, $0 ; 23:5224 - add hl, bc ; 23:5227 - ld a, [$c5bc] ; 23:5228 - ld [hli], a ; 23:522b - ld a, [de] ; 23:522c - ld [hli], a ; 23:522d - inc de ; 23:522e - ld a, [de] ; 23:522f - ld [hli], a ; 23:5230 - inc de ; 23:5231 - ld a, [de] ; 23:5232 - call GetAnimatedObjectVTile ; 23:5233 - ld [hli], a ; 23:5236 - pop de ; 23:5237 - ld hl, $4 ; 23:5238 - add hl, bc ; 23:523b - ld a, e ; 23:523c - ld [hli], a ; 23:523d - ld a, d ; 23:523e - ld [hli], a ; 23:523f - xor a ; 23:5240 - ld [hli], a ; 23:5241 - ld [hli], a ; 23:5242 - xor a ; 23:5243 - ld [hli], a ; 23:5244 - ld [hli], a ; 23:5245 - dec a ; 23:5246 - ld [hli], a ; 23:5247 - xor a ; 23:5248 - ld [hli], a ; 23:5249 - ld [hli], a ; 23:524a - ld [hli], a ; 23:524b - ld [hli], a ; 23:524c - ld [hl], a ; 23:524d - ld a, c ; 23:524e - ld [$c5c0], a ; 23:524f - ld a, b ; 23:5252 - ld [$c5c1], a ; 23:5253 - ret ; 23:5256 - -DeinitializeSprite: ; 8d257 - ld hl, $0 ; 23:5257 - add hl, bc ; 23:525a - ld [hl], $0 ; 23:525b - ret ; 23:525d - -UpdateAnimFrame: ; 8d25e - call InitAnimatedObjectBuffer ; 23:525e - call GetAnimatedObjectFrame ; 23:5261 - cp $fd ; 23:5264 - jr z, .done ; 23:5266 - cp $fc ; 23:5268 - jr z, .delete ; 23:526a - call GetFrameOAMPointer ; 23:526c - ld a, [$c5c2] ; 23:526f - add [hl] ; 23:5272 - ld [$c5c2], a ; 23:5273 - inc hl ; 23:5276 - ld a, [hli] ; 23:5277 - ld h, [hl] ; 23:5278 - ld l, a ; 23:5279 - push bc ; 23:527a - ld a, [$c5bd] ; 23:527b - ld e, a ; 23:527e - ld d, $c3 ; 23:527f - ld a, [hli] ; 23:5281 - ld c, a ; 23:5282 +; Get row a of SpriteAnimSeqData, copy the pointer into de + pop af + ld e, a + ld d, 0 + ld hl, SpriteAnimSeqData + add hl, de + add hl, de + add hl, de + ld e, l + ld d, h +; Set hl to the first field (field 0) in the current structure. + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc +; Load the index. + ld a, [wSpriteAnimCount] + ld [hli], a +; Copy the table entry to the next two fields. + ld a, [de] + ld [hli], a + inc de + ld a, [de] + ld [hli], a + inc de +; Look up the third field from the table in the wSpriteAnimDict array (10x2). +; Take the value and load it in + ld a, [de] + call GetSpriteAnimVTile + ld [hli], a + pop de +; Set hl to field 4 (X coordinate). Kinda pointless, because we're presumably already here. + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc +; Load the original value of de into here. + ld a, e + ld [hli], a + ld a, d + ld [hli], a +; load 0 into the next four fields + xor a + ld [hli], a + ld [hli], a + xor a + ld [hli], a + ld [hli], a +; load -1 into the next field + dec a + ld [hli], a +; load 0 into the last five fields + xor a +rept 4 + ld [hli], a +endr + ld [hl], a +; back up the address of the first field to wSpriteAnimAddrBackup + ld a, c + ld [wSpriteAnimAddrBackup], a + ld a, b + ld [wSpriteAnimAddrBackup + 1], a + ret + +DeinitializeSprite: +; Clear the index field of the struct in bc. + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], 0 + ret + +UpdateAnimFrame: + call InitSpriteAnimBuffer ; init WRAM + call GetSpriteAnimFrame ; read from a memory array + cp -3 + jr z, .done + cp -4 + jr z, .delete + call GetFrameOAMPointer + ; add byte to [wCurAnimVTile] + ld a, [wCurAnimVTile] + add [hl] + ld [wCurAnimVTile], a + inc hl + ; load pointer into hl + ld a, [hli] + ld h, [hl] + ld l, a + push bc + ld a, [wCurSpriteOAMAddr] + ld e, a + ld d, HIGH(wVirtualOAM) + ld a, [hli] + ld c, a ; number of objects .loop - ld a, [$c5c4] ; 23:5283 - ld b, a ; 23:5286 - ld a, [$c5c6] ; 23:5287 - add b ; 23:528a - ld b, a ; 23:528b - ld a, [$c5c7] ; 23:528c - add b ; 23:528f - ld b, a ; 23:5290 - call AddOrSubtractX ; 23:5291 - add b ; 23:5294 - ld [de], a ; 23:5295 - inc hl ; 23:5296 - inc de ; 23:5297 - ld a, [$c5c3] ; 23:5298 - ld b, a ; 23:529b - ld a, [$c5c5] ; 23:529c - add b ; 23:529f - ld b, a ; 23:52a0 - ld a, [$c5c8] ; 23:52a1 - add b ; 23:52a4 - ld b, a ; 23:52a5 - call AddOrSubtractY ; 23:52a6 - add b ; 23:52a9 - ld [de], a ; 23:52aa - inc hl ; 23:52ab - inc de ; 23:52ac - ld a, [$c5c2] ; 23:52ad - add [hl] ; 23:52b0 - ld [de], a ; 23:52b1 - inc hl ; 23:52b2 - inc de ; 23:52b3 - call GetSpriteOAMAttr ; 23:52b4 - ld [de], a ; 23:52b7 - inc hl ; 23:52b8 - inc de ; 23:52b9 - ld a, e ; 23:52ba - ld [$c5bd], a ; 23:52bb - cp $a0 ; 23:52be - jr nc, reached_the_end ; 23:52c0 - dec c ; 23:52c2 - jr nz, .loop ; 23:52c3 - pop bc ; 23:52c5 - jr .done ; 23:52c6 + ; first byte: y (px) + ; [de] = [wCurAnimYCoord] + [wCurAnimYOffset] + [wGlobalAnimYOffset] + AddOrSubtractY([hl]) + ld a, [wCurAnimYCoord] + ld b, a + ld a, [wCurAnimYOffset] + add b + ld b, a + ld a, [wGlobalAnimYOffset] + add b + ld b, a + call AddOrSubtractY + add b + ld [de], a + inc hl + inc de + ; second byte: x (px) + ; [de] = [wCurAnimXCoord] + [wCurAnimXOffset] + [wGlobalAnimXOffset] + AddOrSubtractX([hl]) + ld a, [wCurAnimXCoord] + ld b, a + ld a, [wCurAnimXOffset] + add b + ld b, a + ld a, [wGlobalAnimXOffset] + add b + ld b, a + call AddOrSubtractX + add b + ld [de], a + inc hl + inc de + ; third byte: vtile + ; [de] = [wCurAnimVTile] + [hl] + ld a, [wCurAnimVTile] + add [hl] + ld [de], a + inc hl + inc de + ; fourth byte: attributes + ; [de] = GetSpriteOAMAttr([hl]) + call GetSpriteOAMAttr + ld [de], a + inc hl + inc de + ld a, e + ld [wCurSpriteOAMAddr], a + cp LOW(wVirtualOAMEnd) + jr nc, .reached_the_end + dec c + jr nz, .loop + pop bc + jr .done .delete - call DeinitializeSprite ; 23:52c8 + call DeinitializeSprite .done - and a ; 23:52cb - ret ; 23:52cc - -reached_the_end - pop bc ; 23:52cd - scf ; 23:52ce - ret ; 23:52cf - -AddOrSubtractX: ; 8d2d0 - push hl ; 23:52d0 - ld a, [hl] ; 23:52d1 - ld hl, $c5c0 ; 23:52d2 - bit 6, [hl] ; 23:52d5 - jr z, .ok ; 23:52d7 - add a, $8 ; 23:52d9 - xor $ff ; 23:52db - inc a ; 23:52dd + and a + ret + +.reached_the_end + pop bc + scf + ret + +AddOrSubtractY: + push hl + ld a, [hl] + ld hl, wCurSpriteOAMFlags + bit OAM_Y_FLIP, [hl] + jr z, .ok + ; -8 - a + add $8 + xor $ff + inc a + .ok - pop hl ; 23:52de - ret ; 23:52df - -AddOrSubtractY: ; 8d2e0 - push hl ; 23:52e0 - ld a, [hl] ; 23:52e1 - ld hl, $c5c0 ; 23:52e2 - bit 5, [hl] ; 23:52e5 - jr z, .ok ; 23:52e7 - add a, $8 ; 23:52e9 - xor $ff ; 23:52eb - inc a ; 23:52ed + pop hl + ret + +AddOrSubtractX: + push hl + ld a, [hl] + ld hl, wCurSpriteOAMFlags + bit OAM_X_FLIP, [hl] + jr z, .ok + ; -8 - a + add 8 + xor $ff + inc a + .ok - pop hl ; 23:52ee - ret ; 23:52ef - -GetSpriteOAMAttr: ; 8d2f0 - ld a, [$c5c0] ; 23:52f0 - ld b, a ; 23:52f3 - ld a, [hl] ; 23:52f4 - xor b ; 23:52f5 - and $e0 ; 23:52f6 - ld b, a ; 23:52f8 - ld a, [hl] ; 23:52f9 - and $1f ; 23:52fa - or b ; 23:52fc - ret ; 23:52fd - -InitAnimatedObjectBuffer: ; 8d2fe - xor a ; 23:52fe - ld [$c5c0], a ; 23:52ff - ld hl, $3 ; 23:5302 - add hl, bc ; 23:5305 - ld a, [hli] ; 23:5306 - ld [$c5c2], a ; 23:5307 - ld a, [hli] ; 23:530a - ld [$c5c3], a ; 23:530b - ld a, [hli] ; 23:530e - ld [$c5c4], a ; 23:530f - ld a, [hli] ; 23:5312 - ld [$c5c5], a ; 23:5313 - ld a, [hli] ; 23:5316 - ld [$c5c6], a ; 23:5317 - ret ; 23:531a - -GetAnimatedObjectVTile: ; 8d31b - push hl ; 23:531b - push bc ; 23:531c - ld hl, $c508 ; 23:531d - ld b, a ; 23:5320 - ld c, $a ; 23:5321 + pop hl + ret + +GetSpriteOAMAttr: + ld a, [wCurSpriteOAMFlags] + ld b, a + ld a, [hl] + xor b + and PRIORITY | Y_FLIP | X_FLIP + ld b, a + ld a, [hl] + and $ff ^ (PRIORITY | Y_FLIP | X_FLIP) + or b + ret + +InitSpriteAnimBuffer: + xor a + ld [wCurSpriteOAMFlags], a + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld a, [hli] + ld [wCurAnimVTile], a + ld a, [hli] + ld [wCurAnimXCoord], a + ld a, [hli] + ld [wCurAnimYCoord], a + ld a, [hli] + ld [wCurAnimXOffset], a + ld a, [hli] + ld [wCurAnimYOffset], a + ret + +GetSpriteAnimVTile: +; a = wSpriteAnimDict[a] if a in wSpriteAnimDict else 0 +; vTiles offset + push hl + push bc + ld hl, wSpriteAnimDict + ld b, a + ld c, NUM_SPRITE_ANIM_STRUCTS .loop - ld a, [hli] ; 23:5323 - cp b ; 23:5324 - jr z, .ok ; 23:5325 - inc hl ; 23:5327 - dec c ; 23:5328 - jr nz, .loop ; 23:5329 - xor a ; 23:532b - jr .done ; 23:532c + ld a, [hli] + cp b + jr z, .ok + inc hl + dec c + jr nz, .loop + xor a + jr .done .ok - ld a, [hl] ; 23:532e + ld a, [hl] + .done - pop bc ; 23:532f - pop hl ; 23:5330 - ret ; 23:5331 - -Function8d332: ; 8d332 - ld hl, $1 ; 23:5332 - add hl, bc ; 23:5335 - ld [hl], a ; 23:5336 - ld hl, $8 ; 23:5337 - add hl, bc ; 23:533a - ld [hl], $0 ; 23:533b - ld hl, $a ; 23:533d - add hl, bc ; 23:5340 - ld [hl], $ff ; 23:5341 - ret ; 23:5343 - -GetAnimatedObjectFrame: ; 8d344 + pop bc + pop hl + ret + +_ReinitSpriteAnimFrame:: + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld [hl], 0 + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + ld [hl], -1 + ret + +GetSpriteAnimFrame: .loop - ld hl, $8 ; 23:5344 - add hl, bc ; 23:5347 - ld a, [hl] ; 23:5348 - and a ; 23:5349 - jr z, .next_frame ; 23:534a - dec [hl] ; 23:534c - call .GetPointer ; 23:534d - ld a, [hli] ; 23:5350 - push af ; 23:5351 - jr .okay ; 23:5352 + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld a, [hl] + and a + jr z, .next_frame ; finished the current sequence + dec [hl] + call .GetPointer ; load pointer from SpriteAnimFrameData + ld a, [hli] + push af + jr .okay .next_frame - ld hl, $a ; 23:5354 - add hl, bc ; 23:5357 - inc [hl] ; 23:5358 - call .GetPointer ; 23:5359 - ld a, [hli] ; 23:535c - cp $fe ; 23:535d - jr z, .restart ; 23:535f - cp $ff ; 23:5361 - jr z, .repeat_last ; 23:5363 - push af ; 23:5365 - ld a, [hl] ; 23:5366 - push hl ; 23:5367 - and $3f ; 23:5368 - ld hl, $9 ; 23:536a - add hl, bc ; 23:536d - add [hl] ; 23:536e - ld hl, $8 ; 23:536f - add hl, bc ; 23:5372 - ld [hl], a ; 23:5373 - pop hl ; 23:5374 + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + inc [hl] + call .GetPointer ; load pointer from SpriteAnimFrameData + ld a, [hli] + cp dorestart_command + jr z, .restart + cp endanim_command + jr z, .repeat_last + + push af + ld a, [hl] + push hl + and $ff ^ (Y_FLIP << 1 | X_FLIP << 1) + ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET + add hl, bc + add [hl] + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld [hl], a + pop hl .okay - ld a, [hl] ; 23:5375 - and $c0 ; 23:5376 - srl a ; 23:5378 - ld [$c5c0], a ; 23:537a - pop af ; 23:537d - ret ; 23:537e - -.repeat_last ; 8d37f - xor a ; 23:537f - ld hl, $8 ; 23:5380 - add hl, bc ; 23:5383 - ld [hl], a ; 23:5384 - ld hl, $a ; 23:5385 - add hl, bc ; 23:5388 - dec [hl] ; 23:5389 - dec [hl] ; 23:538a - jr .loop ; 23:538b + ld a, [hl] + and Y_FLIP << 1 | X_FLIP << 1 ; The << 1 is compensated in the "frame" macro + srl a + ld [wCurSpriteOAMFlags], a + pop af + ret + +.repeat_last + xor a + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + dec [hl] + dec [hl] + jr .loop .restart - xor a ; 23:538d - ld hl, $8 ; 23:538e - add hl, bc ; 23:5391 - ld [hl], a ; 23:5392 - dec a ; 23:5393 - ld hl, $a ; 23:5394 - add hl, bc ; 23:5397 - ld [hl], a ; 23:5398 - jr .loop ; 23:5399 - -.GetPointer - ld hl, $1 ; 23:539b - add hl, bc ; 23:539e - ld e, [hl] ; 23:539f - ld d, $0 ; 23:53a0 - ld hl, AnimatedObjectFrameData ; 23:53a2 - add hl, de ; 23:53a5 - add hl, de ; 23:53a6 - ld e, [hl] ; 23:53a7 - inc hl ; 23:53a8 - ld d, [hl] ; 23:53a9 - ld hl, $a ; 23:53aa - add hl, bc ; 23:53ad - ld l, [hl] ; 23:53ae - ld h, $0 ; 23:53af - add hl, hl ; 23:53b1 - add hl, de ; 23:53b2 - ret ; 23:53b3 - -GetFrameOAMPointer: ; 8d3b4 - ld e, a ; 23:53b4 - ld d, $0 ; 23:53b5 - ld hl, AnimatedObjectOAMData ; 23:53b7 - add hl, de ; 23:53ba - add hl, de ; 23:53bb - add hl, de ; 23:53bc - ret ; 23:53bd - -BrokenGetStdGraphics: ; 8d3be - push hl ; 23:53be - ld l, a ; 23:53bf - ld h, $0 ; 23:53c0 - add hl, hl ; 23:53c2 - add hl, hl ; 23:53c3 - ld de, $6666 ; 23:53c4 - add hl, de ; 23:53c7 - ld c, [hl] ; 23:53c8 - inc hl ; 23:53c9 - ld b, [hl] ; 23:53ca - inc hl ; 23:53cb - ld e, [hl] ; 23:53cc - inc hl ; 23:53cd - ld d, [hl] ; 23:53ce - pop hl ; 23:53cf - push bc ; 23:53d0 - call $dfe ; Request2bpp ; 23:53d1 - pop bc ; 23:53d4 - ret ; 23:53d5 - -AnimatedObjectSeqData: ; 8d3d6 - db $01, $01, $00 - db $04, $04, $00 - db $05, $05, $00 - db $06, $06, $00 - db $07, $07, $00 - db $08, $08, $00 - db $09, $09, $01 - db $0a, $09, $01 - db $0b, $0a, $01 - db $0d, $0b, $01 - db $10, $0c, $01 - db $12, $0d, $02 - db $13, $0e, $02 - db $14, $0f, $02 - db $15, $0e, $02 - db $16, $10, $00 - db $0d, $11, $01 - db $10, $12, $01 - db $09, $13, $01 - db $0b, $14, $01 - db $1a, $15, $05 - db $1c, $16, $06 - db $1d, $17, $06 - db $1e, $18, $06 - db $1f, $19, $07 - db $20, $1a, $07 - db $22, $1b, $07 - db $1a, $1c, $05 - db $23, $00, $00 - db $24, $1d, $08 - db $24, $1e, $08 - db $24, $1f, $08 - db $25, $20, $00 - db $27, $00, $00 - db $28, $21, $00 - db $29, $22, $00 - db $2a, $22, $00 - db $2b, $23, $00 - db $2c, $24, $00 - db $2d, $00, $00 - db $2f, $25, $00 - db $30, $00, $00 - db $2f, $27, $00 - db $31, $00, $00 - db $36, $29, $00 - db $37, $00, $00 - db $32, $23, $00 - -INCLUDE "engine/sprite_anims.asm" -INCLUDE "data/sprite_engine.asm" + xor a + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld [hl], a + + dec a + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + ld [hl], a + jr .loop + +.GetPointer: + ; Get the data for the current frame for the current animation sequence + + ; SpriteAnimFrameData[SpriteAnim[SPRITEANIMSTRUCT_FRAMESET_ID]][SpriteAnim[SPRITEANIMSTRUCT_FRAME]] + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, SpriteAnimFrameData + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + ld l, [hl] + ld h, 0 + add hl, hl + add hl, de + ret + +GetFrameOAMPointer: +; Load OAM data pointer + ld e, a + ld d, 0 + ld hl, SpriteAnimOAMData + add hl, de + add hl, de + add hl, de + ret + +Unreferenced_BrokenGetStdGraphics: + push hl + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld de, BrokenStdGFXPointers ; broken 2bpp pointers + add hl, de + ld c, [hl] + inc hl + ld b, [hl] + inc hl + ld e, [hl] + inc hl + ld d, [hl] + pop hl + push bc + call Request2bpp + pop bc + ret + +INCLUDE "data/sprite_anims/sequences.asm" + +INCLUDE "engine/gfx/sprite_anims.asm" + +INCLUDE "data/sprite_anims/framesets.asm" + +INCLUDE "data/sprite_anims/oam.asm" + +BrokenStdGFXPointers: + ; tile count, bank, pointer + ; (all pointers were dummied out to .deleted) + dbbw 128, $01, .deleted + dbbw 128, $01, .deleted + dbbw 128, $01, .deleted + dbbw 128, $01, .deleted + dbbw 16, $37, .deleted + dbbw 16, $11, .deleted + dbbw 16, $39, .deleted + dbbw 16, $24, .deleted + dbbw 16, $21, .deleted + +.deleted Sprites_Cosine: - add a, $10 ; 23:668a +; a = d * cos(a * pi/32) + add %010000 ; cos(x) = sin(x + pi/2) + ; fallthrough Sprites_Sine: - and $3f ; 23:668c - cp $20 ; 23:668e - jr nc, .negative ; 23:6690 - call .ApplySineWave ; 23:6692 - ld a, h ; 23:6695 - ret ; 23:6696 - -.negative - and $1f ; 23:6697 - call .ApplySineWave ; 23:6699 - ld a, h ; 23:669c - xor $ff ; 23:669d - inc a ; 23:669f - ret ; 23:66a0 - -.ApplySineWave: - ld e, a ; 23:66a1 - ld a, d ; 23:66a2 - ld d, $0 ; 23:66a3 - ld hl, .sinewave ; 23:66a5 - add hl, de ; 23:66a8 - add hl, de ; 23:66a9 - ld e, [hl] ; 23:66aa - inc hl ; 23:66ab - ld d, [hl] ; 23:66ac - ld hl, $0 ; 23:66ad -.multiply - srl a ; 23:66b0 - jr nc, .even ; 23:66b2 - add hl, de ; 23:66b4 -.even - sla e ; 23:66b5 - rl d ; 23:66b7 - and a ; 23:66b9 - jr nz, .multiply ; 23:66ba - ret ; 23:66bc - -.sinewave ; 8e75d - sine_wave $100 +; a = d * sin(a * pi/32) + calc_sine_wave .SineWave + +.SineWave: + sine_table 256 AnimateEndOfExpBar: - ldh a, [$ffe9] ; 23:66fd - ld de, EndOfExpBarGFX ; 23:66ff - and a ; 23:6702 - jr z, .got_gfx ; 23:6703 - ld de, SGBEndOfExpBarGFX ; 23:6705 -.got_gfx - ld hl, VTiles0 tile $00 ; 23:6708 - lb bc, BANK(EndOfExpBarGFX), 1 ; 23:670b - call $dfe ; Request2bpp ; 23:670e - ld c, $8 ; 23:6711 - ld d, $0 ; 23:6713 + ldh a, [hSGB] + ld de, EndOfExpBarGFX + and a + jr z, .load + ld de, SGBEndOfExpBarGFX + +.load + ld hl, vTiles0 tile $00 + lb bc, BANK(EndOfExpBarGFX), 1 + call Request2bpp + ld c, 8 + ld d, 0 .loop - push bc ; 23:6715 - call .AnimateFrame ; 23:6716 - call $32e ; DelayFrame ; 23:6719 - pop bc ; 23:671c - inc d ; 23:671d - inc d ; 23:671e - dec c ; 23:671f - jr nz, .loop ; 23:6720 - call $30ff ; ClearSprites ; 23:6722 - ret ; 23:6725 - -.AnimateFrame - ld hl, $c300 ; 23:6726 - ld c, $8 ; 23:6729 + push bc + call .AnimateFrame + call DelayFrame + pop bc + inc d + inc d + dec c + jr nz, .loop + call ClearSprites + ret + +.AnimateFrame: + ld hl, wVirtualOAMSprite00 + ld c, 8 ; number of animated circles .anim_loop - ld a, c ; 23:672b - and a ; 23:672c - ret z ; 23:672d - dec c ; 23:672e - ld a, c ; 23:672f - sla a ; 23:6730 - sla a ; 23:6732 - sla a ; 23:6734 - push af ; 23:6736 - push de ; 23:6737 - push hl ; 23:6738 - call Sprites_Sine ; 23:6739 - pop hl ; 23:673c - pop de ; 23:673d - add a, $68 ; 23:673e - ld [hli], a ; 23:6740 - pop af ; 23:6741 - push de ; 23:6742 - push hl ; 23:6743 - call Sprites_Cosine ; 23:6744 - pop hl ; 23:6747 - pop de ; 23:6748 - add a, $54 ; 23:6749 - ld [hli], a ; 23:674b - ld a, $0 ; 23:674c - ld [hli], a ; 23:674e - ld a, $6 ; 23:674f - ld [hli], a ; 23:6751 - jr .anim_loop ; 23:6752 + ld a, c + and a + ret z + dec c + ld a, c +; multiply by 8 + sla a + sla a + sla a + push af + + push de + push hl + call Sprites_Sine + pop hl + pop de + add 13 * TILE_WIDTH + ld [hli], a ; y + + pop af + push de + push hl + call Sprites_Cosine + pop hl + pop de + add 10 * TILE_WIDTH + 4 + ld [hli], a ; x + + ld a, $0 + ld [hli], a ; tile id + ld a, PAL_BATTLE_OB_BLUE + ld [hli], a ; attributes + jr .anim_loop EndOfExpBarGFX: - dr $8e754, $8e764 - +INCBIN "gfx/battle/expbarend.2bpp" SGBEndOfExpBarGFX: - dr $8e764, $8e774 - -ClearAnimatedObjects2 - push hl ; 23:6774 - push de ; 23:6775 - push bc ; 23:6776 - push af ; 23:6777 - ld hl, $c508 ; 23:6778 - ld bc, $c1 ; 23:677b +INCBIN "gfx/battle/expbarend_sgb.2bpp" + +ClearSpriteAnims2: + push hl + push de + push bc + push af + ld hl, wSpriteAnimDict + ld bc, wSpriteAnimsEnd - wSpriteAnimDict .loop - ld [hl], $0 ; 23:677e - inc hl ; 23:6780 - dec bc ; 23:6781 - ld a, c ; 23:6782 - or b ; 23:6783 - jr nz, .loop ; 23:6784 - pop af ; 23:6786 - pop bc ; 23:6787 - pop de ; 23:6788 - pop hl ; 23:6789 - ret ; 23:678a -; 8e78a + ld [hl], 0 + inc hl + dec bc + ld a, c + or b + jr nz, .loop + pop af + pop bc + pop de + pop hl + ret |