jep-hack/engine/gfx/color.asm
Llinos Evans 093bda0253 Strong Arm, Water Sport, and more HMs.
This adds Rock Climb functionality to Strong Arm and Dive functionality to Water Sport, as discussed in the server. HMs have been added, but we need 16bit Items to add Wind Ride, and I haven't finished their functionality.

The Rock Climb tile is a bit terrible, it's not easy to notice. Maybe change so that it works well with yellow or another colour?

This does not build due to issues with effect_commands.asm, but since Zeta is meant to be working on the mapping and Water Sport anyway, it seems to be up his alley.

I ported over much of the underwater assets Rangi was using as they looked very pretty. I imagine it'll be fun to utilise going forward. May as well, right?

I shall now lay down in a dark room.

Review: c21561ea71 (diff-5508f3b794fc68821ba35e94b6a293b2aaaa16c02a1b34fac70d03fd2f74c4b2R113)
2024-12-28 06:26:01 +00:00

1350 lines
19 KiB
NASM

INCLUDE "engine/gfx/sgb_layouts.asm"
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
;SGB_ApplyCreditsPals: ; unreferenced
; push de
; push bc
; ld hl, PalPacket_Pal01
; ld de, wSGBPals
; ld bc, PALPACKET_LENGTH
; call CopyBytes
; pop bc
; pop de
; ld a, c
; ld [wSGBPals + 3], a
; ld a, b
; ld [wSGBPals + 4], a
; ld a, e
; ld [wSGBPals + 5], a
; ld a, d
; ld [wSGBPals + 6], a
; ld hl, wSGBPals
; call PushSGBPals
; ld hl, BlkPacket_AllPal0
; call PushSGBPals
; ret
InitPartyMenuPalettes:
ld hl, PalPacket_PartyMenu + 1
call CopyFourPalettes
call InitPartyMenuOBPals
call WipeAttrmap
ret
; SGB layout for SCGB_PARTY_MENU_HP_BARS
SGB_ApplyPartyMenuHPPals:
ld hl, wHPPals
ld a, [wSGBPals]
ld e, a
ld d, 0
add hl, de
ld e, l
ld d, h
ld a, [de]
and a
ld e, $5
jr z, .okay
dec a
ld e, $a
jr z, .okay
ld e, $f
.okay
push de
ld hl, wSGBPals + 10
ld bc, $6
ld a, [wSGBPals]
call AddNTimes
pop de
ld [hl], e
ret
;Intro_LoadMagikarpPalettes: ; unreferenced
; call CheckCGB
; ret z
;
;; CGB only
; ld hl, .MagikarpBGPal
; ld de, wBGPals1
; ld bc, 1 palettes
; ld a, BANK(wBGPals1)
; call FarCopyWRAM
;
; ld hl, .MagikarpOBPal
; ld de, wOBPals1
; ld bc, 1 palettes
; ld a, BANK(wOBPals1)
; call FarCopyWRAM
;
; call ApplyPals
; ld a, TRUE
; ldh [hCGBPalUpdate], a
; ret
;
;.MagikarpBGPal:
;INCLUDE "gfx/intro/gs_magikarp_bg.pal"
;
;.MagikarpOBPal:
;INCLUDE "gfx/intro/gs_magikarp_ob.pal"
;Intro_LoadAllPal0: ; unreferenced
; call CheckCGB
; ret nz
; ldh a, [hSGB]
; and a
; ret z
; ld hl, BlkPacket_AllPal0
; jp PushSGBPals
;
;Intro_LoadBetaIntroVenusaurPalettes: ; unreferenced
; call CheckCGB
; jr nz, .cgb
; ldh a, [hSGB]
; and a
; ret z
; ld hl, PalPacket_BetaIntroVenusaur
; jp PushSGBPals
;
;.cgb
; ld de, wOBPals1
; ld a, PREDEFPAL_BETA_INTRO_VENUSAUR
; call GetPredefPal
; jp LoadHLPaletteIntoDE
;
;Intro_LoadPackPalettes: ; unreferenced
; call CheckCGB
; jr nz, .cgb
; ldh a, [hSGB]
; and a
; ret z
; ld hl, PalPacket_Pack
; jp PushSGBPals
;
;.cgb
; ld de, wOBPals1
; ld a, PREDEFPAL_PACK
; call GetPredefPal
; jp LoadHLPaletteIntoDE
;
;GSIntro_LoadMonPalette: ; unreferenced
; call CheckCGB
; jr nz, .cgb
; ldh a, [hSGB]
; and a
; ret z
; ld a, c
; push af
; ld hl, PalPacket_Pal01
; ld de, wSGBPals
; ld bc, PALPACKET_LENGTH
; call CopyBytes
; pop af
; call GetMonPalettePointer
; ld a, [hli]
; ld [wSGBPals + 3], a
; ld a, [hli]
; ld [wSGBPals + 4], a
; ld a, [hli]
; ld [wSGBPals + 5], a
; ld a, [hl]
; ld [wSGBPals + 6], a
; ld hl, wSGBPals
; jp PushSGBPals
;
;.cgb
; ld de, wOBPals1
; ld a, c
; call GetMonPalettePointer
; call LoadPalette_White_Col1_Col2_Black
; 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
ldh a, [hCGB]
and a
jr nz, .cgb
ld hl, wBetaPokerSGBPals
jp PushSGBPals
.cgb
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:
call CheckCGB
ret z
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:
call CheckCGB
ret z
ld hl, StatsScreenPals
ld b, 0
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
call CheckCGB
jr nz, .cgb
push hl
ld hl, PalPacket_Pal01
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
pop hl
inc hl
inc hl
ld a, [hli]
ld [wSGBPals + 3], a
ld a, [hli]
ld [wSGBPals + 4], a
ld a, [hli]
ld [wSGBPals + 5], a
ld a, [hli]
ld [wSGBPals + 6], a
ld hl, wSGBPals
call PushSGBPals
ld hl, BlkPacket_AllPal0
call PushSGBPals
ret
.cgb
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
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 SCGB_PARTY_MENU_HP_BARS
CGB_ApplyPartyMenuHPPals:
ld hl, wHPPals
ld a, [wSGBPals]
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, [wSGBPals]
.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
dec a
jr z, .female
ld hl, EnbyPalette
ret
.female
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
;CGBCopyBattleObjectPals: ; unreferenced
;; dummied out
; ret
; call CheckCGB
; ret z
; ld hl, BattleObjectPals
; ld a, (1 << rOBPI_AUTO_INCREMENT) | $10
; ldh [rOBPI], a
; ld c, 6 palettes
;.loop
; ld a, [hli]
; ldh [rOBPD], a
; dec c
; jr nz, .loop
; ld hl, BattleObjectPals
; ld de, wOBPals1 palette 2
; ld bc, 2 palettes
; ld a, BANK(wOBPals1)
; call FarCopyWRAM
; ret
BattleObjectPals:
INCLUDE "gfx/battle_anims/battle_anims.pal"
;CGBCopyTwoPredefObjectPals: ; unreferenced
; call CheckCGB
; ret z
; ld a, (1 << rOBPI_AUTO_INCREMENT) | $10
; ldh [rOBPI], a
; ld a, PREDEFPAL_TRADE_TUBE
; call GetPredefPal
; call .PushPalette
; ld a, PREDEFPAL_RB_GREENMON
; call GetPredefPal
; call .PushPalette
; ret
;
;.PushPalette:
; ld c, 1 palettes
;.loop
; ld a, [hli]
; ldh [rOBPD], a
; dec c
; jr nz, .loop
; ret
_GetMonPalettePointer:
call GetPokemonIndexFromID
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
PushSGBPals:
ld a, [wJoypadDisable]
push af
set JOYPAD_DISABLE_SGB_TRANSFER_F, a
ld [wJoypadDisable], a
call _PushSGBPals
pop af
ld [wJoypadDisable], a
ret
_PushSGBPals:
ld a, [hl]
and $7
ret z
ld b, a
.loop
push bc
xor a
ldh [rJOYP], a
ld a, $30
ldh [rJOYP], a
ld b, $10
.loop2
ld e, $8
ld a, [hli]
ld d, a
.loop3
bit 0, d
ld a, $10
jr nz, .okay
ld a, $20
.okay
ldh [rJOYP], a
ld a, $30
ldh [rJOYP], a
rr d
dec e
jr nz, .loop3
dec b
jr nz, .loop2
ld a, $20
ldh [rJOYP], a
ld a, $30
ldh [rJOYP], a
call SGBDelayCycles
pop bc
dec b
jr nz, .loop
ret
InitSGBBorder:
call CheckCGB
ret nz
; SGB/DMG only
di
ld a, [wJoypadDisable]
push af
set JOYPAD_DISABLE_SGB_TRANSFER_F, a
ld [wJoypadDisable], a
xor a
ldh [rJOYP], a
ldh [hSGB], a
call PushSGBBorderPalsAndWait
jr nc, .skip
ld a, $1
ldh [hSGB], a
call _InitSGBBorderPals
call SGBBorder_PushBGPals
call SGBDelayCycles
call SGB_ClearVRAM
call PushSGBBorder
call SGBDelayCycles
call SGB_ClearVRAM
ld hl, MaskEnCancelPacket
call _PushSGBPals
.skip
pop af
ld [wJoypadDisable], a
ei
ret
InitCGBPals::
call CheckCGB
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
_InitSGBBorderPals:
ld hl, .PacketPointerTable
ld c, 9
.loop
push bc
ld a, [hli]
push hl
ld h, [hl]
ld l, a
call _PushSGBPals
pop hl
inc hl
pop bc
dec c
jr nz, .loop
ret
.PacketPointerTable:
dw MaskEnFreezePacket
dw DataSndPacket1
dw DataSndPacket2
dw DataSndPacket3
dw DataSndPacket4
dw DataSndPacket5
dw DataSndPacket6
dw DataSndPacket7
dw DataSndPacket8
;UpdateSGBBorder: ; unreferenced
; di
; xor a
; ldh [rJOYP], a
; ld hl, MaskEnFreezePacket
; call _PushSGBPals
; call PushSGBBorder
; call SGBDelayCycles
; call SGB_ClearVRAM
; ld hl, MaskEnCancelPacket
; call _PushSGBPals
; ei
; ret
PushSGBBorder:
call .LoadSGBBorderPointers
push de
call SGBBorder_YetMorePalPushing
pop hl
call SGBBorder_MorePalPushing
ret
.LoadSGBBorderPointers:
ld hl, SGBBorderGFX
ld de, SGBBorderMapAndPalettes
ret
SGB_ClearVRAM:
ld hl, VRAM_Begin
ld bc, VRAM_End - VRAM_Begin
xor a
call ByteFill
ret
PushSGBBorderPalsAndWait:
ld hl, MltReq2Packet
call _PushSGBPals
call SGBDelayCycles
ldh a, [rJOYP]
and $3
cp $3
jr nz, .carry
ld a, $20
ldh [rJOYP], a
ldh a, [rJOYP]
ldh a, [rJOYP]
call SGBDelayCycles
call SGBDelayCycles
ld a, $30
ldh [rJOYP], a
call SGBDelayCycles
call SGBDelayCycles
ld a, $10
ldh [rJOYP], a
rept 6
ldh a, [rJOYP]
endr
call SGBDelayCycles
call SGBDelayCycles
ld a, $30
ldh [rJOYP], a
ldh a, [rJOYP]
ldh a, [rJOYP]
ldh a, [rJOYP]
call SGBDelayCycles
call SGBDelayCycles
ldh a, [rJOYP]
and $3
cp $3
jr nz, .carry
call .FinalPush
and a
ret
.carry
call .FinalPush
scf
ret
.FinalPush:
ld hl, MltReq1Packet
call _PushSGBPals
vc_hook Unknown_network_reset ; Unknown why this hook is here, doesn't seem to be needed
jp SGBDelayCycles
SGBBorder_PushBGPals:
call DisableLCD
ld a, %11100100
ldh [rBGP], a
ld hl, PredefPals
ld de, vTiles1
ld bc, $100 tiles
call CopyData
call DrawDefaultTiles
ld a, LCDC_DEFAULT
ldh [rLCDC], a
ld hl, PalTrnPacket
call _PushSGBPals
xor a
ldh [rBGP], a
ret
SGBBorder_MorePalPushing:
call DisableLCD
ld a, $e4
ldh [rBGP], a
ld de, vTiles1
ld bc, (6 + SCREEN_WIDTH + 6) * 5 * 2
call CopyData
ld b, SCREEN_HEIGHT
.loop
push bc
ld bc, 6 * 2
call CopyData
ld bc, SCREEN_WIDTH * 2
call ClearBytes
ld bc, 6 * 2
call CopyData
pop bc
dec b
jr nz, .loop
ld bc, (6 + SCREEN_WIDTH + 6) * 5 * 2
call CopyData
ld bc, $100
call ClearBytes
ld bc, 16 palettes
call CopyData
call DrawDefaultTiles
ld a, LCDC_DEFAULT
ldh [rLCDC], a
ld hl, PctTrnPacket
call _PushSGBPals
xor a
ldh [rBGP], a
ret
SGBBorder_YetMorePalPushing:
call DisableLCD
ld a, %11100100
ldh [rBGP], a
ld de, vTiles1
ld b, $80
.loop
push bc
ld bc, 1 tiles
call CopyData
ld bc, 1 tiles
call ClearBytes
pop bc
dec b
jr nz, .loop
call DrawDefaultTiles
ld a, LCDC_DEFAULT
ldh [rLCDC], a
ld hl, ChrTrnPacket
call _PushSGBPals
xor a
ldh [rBGP], a
ret
CopyData:
; copy bc bytes of data from hl to de
.loop
ld a, [hli]
ld [de], a
inc de
dec bc
ld a, c
or b
jr nz, .loop
ret
ClearBytes:
; clear bc bytes of data starting from de
.loop
xor a
ld [de], a
inc de
dec bc
ld a, c
or b
jr nz, .loop
ret
DrawDefaultTiles:
; Draw 240 tiles (2/3 of the screen) from tiles in VRAM
hlbgcoord 0, 0 ; BG Map 0
ld de, BG_MAP_WIDTH - SCREEN_WIDTH
ld a, $80 ; starting tile
ld c, 12 + 1
.line
ld b, 20
.tile
ld [hli], a
inc a
dec b
jr nz, .tile
; next line
add hl, de
dec c
jr nz, .line
ret
SGBDelayCycles:
ld de, 7000
.wait
nop
nop
nop
dec de
ld a, d
or e
jr nz, .wait
ret
INCLUDE "gfx/sgb/blk_packets.asm"
INCLUDE "gfx/sgb/pal_packets.asm"
INCLUDE "data/sgb_ctrl_packets.asm"
PredefPals:
table_width PALETTE_SIZE, PredefPals
INCLUDE "gfx/sgb/predef.pal"
assert_table_length NUM_PREDEF_PALS
SGBBorderMapAndPalettes:
; interleaved tile ids and palette ids, without the center 20x18 screen area
INCBIN "gfx/sgb/sgb_border.sgb.tilemap"
; four SGB palettes of 16 colors each; only the first 4 colors are used
INCLUDE "gfx/sgb/sgb_border.pal"
SGBBorderGFX:
INCBIN "gfx/sgb/sgb_border.2bpp"
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
farcall LoadSpecialMapObjectPalette
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"
;UnusedBattleObjectPals: ; unreferenced
;INCLUDE "gfx/battle_anims/unused_battle_anims.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"
EnbyPokegearPals:
INCLUDE "gfx/pokegear/pokegear_nb.pal"
BetaPokerPals:
INCLUDE "gfx/beta_poker/beta_poker.pal"
SlotMachinePals:
INCLUDE "gfx/slots/slots.pal"