diff options
Diffstat (limited to 'engine/gfx/mon_icons.asm')
-rwxr-xr-x | engine/gfx/mon_icons.asm | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/engine/gfx/mon_icons.asm b/engine/gfx/mon_icons.asm new file mode 100755 index 00000000..d2913715 --- /dev/null +++ b/engine/gfx/mon_icons.asm @@ -0,0 +1,295 @@ +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, wOAMBuffer + ld bc, $60 + call CopyData + pop bc + xor a + jr .incTimer +.animateSprite + push bc + ld hl, wOAMBuffer + $02 ; OAM tile id + ld bc, $10 + ld a, [wCurrentMenuItem] + call AddNTimes + ld c, $40 ; amount to increase the tile id by + ld a, [hl] + cp $4 ; tile ID for ICON_BALL + jr z, .editCoords + cp $8 ; tile ID for ICON_HELIX + 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, $1c + +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, $1c + 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 FarCopyData2 + pop hl + pop bc + ld a, $6 + add c + ld c, a + pop af + dec a + jr nz, .loop + jp EnableLCD + +INCLUDE "data/mon_party_sprite_pointers.asm" + +WriteMonPartySpriteOAMByPartyIndex: +; Write OAM blocks for the party mon in [hPartyMonIndex]. + push hl + push de + push bc + ld a, [hPartyMonIndex] + 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 + +WriteMonPartySpriteOAMBySpecies: +; Write OAM blocks for the party sprite of the species in +; [wMonPartySpriteSpecies]. + xor a + ld [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 + call .LoadTilePatterns + pop af + add $54 + ld hl, vSprites + $40 + 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, wOAMBuffer / $100 + ld 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, wOAMBuffer + 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 + srl a + ret + +INCLUDE "data/mon_party_sprites.asm" + +INC_FRAME_1 EQUS "0, $20" +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 + +TradeBubbleIconGFX: INCBIN "gfx/trade/bubble.2bpp" |