diff options
Diffstat (limited to 'engine/load_pics.asm')
-rwxr-xr-x | engine/load_pics.asm | 494 |
1 files changed, 494 insertions, 0 deletions
diff --git a/engine/load_pics.asm b/engine/load_pics.asm new file mode 100755 index 000000000..5d3becf42 --- /dev/null +++ b/engine/load_pics.asm @@ -0,0 +1,494 @@ +GetUnownLetter: ; 51040 +; Return Unown letter in UnownLetter 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 + ld [hDividend + 3], a + xor a + ld [hDividend], a + ld [hDividend + 1], a + ld [hDividend + 2], a + ld a, $ff / NUM_UNOWN + 1 + ld [hDivisor], a + ld b, 4 + call Divide + +; Increment to get 1-26 + ld a, [hQuotient + 2] + inc a + ld [UnownLetter], a + ret + +GetMonFrontpic: ; 51077 + ld a, [CurPartySpecies] + ld [CurSpecies], a + call IsAPokemon + ret c + ld a, [rSVBK] + push af + call _GetFrontpic + pop af + ld [rSVBK], a + ret + +GetAnimatedFrontpic: ; 5108b + ld a, [CurPartySpecies] + ld [CurSpecies], a + call IsAPokemon + ret c + ld a, [rSVBK] + push af + xor a + ld [hBGMapMode], a + call _GetFrontpic + call GetAnimatedEnemyFrontpic + pop af + ld [rSVBK], a + ret + +_GetFrontpic: ; 510a5 + push de + call GetBaseData + ld a, [BasePicSize] + and $f + ld b, a + push bc + call GetFrontpicPointer + ld a, BANK(wDecompressEnemyFrontpic) + ld [rSVBK], a + ld a, b + ld de, wDecompressEnemyFrontpic + call FarDecompress + pop bc + ld hl, wDecompressScratch + ld de, wDecompressEnemyFrontpic + call PadFrontpic + pop hl + push hl + ld de, wDecompressScratch + ld c, 7 * 7 + ld a, [hROMBank] + ld b, a + call Get2bpp + pop hl + ret + +GetFrontpicPointer: ; 510d7 +GLOBAL PokemonPicPointers, UnownPicPointers + + ld a, [CurPartySpecies] + cp UNOWN + jr z, .unown + ld a, [CurPartySpecies] + ld d, BANK(PokemonPicPointers) + jr .ok + +.unown + ld a, [UnownLetter] + ld d, BANK(UnownPicPointers) + +.ok + ld hl, PokemonPicPointers ; UnownPicPointers + dec a + ld bc, 6 + call AddNTimes + ld a, d + call GetFarByte + call FixPicBank + push af + inc hl + ld a, d + call GetFarHalfword + pop bc + ret + +GetAnimatedEnemyFrontpic: ; 51103 + ld a, BANK(vTiles3) + ld [rVBK], a + push hl + ld de, wDecompressScratch + ld c, 7 * 7 + ld a, [hROMBank] + ld b, a + call Get2bpp + pop hl + ld de, 7 * 7 tiles + add hl, de + push hl + ld a, BANK(BasePicSize) + ld hl, BasePicSize + call GetFarWRAMByte + pop hl + and $f + ld de, wDecompressEnemyFrontpic + 5 * 5 tiles + ld c, 5 * 5 + cp 5 + jr z, .got_dims + ld de, wDecompressEnemyFrontpic + 6 * 6 tiles + ld c, 6 * 6 + cp 6 + jr z, .got_dims + ld de, wDecompressEnemyFrontpic + 7 * 7 tiles + ld c, 7 * 7 +.got_dims + + push hl + push bc + call LoadFrontpicTiles + pop bc + pop hl + ld de, wDecompressScratch + ld a, [hROMBank] + ld b, a + call Get2bpp + xor a + ld [rVBK], a + ret + +LoadFrontpicTiles: ; 5114f + 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 +.loop + push bc + ld c, 0 + call LoadOrientedFrontpic + pop bc + dec b + jr nz, .loop + ret + +GetMonBackpic: ; 5116c + ld a, [CurPartySpecies] + call IsAPokemon + ret c + + ld a, [CurPartySpecies] + ld b, a + ld a, [UnownLetter] + ld c, a + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + push de + + ; These are assumed to be at the same address in their respective banks. + GLOBAL PokemonPicPointers, UnownPicPointers + ld hl, PokemonPicPointers ; UnownPicPointers + ld a, b + ld d, BANK(PokemonPicPointers) + cp UNOWN + jr nz, .ok + ld a, c + 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 GetFarHalfword + ld de, wDecompressScratch + pop af + call FarDecompress + ld hl, wDecompressScratch + ld c, 6 * 6 + call FixBackpicAlignment + pop hl + ld de, wDecompressScratch + ld a, [hROMBank] + ld b, a + call Get2bpp + pop af + ld [rSVBK], a + ret + +FixPicBank: ; 511c5 +; This is a thing for some reason. + +PICS_FIX EQU $36 +GLOBAL PICS_FIX + + push hl + push bc + sub BANK(Pics_1) - PICS_FIX + ld c, a + ld b, 0 + ld hl, .PicsBanks + add hl, bc + ld a, [hl] + pop bc + pop hl + ret + +.PicsBanks: ; 511d4 + db BANK(Pics_1) + 0 + db BANK(Pics_1) + 1 + db BANK(Pics_1) + 2 + db BANK(Pics_1) + 3 + db BANK(Pics_1) + 4 + db BANK(Pics_1) + 5 + db BANK(Pics_1) + 6 + db BANK(Pics_1) + 7 + db BANK(Pics_1) + 8 + db BANK(Pics_1) + 9 + db BANK(Pics_1) + 10 + db BANK(Pics_1) + 11 + db BANK(Pics_1) + 12 + db BANK(Pics_1) + 13 + db BANK(Pics_1) + 14 + db BANK(Pics_1) + 15 + db BANK(Pics_1) + 16 + db BANK(Pics_1) + 17 + db BANK(Pics_1) + 18 + db BANK(Pics_1) + 19 + db BANK(Pics_1) + 20 + db BANK(Pics_1) + 21 + db BANK(Pics_1) + 22 + db BANK(Pics_1) + 23 + +Function511ec: ; 511ec + 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: ; 5120d + ld a, [TrainerClass] + and a + ret z + cp NUM_TRAINER_CLASSES + ret nc + call WaitBGMap + xor a + ld [hBGMapMode], a + ld hl, TrainerPicPointers + ld a, [TrainerClass] + dec a + ld bc, 3 + call AddNTimes + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + push de + ld a, BANK(TrainerPicPointers) + call GetFarByte + call FixPicBank + push af + inc hl + ld a, BANK(TrainerPicPointers) + call GetFarHalfword + pop af + ld de, wDecompressScratch + call FarDecompress + pop hl + ld de, wDecompressScratch + ld c, 7 * 7 + ld a, [hROMBank] + ld b, a + call Get2bpp + pop af + ld [rSVBK], a + call WaitBGMap + ld a, $1 + ld [hBGMapMode], a + ret + +DecompressGet2bpp: ; 5125d +; Decompress lz data from b:hl to scratch space at 6:d000, then copy it to address de. + + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + push de + push bc + ld a, b + ld de, wDecompressScratch + call FarDecompress + pop bc + ld de, wDecompressScratch + pop hl + ld a, [hROMBank] + ld b, a + call Get2bpp + + pop af + ld [rSVBK], a + ret + +FixBackpicAlignment: ; 5127c + 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: ; 512ab +; pads frontpic to fill 7x7 box + ld a, b + cp 6 + jr z, .six + cp 5 + jr z, .five + +.seven_loop + ld c, $70 + call LoadOrientedFrontpic + dec b + jr nz, .seven_loop + ret + +.six + ld c, $70 + xor a + call .Fill +.six_loop + ld c, $10 + xor a + call .Fill + ld c, $60 + call LoadOrientedFrontpic + dec b + jr nz, .six_loop + ret + +.five + ld c, $70 + xor a + call .Fill +.five_loop + ld c, $20 + xor a + call .Fill + ld c, $50 + call LoadOrientedFrontpic + dec b + jr nz, .five_loop + ld c, $70 + xor a + call .Fill + ret + +.Fill: + ld [hli], a + dec c + jr nz, .Fill + ret + +LoadOrientedFrontpic: ; 512f2 + 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 |