mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-11-16 11:27:33 -08:00
771 lines
10 KiB
NASM
771 lines
10 KiB
NASM
DEF SHINY_ATK_MASK EQU %0010
|
|
DEF SHINY_DEF_DV EQU 10
|
|
DEF SHINY_SPD_DV EQU 10
|
|
DEF SHINY_SPC_DV EQU 10
|
|
|
|
CheckShininess:
|
|
; Check if a mon is shiny by DVs at bc.
|
|
; Return carry if shiny.
|
|
|
|
ld l, c
|
|
ld h, b
|
|
|
|
; Attack
|
|
ld a, [hl]
|
|
and SHINY_ATK_MASK << 4
|
|
jr z, .not_shiny
|
|
|
|
; Defense
|
|
ld a, [hli]
|
|
and %1111
|
|
cp SHINY_DEF_DV
|
|
jr nz, .not_shiny
|
|
|
|
; Speed
|
|
ld a, [hl]
|
|
and %1111 << 4
|
|
cp SHINY_SPD_DV << 4
|
|
jr nz, .not_shiny
|
|
|
|
; Special
|
|
ld a, [hl]
|
|
and %1111
|
|
cp SHINY_SPC_DV
|
|
jr nz, .not_shiny
|
|
|
|
; shiny
|
|
scf
|
|
ret
|
|
|
|
.not_shiny
|
|
and a
|
|
ret
|
|
|
|
Unused_CheckShininess:
|
|
; Return carry if the DVs at hl are all 10 or higher.
|
|
|
|
; Attack
|
|
ld a, [hl]
|
|
cp 10 << 4
|
|
jr c, .not_shiny
|
|
|
|
; Defense
|
|
ld a, [hli]
|
|
and %1111
|
|
cp 10
|
|
jr c, .not_shiny
|
|
|
|
; Speed
|
|
ld a, [hl]
|
|
cp 10 << 4
|
|
jr c, .not_shiny
|
|
|
|
; Special
|
|
ld a, [hl]
|
|
and %1111
|
|
cp 10
|
|
jr c, .not_shiny
|
|
|
|
; shiny
|
|
scf
|
|
ret
|
|
|
|
.not_shiny
|
|
and a
|
|
ret
|
|
|
|
InitPartyMenuPalettes:
|
|
ld hl, FourPals_PartyMenu
|
|
call CopyFourPalettes
|
|
call InitPartyMenuOBPals
|
|
call WipeAttrmap
|
|
ret
|
|
|
|
LoadTrainerClassPaletteAsNthBGPal:
|
|
ld a, [wTrainerClass]
|
|
call GetTrainerPalettePointer
|
|
ld a, e
|
|
jr LoadNthMiddleBGPal
|
|
|
|
LoadMonPaletteAsNthBGPal:
|
|
ld a, [wCurPartySpecies]
|
|
call _GetMonPalettePointer
|
|
ld a, e
|
|
bit 7, a
|
|
jr z, LoadNthMiddleBGPal
|
|
and $7f
|
|
inc hl
|
|
inc hl
|
|
inc hl
|
|
inc hl
|
|
|
|
LoadNthMiddleBGPal:
|
|
push hl
|
|
ld hl, wBGPals1
|
|
ld de, 1 palettes
|
|
.loop
|
|
and a
|
|
jr z, .got_addr
|
|
add hl, de
|
|
dec a
|
|
jr .loop
|
|
|
|
.got_addr
|
|
ld e, l
|
|
ld d, h
|
|
pop hl
|
|
call LoadPalette_White_Col1_Col2_Black
|
|
ret
|
|
|
|
LoadBetaPokerPalettes: ; unreferenced
|
|
ld a, [wBetaPokerSGBCol]
|
|
ld c, a
|
|
ld a, [wBetaPokerSGBRow]
|
|
hlcoord 0, 0, wAttrmap
|
|
ld de, SCREEN_WIDTH
|
|
.loop
|
|
and a
|
|
jr z, .done
|
|
add hl, de
|
|
dec a
|
|
jr .loop
|
|
|
|
.done
|
|
ld b, 0
|
|
add hl, bc
|
|
lb bc, 6, 4
|
|
ld a, [wBetaPokerSGBAttr]
|
|
and $3
|
|
call FillBoxCGB
|
|
call CopyTilemapAtOnce
|
|
ret
|
|
|
|
ApplyMonOrTrainerPals:
|
|
ld a, e
|
|
and a
|
|
jr z, .get_trainer
|
|
ld a, [wCurPartySpecies]
|
|
call GetMonPalettePointer
|
|
jr .load_palettes
|
|
|
|
.get_trainer
|
|
ld a, [wTrainerClass]
|
|
call GetTrainerPalettePointer
|
|
|
|
.load_palettes
|
|
ld de, wBGPals1
|
|
call LoadPalette_White_Col1_Col2_Black
|
|
call WipeAttrmap
|
|
call ApplyAttrmap
|
|
call ApplyPals
|
|
ret
|
|
|
|
ApplyHPBarPals:
|
|
ld a, [wWhichHPBar]
|
|
and a
|
|
jr z, .Enemy
|
|
cp $1
|
|
jr z, .Player
|
|
cp $2
|
|
jr z, .PartyMenu
|
|
ret
|
|
|
|
.Enemy:
|
|
ld de, wBGPals2 palette PAL_BATTLE_BG_ENEMY_HP color 1
|
|
jr .okay
|
|
|
|
.Player:
|
|
ld de, wBGPals2 palette PAL_BATTLE_BG_PLAYER_HP color 1
|
|
|
|
.okay
|
|
ld l, c
|
|
ld h, $0
|
|
add hl, hl
|
|
add hl, hl
|
|
ld bc, HPBarPals
|
|
add hl, bc
|
|
ld bc, 4
|
|
ld a, BANK(wBGPals2)
|
|
call FarCopyWRAM
|
|
ld a, TRUE
|
|
ldh [hCGBPalUpdate], a
|
|
ret
|
|
|
|
.PartyMenu:
|
|
ld e, c
|
|
inc e
|
|
hlcoord 11, 1, wAttrmap
|
|
ld bc, 2 * SCREEN_WIDTH
|
|
ld a, [wCurPartyMon]
|
|
.loop
|
|
and a
|
|
jr z, .done
|
|
add hl, bc
|
|
dec a
|
|
jr .loop
|
|
|
|
.done
|
|
lb bc, 2, 8
|
|
ld a, e
|
|
call FillBoxCGB
|
|
ret
|
|
|
|
LoadStatsScreenPals:
|
|
ld hl, StatsScreenPals
|
|
ld b, 0
|
|
dec c
|
|
add hl, bc
|
|
add hl, bc
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
ld a, [hli]
|
|
ld [wBGPals1 palette 0], a
|
|
ld [wBGPals1 palette 2], a
|
|
ld a, [hl]
|
|
ld [wBGPals1 palette 0 + 1], a
|
|
ld [wBGPals1 palette 2 + 1], a
|
|
pop af
|
|
ldh [rSVBK], a
|
|
call ApplyPals
|
|
ld a, $1
|
|
ret
|
|
|
|
LoadMailPalettes:
|
|
ld l, e
|
|
ld h, 0
|
|
add hl, hl
|
|
add hl, hl
|
|
add hl, hl
|
|
ld de, .MailPals
|
|
add hl, de
|
|
ld de, wBGPals1
|
|
ld bc, 1 palettes
|
|
ld a, BANK(wBGPals1)
|
|
call FarCopyWRAM
|
|
call ApplyPals
|
|
call WipeAttrmap
|
|
call ApplyAttrmap
|
|
ret
|
|
|
|
.MailPals:
|
|
INCLUDE "gfx/mail/mail.pal"
|
|
|
|
INCLUDE "engine/gfx/cgb_layouts.asm"
|
|
|
|
CopyFourPalettes:
|
|
ld de, wBGPals1
|
|
ld c, 4
|
|
|
|
CopyPalettes:
|
|
.loop
|
|
push bc
|
|
ld a, [hli]
|
|
push hl
|
|
call GetPredefPal
|
|
call LoadHLPaletteIntoDE
|
|
pop hl
|
|
inc hl
|
|
pop bc
|
|
dec c
|
|
jr nz, .loop
|
|
ret
|
|
|
|
GetPredefPal:
|
|
ld l, a
|
|
ld h, 0
|
|
add hl, hl
|
|
add hl, hl
|
|
add hl, hl
|
|
ld bc, PredefPals
|
|
add hl, bc
|
|
ret
|
|
|
|
PredefPals:
|
|
table_width PALETTE_SIZE, PredefPals
|
|
INCLUDE "gfx/predef/predef.pal"
|
|
assert_table_length NUM_PREDEF_PALS
|
|
|
|
INCLUDE "gfx/predef/four_pals.asm"
|
|
|
|
LoadHLPaletteIntoDE:
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wOBPals1)
|
|
ldh [rSVBK], a
|
|
ld c, 1 palettes
|
|
.loop
|
|
ld a, [hli]
|
|
ld [de], a
|
|
inc de
|
|
dec c
|
|
jr nz, .loop
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ret
|
|
|
|
LoadPalette_White_Col1_Col2_Black:
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
|
|
ld a, LOW(PALRGB_WHITE)
|
|
ld [de], a
|
|
inc de
|
|
ld a, HIGH(PALRGB_WHITE)
|
|
ld [de], a
|
|
inc de
|
|
|
|
ld c, 2 * PAL_COLOR_SIZE
|
|
.loop
|
|
ld a, [hli]
|
|
ld [de], a
|
|
inc de
|
|
dec c
|
|
jr nz, .loop
|
|
|
|
xor a
|
|
ld [de], a
|
|
inc de
|
|
ld [de], a
|
|
inc de
|
|
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ret
|
|
|
|
FillBoxCGB:
|
|
.row
|
|
push bc
|
|
push hl
|
|
.col
|
|
ld [hli], a
|
|
dec c
|
|
jr nz, .col
|
|
pop hl
|
|
ld bc, SCREEN_WIDTH
|
|
add hl, bc
|
|
pop bc
|
|
dec b
|
|
jr nz, .row
|
|
ret
|
|
|
|
ResetBGPals:
|
|
push af
|
|
push bc
|
|
push de
|
|
push hl
|
|
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
|
|
ld hl, wBGPals1
|
|
ld c, 1 palettes
|
|
.loop
|
|
ld a, $ff
|
|
ld [hli], a
|
|
ld [hli], a
|
|
ld [hli], a
|
|
ld [hli], a
|
|
xor a
|
|
ld [hli], a
|
|
ld [hli], a
|
|
ld [hli], a
|
|
ld [hli], a
|
|
dec c
|
|
jr nz, .loop
|
|
|
|
pop af
|
|
ldh [rSVBK], a
|
|
|
|
pop hl
|
|
pop de
|
|
pop bc
|
|
pop af
|
|
ret
|
|
|
|
WipeAttrmap:
|
|
hlcoord 0, 0, wAttrmap
|
|
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
|
|
xor a
|
|
call ByteFill
|
|
ret
|
|
|
|
ApplyPals:
|
|
ld hl, wBGPals1
|
|
ld de, wBGPals2
|
|
ld bc, 16 palettes
|
|
ld a, BANK(wGBCPalettes)
|
|
call FarCopyWRAM
|
|
ret
|
|
|
|
ApplyAttrmap:
|
|
ldh a, [rLCDC]
|
|
bit rLCDC_ENABLE, a
|
|
jr z, .UpdateVBank1
|
|
ldh a, [hBGMapMode]
|
|
push af
|
|
ld a, $2
|
|
ldh [hBGMapMode], a
|
|
call DelayFrame
|
|
call DelayFrame
|
|
call DelayFrame
|
|
call DelayFrame
|
|
pop af
|
|
ldh [hBGMapMode], a
|
|
ret
|
|
|
|
.UpdateVBank1:
|
|
hlcoord 0, 0, wAttrmap
|
|
debgcoord 0, 0
|
|
ld b, SCREEN_HEIGHT
|
|
ld a, $1
|
|
ldh [rVBK], a
|
|
.row
|
|
ld c, SCREEN_WIDTH
|
|
.col
|
|
ld a, [hli]
|
|
ld [de], a
|
|
inc de
|
|
dec c
|
|
jr nz, .col
|
|
ld a, BG_MAP_WIDTH - SCREEN_WIDTH
|
|
add e
|
|
jr nc, .okay
|
|
inc d
|
|
.okay
|
|
ld e, a
|
|
dec b
|
|
jr nz, .row
|
|
ld a, $0
|
|
ldh [rVBK], a
|
|
ret
|
|
|
|
; CGB layout for CGB_PARTY_MENU_HP_BARS
|
|
CGB_ApplyPartyMenuHPPals:
|
|
ld hl, wHPPals
|
|
ld a, [wWhichPartyMonHPPal]
|
|
ld e, a
|
|
ld d, 0
|
|
add hl, de
|
|
ld e, l
|
|
ld d, h
|
|
ld a, [de]
|
|
inc a
|
|
ld e, a
|
|
hlcoord 11, 2, wAttrmap
|
|
ld bc, 2 * SCREEN_WIDTH
|
|
ld a, [wWhichPartyMonHPPal]
|
|
.loop
|
|
and a
|
|
jr z, .done
|
|
add hl, bc
|
|
dec a
|
|
jr .loop
|
|
.done
|
|
lb bc, 2, 8
|
|
ld a, e
|
|
call FillBoxCGB
|
|
ret
|
|
|
|
InitPartyMenuOBPals:
|
|
ld hl, PartyMenuOBPals
|
|
ld de, wOBPals1
|
|
ld bc, 2 palettes
|
|
ld a, BANK(wOBPals1)
|
|
call FarCopyWRAM
|
|
ret
|
|
|
|
GetBattlemonBackpicPalettePointer:
|
|
push de
|
|
farcall GetPartyMonDVs
|
|
ld c, l
|
|
ld b, h
|
|
ld a, [wTempBattleMonSpecies]
|
|
call GetPlayerOrMonPalettePointer
|
|
pop de
|
|
ret
|
|
|
|
GetEnemyFrontpicPalettePointer:
|
|
push de
|
|
farcall GetEnemyMonDVs
|
|
ld c, l
|
|
ld b, h
|
|
ld a, [wTempEnemyMonSpecies]
|
|
call GetFrontpicPalettePointer
|
|
pop de
|
|
ret
|
|
|
|
GetPlayerOrMonPalettePointer:
|
|
and a
|
|
jp nz, GetMonNormalOrShinyPalettePointer
|
|
ld a, [wPlayerSpriteSetupFlags]
|
|
bit PLAYERSPRITESETUP_FEMALE_TO_MALE_F, a
|
|
jr nz, .male
|
|
ld a, [wPlayerGender]
|
|
and a
|
|
jr z, .male
|
|
ld hl, KrisPalette
|
|
ret
|
|
|
|
.male
|
|
ld hl, PlayerPalette
|
|
ret
|
|
|
|
GetFrontpicPalettePointer:
|
|
and a
|
|
jp nz, GetMonNormalOrShinyPalettePointer
|
|
ld a, [wTrainerClass]
|
|
|
|
GetTrainerPalettePointer:
|
|
ld l, a
|
|
ld h, 0
|
|
add hl, hl
|
|
add hl, hl
|
|
ld bc, TrainerPalettes
|
|
add hl, bc
|
|
ret
|
|
|
|
GetMonPalettePointer:
|
|
call _GetMonPalettePointer
|
|
ret
|
|
|
|
BattleObjectPals:
|
|
INCLUDE "gfx/battle_anims/battle_anims.pal"
|
|
|
|
_GetMonPalettePointer:
|
|
ld l, a
|
|
ld h, 0
|
|
add hl, hl
|
|
add hl, hl
|
|
add hl, hl
|
|
ld bc, PokemonPalettes
|
|
add hl, bc
|
|
ret
|
|
|
|
GetMonNormalOrShinyPalettePointer:
|
|
push bc
|
|
call _GetMonPalettePointer
|
|
pop bc
|
|
push hl
|
|
call CheckShininess
|
|
pop hl
|
|
ret nc
|
|
rept 4
|
|
inc hl
|
|
endr
|
|
ret
|
|
|
|
InitCGBPals::
|
|
ldh a, [hCGB]
|
|
and a
|
|
ret z
|
|
|
|
; CGB only
|
|
ld a, BANK(vTiles3)
|
|
ldh [rVBK], a
|
|
ld hl, vTiles3
|
|
ld bc, $200 tiles
|
|
xor a
|
|
call ByteFill
|
|
ld a, BANK(vTiles0)
|
|
ldh [rVBK], a
|
|
ld a, 1 << rBGPI_AUTO_INCREMENT
|
|
ldh [rBGPI], a
|
|
ld c, 4 * 8
|
|
.bgpals_loop
|
|
ld a, LOW(PALRGB_WHITE)
|
|
ldh [rBGPD], a
|
|
ld a, HIGH(PALRGB_WHITE)
|
|
ldh [rBGPD], a
|
|
dec c
|
|
jr nz, .bgpals_loop
|
|
ld a, 1 << rOBPI_AUTO_INCREMENT
|
|
ldh [rOBPI], a
|
|
ld c, 4 * 8
|
|
.obpals_loop
|
|
ld a, LOW(PALRGB_WHITE)
|
|
ldh [rOBPD], a
|
|
ld a, HIGH(PALRGB_WHITE)
|
|
ldh [rOBPD], a
|
|
dec c
|
|
jr nz, .obpals_loop
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
ld hl, wBGPals1
|
|
call .LoadWhitePals
|
|
ld hl, wBGPals2
|
|
call .LoadWhitePals
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ret
|
|
|
|
.LoadWhitePals:
|
|
ld c, 4 * 16
|
|
.loop
|
|
ld a, LOW(PALRGB_WHITE)
|
|
ld [hli], a
|
|
ld a, HIGH(PALRGB_WHITE)
|
|
ld [hli], a
|
|
dec c
|
|
jr nz, .loop
|
|
ret
|
|
|
|
HPBarPals:
|
|
INCLUDE "gfx/battle/hp_bar.pal"
|
|
|
|
ExpBarPalette:
|
|
INCLUDE "gfx/battle/exp_bar.pal"
|
|
|
|
INCLUDE "data/pokemon/palettes.asm"
|
|
|
|
INCLUDE "data/trainers/palettes.asm"
|
|
|
|
LoadMapPals:
|
|
farcall LoadSpecialMapPalette
|
|
jr c, .got_pals
|
|
|
|
; Which palette group is based on whether we're outside or inside
|
|
ld a, [wEnvironment]
|
|
and 7
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, EnvironmentColorsPointers
|
|
add hl, de
|
|
add hl, de
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
; Futher refine by time of day
|
|
ld a, [wTimeOfDayPal]
|
|
maskbits NUM_DAYTIMES
|
|
add a
|
|
add a
|
|
add a
|
|
ld e, a
|
|
ld d, 0
|
|
add hl, de
|
|
ld e, l
|
|
ld d, h
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
ld hl, wBGPals1
|
|
ld b, 8
|
|
.outer_loop
|
|
ld a, [de] ; lookup index for TilesetBGPalette
|
|
push de
|
|
push hl
|
|
ld l, a
|
|
ld h, 0
|
|
add hl, hl
|
|
add hl, hl
|
|
add hl, hl
|
|
ld de, TilesetBGPalette
|
|
add hl, de
|
|
ld e, l
|
|
ld d, h
|
|
pop hl
|
|
ld c, 1 palettes
|
|
.inner_loop
|
|
ld a, [de]
|
|
inc de
|
|
ld [hli], a
|
|
dec c
|
|
jr nz, .inner_loop
|
|
pop de
|
|
inc de
|
|
dec b
|
|
jr nz, .outer_loop
|
|
pop af
|
|
ldh [rSVBK], a
|
|
|
|
.got_pals
|
|
ld a, [wTimeOfDayPal]
|
|
maskbits NUM_DAYTIMES
|
|
ld bc, 8 palettes
|
|
ld hl, MapObjectPals
|
|
call AddNTimes
|
|
ld de, wOBPals1
|
|
ld bc, 8 palettes
|
|
ld a, BANK(wOBPals1)
|
|
call FarCopyWRAM
|
|
|
|
ld a, [wEnvironment]
|
|
cp TOWN
|
|
jr z, .outside
|
|
cp ROUTE
|
|
ret nz
|
|
.outside
|
|
ld a, [wMapGroup]
|
|
ld l, a
|
|
ld h, 0
|
|
add hl, hl
|
|
add hl, hl
|
|
add hl, hl
|
|
ld de, RoofPals
|
|
add hl, de
|
|
ld a, [wTimeOfDayPal]
|
|
maskbits NUM_DAYTIMES
|
|
cp NITE_F
|
|
jr c, .morn_day
|
|
rept 4
|
|
inc hl
|
|
endr
|
|
.morn_day
|
|
ld de, wBGPals1 palette PAL_BG_ROOF color 1
|
|
ld bc, 4
|
|
ld a, BANK(wBGPals1)
|
|
call FarCopyWRAM
|
|
ret
|
|
|
|
INCLUDE "data/maps/environment_colors.asm"
|
|
|
|
PartyMenuBGMobilePalette:
|
|
INCLUDE "gfx/stats/party_menu_bg_mobile.pal"
|
|
|
|
PartyMenuBGPalette:
|
|
INCLUDE "gfx/stats/party_menu_bg.pal"
|
|
|
|
TilesetBGPalette:
|
|
INCLUDE "gfx/tilesets/bg_tiles.pal"
|
|
|
|
MapObjectPals::
|
|
INCLUDE "gfx/overworld/npc_sprites.pal"
|
|
|
|
RoofPals:
|
|
table_width PAL_COLOR_SIZE * 2 * 2, RoofPals
|
|
INCLUDE "gfx/tilesets/roofs.pal"
|
|
assert_table_length NUM_MAP_GROUPS + 1
|
|
|
|
DiplomaPalettes:
|
|
INCLUDE "gfx/diploma/diploma.pal"
|
|
|
|
PartyMenuOBPals:
|
|
INCLUDE "gfx/stats/party_menu_ob.pal"
|
|
|
|
UnusedGSTitleBGPals:
|
|
INCLUDE "gfx/title/unused_gs_bg.pal"
|
|
|
|
UnusedGSTitleOBPals:
|
|
INCLUDE "gfx/title/unused_gs_fg.pal"
|
|
|
|
MalePokegearPals:
|
|
INCLUDE "gfx/pokegear/pokegear.pal"
|
|
|
|
FemalePokegearPals:
|
|
INCLUDE "gfx/pokegear/pokegear_f.pal"
|
|
|
|
BetaPokerPals:
|
|
INCLUDE "gfx/beta_poker/beta_poker.pal"
|
|
|
|
SlotMachinePals:
|
|
INCLUDE "gfx/slots/slots.pal"
|