mirror of
https://github.com/thornAvery/jep-hack.git
synced 2025-09-17 02:30:50 +12:00

Taken from https://github.com/pret/pokecrystal/wiki/Add-a-new-Unown-form There's some embedded palette errors that need fixing.
476 lines
6.8 KiB
NASM
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
|