kep-hack/engine/gfx/mon_icons.asm
Llinos Evans 9b387cab7e Expanding on Pokemon icon usage
This adds Pikachu, Cat, and "Small Bird" menu icons. The cat has a custom animation done by myself.

The Jigglypuff in the Pokemon Centre now uses the new sprite, nice 'n' pretty. Officer Jenny is also in Cerulean. The Pokemon from Melanie's house in Yellow have been put in Mr. Fuji's House, given the purpose of the house in RB is different. I think it ends up fitting very nicely.

Chansey has been given its proper sprite in Fuschia. Yellow didn't actually do this, as Chansey doesn't have a walk cycle, causing the stuff that exists to go unused. I wanted it, though, so I had Chansey just not walk and turn around. Oh, and it's in all the Pokemon Centres now. Yeah, that's a...lot of changed files.
2023-04-23 21:25:45 +01:00

310 lines
6 KiB
NASM

;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, $22 ; 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"