jep-hack/engine/gfx/load_pics.asm
Llinos Evans 6a44f96575 Add Unown ! and ?
Taken from https://github.com/pret/pokecrystal/wiki/Add-a-new-Unown-form

There's some embedded palette errors that need fixing.
2024-09-01 14:54:29 +01:00

476 lines
6.8 KiB
NASM

; Modified to add ! and ?
; Used https://github.com/pret/pokecrystal/wiki/Add-a-new-Unown-form
GetUnownLetter:
; Return Unown letter in wUnownLetter based on DVs at hl
; Take the middle 2 bits of each DV and place them in order:
; atk def spd spc
; .ww..xx. .yy..zz.
; atk
ld a, [hl]
and %01100000
sla a
ld b, a
; def
ld a, [hli]
and %00000110
swap a
srl a
or b
ld b, a
; spd
ld a, [hl]
and %01100000
swap a
sla a
or b
ld b, a
; spc
ld a, [hl]
and %00000110
srl a
or b
; Divide by 9 to get 0-28 - changed to add ! and ?
ldh [hDividend + 3], a
xor a
ldh [hDividend], a
ldh [hDividend + 1], a
ldh [hDividend + 2], a
ld a, 9
ldh [hDivisor], a
ld b, 4
call Divide
; Increment to get 1-29
ldh a, [hQuotient + 3]
inc a
; The valid range is 1-28, so use UNOWN_E (5) instead of 29
cp NUM_UNOWN + 1
jr c, .valid
ld a, UNOWN_E
.valid
ld [wUnownLetter], a
ret
GetMonFrontpic:
ld a, [wCurPartySpecies]
ld [wCurSpecies], a
call IsAPokemon
ret c
ldh a, [rSVBK]
push af
call _GetFrontpic
pop af
ldh [rSVBK], a
jp CloseSRAM
GetAnimatedFrontpic:
ld a, [wCurPartySpecies]
ld [wCurSpecies], a
call IsAPokemon
ret c
ldh a, [rSVBK]
push af
xor a
ldh [hBGMapMode], a
call _GetFrontpic
ld a, BANK(vTiles3)
ldh [rVBK], a
call GetAnimatedEnemyFrontpic
xor a
ldh [rVBK], a
pop af
ldh [rSVBK], a
jp CloseSRAM
_GetFrontpic:
ld a, BANK(sEnemyFrontPicTileCount)
call OpenSRAM
push de
call GetBaseData
ld a, [wBasePicSize]
and $f
ld b, a
push bc
call GetFrontpicPointer
ld a, BANK(wDecompressScratch)
ldh [rSVBK], a
ld a, b
ld de, wDecompressScratch
call FarDecompress
; calculate tile count from final address; requires wDecompressScratch to be at the beginning of the bank
swap e
swap d
ld a, d
and $f0 ; get rid of the upper nibble of the address
or e
; and save the tile count for later
ld [sEnemyFrontPicTileCount], a
pop bc
ld hl, sPaddedEnemyFrontPic
ld de, wDecompressScratch
call PadFrontpic
pop hl
push hl
ld de, sPaddedEnemyFrontPic
ld c, 7 * 7
ldh a, [hROMBank]
ld b, a
call Get2bpp
pop hl
ret
GetPicIndirectPointer:
ld a, [wCurPartySpecies]
call GetPokemonIndexFromID
ld b, h
ld c, l
ld a, l
sub LOW(UNOWN)
if HIGH(UNOWN) == 0
or h
else
jr nz, .not_unown
if HIGH(UNOWN) == 1
dec h
else
ld a, h
cp HIGH(UNOWN)
endc
endc
jr z, .unown
.not_unown
ld hl, PokemonPicPointers
ld d, BANK(PokemonPicPointers)
.done
ld a, 6
jp AddNTimes
.unown
ld a, [wUnownLetter]
ld c, a
ld b, 0
ld hl, UnownPicPointers - 6
ld d, BANK(UnownPicPointers)
jr .done
GetFrontpicPointer:
call GetPicIndirectPointer
ld a, d
call GetFarByte
push af
inc hl
ld a, d
call GetFarWord
pop bc
ret
GetAnimatedEnemyFrontpic:
push hl
ld de, sPaddedEnemyFrontPic
ld c, 7 * 7
ldh a, [hROMBank]
ld b, a
call Get2bpp
pop hl
ld de, 7 * 7 tiles
add hl, de
push hl
ld a, BANK(wBasePicSize)
ld hl, wBasePicSize
call GetFarWRAMByte
pop hl
and $f
ld de, wDecompressScratch + 5 * 5 tiles
ld c, 5 * 5
cp 5
jr z, .got_dims
ld de, wDecompressScratch + 6 * 6 tiles
ld c, 6 * 6
cp 6
jr z, .got_dims
ld de, wDecompressScratch + 7 * 7 tiles
ld c, 7 * 7
.got_dims
; calculate the number of tiles dedicated to animation
ld a, [sEnemyFrontPicTileCount]
sub c
; exit early if none
ret z
ld c, a
push hl
push bc
call LoadFrontpicTiles
pop bc
pop hl
ld de, wDecompressScratch
ldh a, [hROMBank]
ld b, a
; if the tiles fit in a single VRAM block ($80 tiles), load them...
ld a, c
sub 128 - 7 * 7
jr c, .finish
; otherwise, load as many as we can...
inc a
ld [sEnemyFrontPicTileCount], a ; save the remainder
ld c, 127 - 7 * 7
call Get2bpp
; ...and load the rest into vTiles4
ld de, wDecompressScratch + (127 - 7 * 7) tiles
ld hl, vTiles4
ldh a, [hROMBank]
ld b, a
ld a, [sEnemyFrontPicTileCount]
ld c, a
.finish
jp Get2bpp
LoadFrontpicTiles:
ld hl, wDecompressScratch
swap c
ld a, c
and $f
ld b, a
ld a, c
and $f0
ld c, a
push bc
call LoadOrientedFrontpic
pop bc
ld a, c
and a
jr z, .handle_loop
inc b
jr .handle_loop
.loop
push bc
ld c, 0
call LoadOrientedFrontpic
pop bc
.handle_loop
dec b
jr nz, .loop
ret
GetMonBackpic:
ld a, [wCurPartySpecies]
call IsAPokemon
ret c
ldh a, [rSVBK]
push af
push de
call GetPicIndirectPointer
ld a, BANK(wDecompressScratch)
ldh [rSVBK], a
inc hl
inc hl
inc hl
ld a, d
call GetFarByte
push af
inc hl
ld a, d
call GetFarWord
ld de, wDecompressScratch
pop af
call FarDecompress
ld hl, wDecompressScratch
ld c, 6 * 6
call FixBackpicAlignment
pop hl
ld de, wDecompressScratch
ldh a, [hROMBank]
ld b, a
call Get2bpp
pop af
ldh [rSVBK], a
ret
GetTrainerPic:
ld a, [wTrainerClass]
and a
ret z
cp NUM_TRAINER_CLASSES + 1
ret nc
call WaitBGMap
xor a
ldh [hBGMapMode], a
ld hl, TrainerPicPointers
ld a, [wTrainerClass]
dec a
ld bc, 3
call AddNTimes
ldh a, [rSVBK]
push af
ld a, BANK(wDecompressScratch)
ldh [rSVBK], a
push de
ld a, BANK(TrainerPicPointers)
call GetFarByte
push af
inc hl
ld a, BANK(TrainerPicPointers)
call GetFarWord
pop af
ld de, wDecompressScratch
call FarDecompress
pop hl
ld de, wDecompressScratch
ld c, 7 * 7
ldh a, [hROMBank]
ld b, a
call Get2bpp
pop af
ldh [rSVBK], a
call WaitBGMap
ld a, 1
ldh [hBGMapMode], a
ret
DecompressGet2bpp:
; Decompress lz data from b:hl to wDecompressScratch, then copy it to address de.
ldh a, [rSVBK]
push af
ld a, BANK(wDecompressScratch)
ldh [rSVBK], a
push de
push bc
ld a, b
ld de, wDecompressScratch
call FarDecompress
pop bc
ld de, wDecompressScratch
pop hl
ldh a, [hROMBank]
ld b, a
call Get2bpp
pop af
ldh [rSVBK], a
ret
FixBackpicAlignment:
push de
push bc
ld a, [wBoxAlignment]
and a
jr z, .keep_dims
ld a, c
cp 7 * 7
ld de, 7 * 7 tiles
jr z, .got_dims
cp 6 * 6
ld de, 6 * 6 tiles
jr z, .got_dims
ld de, 5 * 5 tiles
.got_dims
ld a, [hl]
ld b, 0
ld c, 8
.loop
rra
rl b
dec c
jr nz, .loop
ld a, b
ld [hli], a
dec de
ld a, e
or d
jr nz, .got_dims
.keep_dims
pop bc
pop de
ret
PadFrontpic:
; pads frontpic to fill 7x7 box
ld a, b
cp 6
jr z, .six
cp 5
jr z, .five
.seven_loop
ld c, 7 << 4
call LoadOrientedFrontpic
dec b
jr nz, .seven_loop
ret
.six
ld c, 7 << 4
xor a
call .Fill
.six_loop
ld c, (7 - 6) << 4
xor a
call .Fill
ld c, 6 << 4
call LoadOrientedFrontpic
dec b
jr nz, .six_loop
ret
.five
ld c, 7 << 4
xor a
call .Fill
.five_loop
ld c, (7 - 5) << 4
xor a
call .Fill
ld c, 5 << 4
call LoadOrientedFrontpic
dec b
jr nz, .five_loop
ld c, 7 << 4
xor a
call .Fill
ret
.Fill:
ld [hli], a
dec c
jr nz, .Fill
ret
LoadOrientedFrontpic:
ld a, [wBoxAlignment]
and a
jr nz, .x_flip
.left_loop
ld a, [de]
inc de
ld [hli], a
dec c
jr nz, .left_loop
ret
.x_flip
push bc
.right_loop
ld a, [de]
inc de
ld b, a
xor a
rept 8
rr b
rla
endr
ld [hli], a
dec c
jr nz, .right_loop
pop bc
ret