pokecrystal-board/engine/gfx/color.asm
2024-03-09 16:40:21 +01:00

877 lines
13 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, [wPlayerCharacter]
ld e, PLAYERDATA_PIC_PAL
call GetPlayerField
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 * TILE_WIDTH
.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 * TILE_WIDTH
.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:
call LoadDarknessPaletteIfDark
jr c, .got_pals
; Which palette group is based on whether we're outside or inside
ld a, [wEnvironment]
maskbits NUM_ENVIRONMENTS
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
; BG pals done. Now do OBJ pals.
call GetMapTimeOfDay
bit IN_DARKNESS_F, a
jr z, .not_darkness
ld a, [wStatusFlags]
bit STATUSFLAGS_FLASH_F, a
jr nz, .not_darkness
ld a, BANK(wOBPals1)
ld de, wOBPals1
ld hl, MapObjectDarknessPals
ld bc, 7 palettes ; all but PAL_OW_MISC
call FarCopyWRAM
jp LoadOverworldMiscObjPal_ToObPals1 ; PAL_OW_MISC
.not_darkness
ld a, [wTimeOfDayPal]
maskbits NUM_DAYTIMES
ld bc, 8 palettes
ld hl, MapObjectPals
call AddNTimes
ld de, wOBPals1
ld bc, 7 palettes ; all but PAL_OW_MISC
ld a, BANK(wOBPals1)
call FarCopyWRAM
call LoadOverworldMiscObjPal_ToObPals1 ; PAL_OW_MISC
ld a, [wEnvironment]
cp INDOOR_ENVIRONMENT
jr c, .outside
ret nz
.outside
ld a, [wMapGroup]
add a
add a
ld e, a
ld d, 0
ld hl, RoofPals
rept NUM_DAYTIMES
add hl, de
endr
ld a, [wTimeOfDayPal]
maskbits NUM_DAYTIMES
add a
add a
ld e, a
ld d, 0
add hl, de
ld de, wBGPals1 palette PAL_BG_ROOF color 1
ld bc, 4
ld a, BANK(wBGPals1)
call FarCopyWRAM
ret
LoadDarknessPaletteIfDark:
call GetMapTimeOfDay
bit IN_DARKNESS_F, a
jr z, .do_nothing
ld a, [wStatusFlags]
bit STATUSFLAGS_FLASH_F, a
jr nz, .do_nothing
.darkness
call LoadDarknessPalette
scf
ret
.do_nothing
and a
ret
LoadDarknessPalette:
ld a, BANK(wBGPals1)
ld de, wBGPals1
ld hl, TilesetBGDarknessPalette
ld bc, 8 palettes
jp FarCopyWRAM
LoadOverworldMiscObjPal_ToObPals1:
call GetOverworldMiscObjPal
ld de, wOBPals1 palette PAL_OW_MISC
ld bc, PALETTE_SIZE
ld a, BANK(wOBPals1)
jp FarCopyWRAM
LoadOverworldMiscObjPal_ToObPals2:
call GetOverworldMiscObjPal
ld de, wOBPals2 palette PAL_OW_MISC
ld bc, PALETTE_SIZE
ld a, BANK(wOBPals1)
jp FarCopyWRAM
LoadOverworldMiscObjPal_ToObPals1And2:
call LoadOverworldMiscObjPal_ToObPals1
ld hl, wOBPals1 palette PAL_OW_MISC
ld de, wOBPals2 palette PAL_OW_MISC
ld bc, PALETTE_SIZE
ld a, BANK(wOBPals1)
jp FarCopyWRAM
GetOverworldMiscObjPal:
ld a, [wCurOverworldMiscPal]
and PAL_OW_MISC_PAL_GROUP_MASK
swap a
ld hl, .OverworldMiscPalGroups
ld bc, .pal_group_2 - .pal_group_1
call AddNTimes
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wCurOverworldMiscPal]
and ~PAL_OW_MISC_PAL_GROUP_MASK
ld bc, PALETTE_SIZE
call AddNTimes
ret
.OverworldMiscPalGroups:
table_width 2, .OverworldMiscPalGroups
.pal_group_1
dw BoardMenuItemsPals
.pal_group_2
dw BoardDicePals
dw BoardCoinsPals
assert_table_length NUM_PAL_OW_MISC_PAL_GROUPS
INCLUDE "data/maps/environment_colors.asm"
PartyMenuBGMobilePalette:
INCLUDE "gfx/stats/party_menu_bg_mobile.pal"
PartyMenuBGPalette:
INCLUDE "gfx/stats/party_menu_bg.pal"
TilesetBGDarknessPalette:
INCLUDE "gfx/tilesets/bg_tiles_darkness.pal"
TilesetBGPalette:
INCLUDE "gfx/tilesets/bg_tiles.pal"
MapObjectDarknessPals:
INCLUDE "gfx/overworld/npc_sprites_darkness.pal"
MapObjectPals::
INCLUDE "gfx/overworld/npc_sprites.pal"
BoardMenuItemsPals:
INCLUDE "gfx/board/menu.pal"
BoardDicePals:
INCLUDE "gfx/board/dice.pal"
BoardCoinsPals:
INCLUDE "gfx/board/coins.pal"
RoofPals:
table_width PAL_COLOR_SIZE * 4 * 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"
LevelSelectionMenuPals:
table_width PAL_COLOR_SIZE * 4 * 6, LevelSelectionMenuPals
INCLUDE "gfx/level_selection_menu/background.pal"
assert_table_length (NUM_DAYTIMES + NUM_DAYTIMES * 2)
LevelSelectionMenuStageTrophiesPals:
INCLUDE "gfx/level_selection_menu/stage_trophies.pal"
LevelSelectionMenuTimeOfDaySymbolsPals:
INCLUDE "gfx/level_selection_menu/time_of_day_symbols.pal"
INCLUDE "engine/gfx/rgb_fade.asm"