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, [wPlayerGender] 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" LevelSelectionMenuMalePals: table_width PAL_COLOR_SIZE * 4 * 6, LevelSelectionMenuMalePals INCLUDE "gfx/level_selection_menu/background_male.pal" assert_table_length (NUM_DAYTIMES + NUM_DAYTIMES * 2) LevelSelectionMenuFemalePals: table_width PAL_COLOR_SIZE * 4 * 6, LevelSelectionMenuFemalePals INCLUDE "gfx/level_selection_menu/background_female.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"