;Backported from Yellow AnimatePartyMon_ForceSpeed1: xor a ld [wCurrentMenuItem], a ld b, a inc a jr GetAnimationSpeed ; wPartyMenuHPBarColors contains the party mon's health bar colors ; 0: green ; 1: yellow ; 2: red AnimatePartyMon:: ld hl, wPartyMenuHPBarColors ld a, [wCurrentMenuItem] ld c, a ld b, 0 add hl, bc ld a, [hl] GetAnimationSpeed: ld c, a ld hl, PartyMonSpeeds add hl, bc ld a, [wOnSGB] xor $1 add [hl] ld c, a add a ld b, a ld a, [wAnimCounter] and a jr z, .resetSprites cp c jr z, .animateSprite .incTimer inc a cp b jr nz, .skipResetTimer xor a ; reset timer .skipResetTimer ld [wAnimCounter], a jp DelayFrame .resetSprites push bc ld hl, wMonPartySpritesSavedOAM ld de, wShadowOAM ld bc, $60 call CopyData pop bc xor a jr .incTimer .animateSprite push bc ld hl, wShadowOAMSprite00TileID ld bc, $10 ld a, [wCurrentMenuItem] call AddNTimes ld c, ICONOFFSET ld a, [hl] cp ICON_BALL << 2 jr z, .editCoords cp ICON_HELIX << 2 jr nz, .editTileIDS ; ICON_BALL and ICON_HELIX only shake up and down .editCoords dec hl dec hl ; dec hl to the OAM y coord ld c, $1 ; amount to increase the y coord by ; otherwise, load a second sprite frame .editTileIDS ld b, $4 ld de, $4 .loop ld a, [hl] add c ld [hl], a add hl, de dec b jr nz, .loop pop bc ld a, c jr .incTimer ; Party mon animations cycle between 2 frames. ; The members of the PartyMonSpeeds array specify the number of V-blanks ; that each frame lasts for green HP, yellow HP, and red HP in order. ; On the naming screen, the yellow HP speed is always used. PartyMonSpeeds: db 5, 16, 32 LoadMonPartySpriteGfx: ; Load mon party sprite tile patterns into VRAM during V-blank. ld hl, MonPartySpritePointers ld a, $24 ; Number of pointers in the list in hex. eg. Yellow has 30, so 1E is used. LoadAnimSpriteGfx: ; Load animated sprite tile patterns into VRAM during V-blank. hl is the address ; of an array of structures that contain arguments for CopyVideoData and a is ; the number of structures in the array. ld bc, $0 .loop push af push bc push hl add hl, bc ld a, [hli] ld e, a ld a, [hli] ld d, a ld a, [hli] ld c, a ld a, [hli] ld b, a ld a, [hli] ld h, [hl] ld l, a call CopyVideoData pop hl pop bc ld a, $6 add c ld c, a pop af dec a jr nz, .loop ret LoadMonPartySpriteGfxWithLCDDisabled: ; Load mon party sprite tile patterns into VRAM immediately by disabling the ; LCD. call DisableLCD ld hl, MonPartySpritePointers ld a, $24 ; Number of pointers in the list in hex. eg. Yellow has 30, so 1E is used. ld bc, $0 .loop push af push bc push hl add hl, bc ld a, [hli] ld e, a ld a, [hli] ld d, a push de ld a, [hli] ld c, a swap c ld b, $0 ld a, [hli] ld e, [hl] inc hl ld d, [hl] pop hl call FarCopyData pop hl pop bc ld a, $6 add c ld c, a pop af dec a jr nz, .loop jp EnableLCD INCLUDE "data/icon_pointers.asm" WriteMonPartySpriteOAMByPartyIndex: ; Write OAM blocks for the party mon in [hPartyMonIndex]. push hl push de push bc ldh a, [hPartyMonIndex] cp $ff jr z, .asm_7191f ld hl, wPartySpecies ld e, a ld d, 0 add hl, de ld a, [hl] call GetPartyMonSpriteID ld [wOAMBaseTile], a call WriteMonPartySpriteOAM pop bc pop de pop hl ret .asm_7191f ld hl, wShadowOAM ld de, wMonPartySpritesSavedOAM ld bc, $60 call CopyData pop bc pop de pop hl ret WriteMonPartySpriteOAMBySpecies: ; Write OAM blocks for the party sprite of the species in ; [wMonPartySpriteSpecies]. xor a ldh [hPartyMonIndex], a ld a, [wMonPartySpriteSpecies] call GetPartyMonSpriteID ld [wOAMBaseTile], a jr WriteMonPartySpriteOAM ;UnusedPartyMonSpriteFunction: ; This function is unused and doesn't appear to do anything useful. It looks ; like it may have been intended to load the tile patterns and OAM data for ; the mon party sprite associated with the species in [wcf91]. ; However, its calculations are off and it loads garbage data. ; ld a, [wcf91] ; call GetPartyMonSpriteID ; push af ; ld hl, vSprites tile $00 ; call .LoadTilePatterns ; pop af ; add $5A ; ld hl, vSprites tile $04 ; call .LoadTilePatterns ; xor a ; ld [wMonPartySpriteSpecies], a ; jr WriteMonPartySpriteOAMBySpecies ;.LoadTilePatterns ; push hl ; add a ; ld c, a ; ld b, 0 ; ld hl, MonPartySpritePointers ; add hl, bc ; add hl, bc ; add hl, bc ; ld a, [hli] ; ld e, a ; ld a, [hli] ; ld d, a ; ld a, [hli] ; ld c, a ; ld a, [hli] ; ld b, a ; pop hl ; jp CopyVideoData WriteMonPartySpriteOAM: ; Write the OAM blocks for the first animation frame into the OAM buffer and ; make a copy at wMonPartySpritesSavedOAM. push af ld c, $10 ld h, HIGH(wShadowOAM) ldh a, [hPartyMonIndex] swap a ld l, a add $10 ld b, a pop af cp ICON_HELIX << 2 jr z, .helix call WriteSymmetricMonPartySpriteOAM jr .makeCopy .helix call WriteAsymmetricMonPartySpriteOAM ; Make a copy of the OAM buffer with the first animation frame written so that ; we can flip back to it from the second frame by copying it back. .makeCopy ld hl, wShadowOAM ld de, wMonPartySpritesSavedOAM ld bc, $60 jp CopyData GetPartyMonSpriteID: ld [wd11e], a predef IndexToPokedex ld a, [wd11e] ld c, a dec a srl a ld hl, MonPartyData ld e, a ld d, 0 add hl, de ld a, [hl] bit 0, c jr nz, .skipSwap swap a ; use lower nybble if pokedex num is even .skipSwap and $f0 srl a ; value == ICON constant << 2 srl a ret INCLUDE "data/pokemon/menu_icons.asm" DEF INC_FRAME_1 EQUS "0, $20" DEF INC_FRAME_2 EQUS "$20, $20" BugIconFrame1: INCBIN "gfx/icons/bug.2bpp", INC_FRAME_1 PlantIconFrame1: INCBIN "gfx/icons/plant.2bpp", INC_FRAME_1 BugIconFrame2: INCBIN "gfx/icons/bug.2bpp", INC_FRAME_2 PlantIconFrame2: INCBIN "gfx/icons/plant.2bpp", INC_FRAME_2 SnakeIconFrame1: INCBIN "gfx/icons/snake.2bpp", INC_FRAME_1 QuadrupedIconFrame1: INCBIN "gfx/icons/quadruped.2bpp", INC_FRAME_1 SnakeIconFrame2: INCBIN "gfx/icons/snake.2bpp", INC_FRAME_2 QuadrupedIconFrame2: INCBIN "gfx/icons/quadruped.2bpp", INC_FRAME_2 CatIconFrame1: INCBIN "gfx/icons/cat.2bpp", INC_FRAME_1 CatIconFrame2: INCBIN "gfx/icons/cat.2bpp", INC_FRAME_2 TradeBubbleIconGFX: INCBIN "gfx/trade/bubble.2bpp"