summaryrefslogtreecommitdiff
path: root/engine/gfx/load_pics.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/gfx/load_pics.asm')
-rw-r--r--engine/gfx/load_pics.asm432
1 files changed, 432 insertions, 0 deletions
diff --git a/engine/gfx/load_pics.asm b/engine/gfx/load_pics.asm
new file mode 100644
index 00000000..18f76ec0
--- /dev/null
+++ b/engine/gfx/load_pics.asm
@@ -0,0 +1,432 @@
+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 + 2]
+ 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
+ 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
+ ld hl, PokemonPicPointers
+ 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 -> $1f
+; $14 -> $20
+; $1f -> $2e
+;
+; 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, $1f
+ db $14, $20
+ db $1f, $2e
+ db -1
+
+Function150ff:
+ ld a, c
+ push de
+ ld hl, PokemonPicPointers ; UnownPicPointers
+ 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:
+ 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
+.loop:
+rept 16
+ ld [hli], a
+endr
+ dec c
+ jr nz, .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