pokegold/engine/gfx/load_pics.asm

431 lines
5.7 KiB
NASM

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 10 to get 0-25
ldh [hDividend + 3], a
xor a
ldh [hDividend], a
ldh [hDividend + 1], a
ldh [hDividend + 2], a
ld a, $ff / NUM_UNOWN + 1
ldh [hDivisor], a
ld b, 4
call Divide
; Increment to get 1-26
ldh a, [hQuotient + 3]
inc a
ld [wUnownLetter], a
ret
GetMonFrontpic:
call GetFrontpic
jp Load2bppToSRAM
UnusedFrontpicPredef:
call GetFrontpic
push hl
farcall StubbedGetFrontpic
pop hl
jp Load2bppToSRAM
GetFrontpic:
ld a, [wCurPartySpecies]
ld [wCurSpecies], a
and a
ret z
cp NUM_POKEMON + 1
ret z
cp EGG + 1
ret nc
.is_a_pokemon
push de
call GetBaseData
ld a, [wBasePicSize]
and $f
ld b, a
push bc
ld a, BANK(sDecompressBuffer)
call OpenSRAM
ld hl, PokemonPicPointers ; UnownPicPointers
ld a, [wCurPartySpecies]
ld d, BANK(PokemonPicPointers)
cp UNOWN
jr z, .unown
cp EGG
jr nz, .not_egg
ld hl, EggPic
ld a, BANK(EggPic)
jr .ok
.unown
ld a, [wUnownLetter]
ld d, BANK(UnownPicPointers)
.not_egg
dec a
ld bc, 6
call AddNTimes
ld a, d
call GetFarByte
call FixPicBank
push af
inc hl
ld a, d
call GetFarHalfword
pop af
.ok
ld de, sDecompressBuffer
call FarDecompress
pop bc
ld hl, sDecompressScratch
ld de, sDecompressBuffer
call PadFrontpic
pop hl
ret
Load2bppToSRAM:
ld de, sDecompressScratch
ld c, 7 * 7
ldh a, [hROMBank]
ld b, a
call Get2bpp
jp CloseSRAM
GetMonBackpic:
ld a, [wCurPartySpecies]
and a
ret z
cp NUM_POKEMON + 1
ret z
cp EGG + 1
ret nc
.is_a_pokemon
push de
ld a, BANK(sDecompressBuffer)
call OpenSRAM
; These are assumed to be at the same address in their respective banks.
ld hl, PokemonPicPointers ; UnownPicPointers
ld a, [wCurPartySpecies]
ld d, BANK(PokemonPicPointers)
cp UNOWN
jr nz, .ok
ld a, [wUnownLetter]
ld d, BANK(UnownPicPointers)
.ok
dec a
ld bc, 6
call AddNTimes
ld bc, 3
add hl, bc
ld a, d
call GetFarByte
call FixPicBank
push af
inc hl
ld a, d
call GetFarByte
push af
inc hl
ld a, d
call GetFarByte
ld h, a
pop af
ld l, a
ld de, sDecompressBuffer
pop af
call FarDecompress
ld hl, sDecompressBuffer
ld c, 6 * 6
call FixBackpicAlignment
pop hl
ld de, sDecompressBuffer
ldh a, [hROMBank]
ld b, a
call Get2bpp
call CloseSRAM
ret
FixPicBank:
; Precondition: a = defined bank for pic
; Postcondition: a = repaired bank for pic
;
; Pic bank values that will get repaired (and what they'll be repaired to):
; $13 -> BANK("Pics 12")
; $14 -> BANK("Pics 13")
; $1f -> BANK("Pics 14")
;
; Otherwise, the repaired bank will match the defined bank.
push hl
push bc
ld b, a
ld hl, .FixPicBankTable
.loop
ld a, [hli]
cp -1
jr z, .done
inc hl
cp b
jr nz, .loop
dec hl
ld b, [hl]
.done
ld a, b
pop bc
pop hl
ret
.FixPicBankTable:
db $13, BANK("Pics 12")
db $14, BANK("Pics 13")
db $1f, BANK("Pics 14")
db -1
Intro_GetMonFrontpic:
ld a, c
push de
ld hl, PokemonPicPointers
dec a
ld bc, 6
call AddNTimes
ld a, BANK(PokemonPicPointers)
call GetFarByte
call FixPicBank
push af
inc hl
ld a, BANK(PokemonPicPointers)
call GetFarHalfword
pop af
pop de
call FarDecompress
ret
GetTrainerPic:
ld a, [wTrainerClass]
and a
ret z
cp NUM_TRAINER_CLASSES
ret nc
ld a, 0
call WaitBGMap
xor a
ldh [hBGMapMode], a
ld a, BANK(sDecompressBuffer)
call OpenSRAM
push de
ld hl, TrainerPicPointers
ld a, [wTrainerClass]
dec a
ld bc, 3
call AddNTimes
ld a, BANK(TrainerPicPointers)
call GetFarByte
call FixPicBank
push af
inc hl
ld a, BANK(TrainerPicPointers)
call GetFarByte
push af
inc hl
ld a, BANK(TrainerPicPointers)
call GetFarByte
ld h, a
pop af
ld l, a
ld de, sDecompressBuffer
pop af
call FarDecompress
pop hl
ld de, sDecompressBuffer
ld c, 7 * 7
ldh a, [hROMBank]
ld b, a
call Get2bpp
call CloseSRAM
call WaitBGMap
ld a, 1
ldh [hBGMapMode], a
ret
DecompressGet2bpp:
; Decompress lz data from b:hl to sDecompressBuffer, then copy it to address de.
push de
push bc
ld a, BANK(sDecompressBuffer)
call OpenSRAM
ld a, b
ld de, sDecompressBuffer
call FarDecompress
pop bc
ld de, sDecompressBuffer
pop hl
ldh a, [hROMBank]
ld b, a
call Get2bpp
call CloseSRAM
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:
rept 4
srl c
endr
.fill_loop
rept 16
ld [hli], a
endr
dec c
jr nz, .fill_loop
ret
LoadOrientedFrontpic:
ld a, [wBoxAlignment]
and a
jr nz, .x_flip
rept 4
srl c
endr
.left_loop
rept 16
ld a, [de]
inc de
ld [hli], a
endr
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