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
