First Commit

Upload literally everything from the pokecrystal16 expand-move-ID branch
This commit is contained in:
Zeta_Null 2023-09-10 12:35:35 -04:00
commit 2f8a41f833
4618 changed files with 480386 additions and 0 deletions

985
engine/gfx/cgb_layouts.asm Normal file
View file

@ -0,0 +1,985 @@
; Replaces the functionality of sgb.asm to work with CGB hardware.
CheckCGB:
ldh a, [hCGB]
and a
ret
LoadSGBLayoutCGB:
ld a, b
cp SCGB_DEFAULT
jr nz, .not_default
ld a, [wDefaultSGBLayout]
.not_default
cp SCGB_PARTY_MENU_HP_BARS
jp z, CGB_ApplyPartyMenuHPPals
call ResetBGPals
ld l, a
ld h, 0
add hl, hl
ld de, CGBLayoutJumptable
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ld de, .done
push de
jp hl
.done:
ret
CGBLayoutJumptable:
table_width 2, CGBLayoutJumptable
dw _CGB_BattleGrayscale
dw _CGB_BattleColors
dw _CGB_PokegearPals
dw _CGB_StatsScreenHPPals
dw _CGB_Pokedex
dw _CGB_SlotMachine
dw _CGB_BetaTitleScreen
dw _CGB_GSIntro
dw _CGB_Diploma
dw _CGB_MapPals
dw _CGB_PartyMenu
dw _CGB_Evolution
dw _CGB_GSTitleScreen
dw _CGB_Unused0D
dw _CGB_MoveList
dw _CGB_BetaPikachuMinigame
dw _CGB_PokedexSearchOption
dw _CGB_BetaPoker
dw _CGB_Pokepic
dw _CGB_MagnetTrain
dw _CGB_PackPals
dw _CGB_TrainerCard
dw _CGB_PokedexUnownMode
dw _CGB_BillsPC
dw _CGB_UnownPuzzle
dw _CGB_GamefreakLogo
dw _CGB_PlayerOrMonFrontpicPals
dw _CGB_TradeTube
dw _CGB_TrainerOrMonFrontpicPals
dw _CGB_MysteryGift
dw _CGB_Unused1E
assert_table_length NUM_SCGB_LAYOUTS
_CGB_BattleGrayscale:
ld hl, PalPacket_BattleGrayscale + 1
ld de, wBGPals1
ld c, 4
call CopyPalettes
ld hl, PalPacket_BattleGrayscale + 1
ld de, wBGPals1 palette PAL_BATTLE_BG_EXP
ld c, 4
call CopyPalettes
ld hl, PalPacket_BattleGrayscale + 1
ld de, wOBPals1
ld c, 2
call CopyPalettes
jr _CGB_FinishBattleScreenLayout
_CGB_BattleColors:
ld de, wBGPals1
call GetBattlemonBackpicPalettePointer
push hl
call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_PLAYER
call GetEnemyFrontpicPalettePointer
push hl
call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_ENEMY
ld a, [wEnemyHPPal]
ld l, a
ld h, 0
add hl, hl
add hl, hl
ld bc, HPBarPals
add hl, bc
call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_ENEMY_HP
ld a, [wPlayerHPPal]
ld l, a
ld h, 0
add hl, hl
add hl, hl
ld bc, HPBarPals
add hl, bc
call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_PLAYER_HP
ld hl, ExpBarPalette
call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_EXP
ld de, wOBPals1
pop hl
call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_OB_ENEMY
pop hl
call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_OB_PLAYER
ld a, SCGB_BATTLE_COLORS
ld [wDefaultSGBLayout], a
call ApplyPals
_CGB_FinishBattleScreenLayout:
call InitPartyMenuBGPal7
hlcoord 0, 0, wAttrmap
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
ld a, PAL_BATTLE_BG_ENEMY_HP
call ByteFill
hlcoord 0, 4, wAttrmap
lb bc, 8, 10
ld a, PAL_BATTLE_BG_PLAYER
call FillBoxCGB
hlcoord 10, 0, wAttrmap
lb bc, 7, 10
ld a, PAL_BATTLE_BG_ENEMY
call FillBoxCGB
hlcoord 0, 0, wAttrmap
lb bc, 4, 10
ld a, PAL_BATTLE_BG_ENEMY_HP
call FillBoxCGB
hlcoord 10, 7, wAttrmap
lb bc, 5, 10
ld a, PAL_BATTLE_BG_PLAYER_HP
call FillBoxCGB
hlcoord 10, 11, wAttrmap
lb bc, 1, 9
ld a, PAL_BATTLE_BG_EXP
call FillBoxCGB
hlcoord 0, 12, wAttrmap
ld bc, 6 * SCREEN_WIDTH
ld a, PAL_BATTLE_BG_TEXT
call ByteFill
ld hl, BattleObjectPals
ld de, wOBPals1 palette PAL_BATTLE_OB_GRAY
ld bc, 6 palettes
ld a, BANK(wOBPals1)
call FarCopyWRAM
call ApplyAttrmap
ret
InitPartyMenuBGPal7:
farcall Function100dc0
Mobile_InitPartyMenuBGPal7:
ld hl, PartyMenuBGPalette
jr nc, .not_mobile
ld hl, PartyMenuBGMobilePalette
.not_mobile
ld de, wBGPals1 palette 7
ld bc, 1 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
ret
InitPartyMenuBGPal0:
farcall Function100dc0
ld hl, PartyMenuBGPalette
jr nc, .not_mobile
ld hl, PartyMenuBGMobilePalette
.not_mobile
ld de, wBGPals1 palette 0
ld bc, 1 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
ret
_CGB_PokegearPals:
ld a, [wPlayerGender]
bit PLAYERGENDER_FEMALE_F, a
jr z, .male
ld hl, FemalePokegearPals
jr .got_pals
.male
ld hl, MalePokegearPals
.got_pals
ld de, wBGPals1
ld bc, 6 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
_CGB_StatsScreenHPPals:
ld de, wBGPals1
ld a, [wCurHPPal]
ld l, a
ld h, 0
add hl, hl
add hl, hl
ld bc, HPBarPals
add hl, bc
call LoadPalette_White_Col1_Col2_Black ; hp palette
ld a, [wCurPartySpecies]
ld bc, wTempMonDVs
call GetPlayerOrMonPalettePointer
call LoadPalette_White_Col1_Col2_Black ; mon palette
ld hl, ExpBarPalette
call LoadPalette_White_Col1_Col2_Black ; exp palette
ld hl, StatsScreenPagePals
ld de, wBGPals1 palette 3
ld bc, 3 palettes ; pink, green, and blue page palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
call WipeAttrmap
hlcoord 0, 0, wAttrmap
lb bc, 8, SCREEN_WIDTH
ld a, $1 ; mon palette
call FillBoxCGB
hlcoord 10, 16, wAttrmap
ld bc, 10
ld a, $2 ; exp palette
call ByteFill
hlcoord 13, 5, wAttrmap
lb bc, 2, 2
ld a, $3 ; pink page palette
call FillBoxCGB
hlcoord 15, 5, wAttrmap
lb bc, 2, 2
ld a, $4 ; green page palette
call FillBoxCGB
hlcoord 17, 5, wAttrmap
lb bc, 2, 2
ld a, $5 ; blue page palette
call FillBoxCGB
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
StatsScreenPagePals:
INCLUDE "gfx/stats/pages.pal"
StatsScreenPals:
INCLUDE "gfx/stats/stats.pal"
_CGB_Pokedex:
ld de, wBGPals1
ld a, PREDEFPAL_POKEDEX
call GetPredefPal
call LoadHLPaletteIntoDE ; dex interface palette
ld a, [wCurPartySpecies]
cp $ff
jr nz, .is_pokemon
ld hl, PokedexQuestionMarkPalette
call LoadHLPaletteIntoDE ; green question mark palette
jr .got_palette
.is_pokemon
call GetMonPalettePointer
call LoadPalette_White_Col1_Col2_Black ; mon palette
.got_palette
call WipeAttrmap
hlcoord 1, 1, wAttrmap
lb bc, 7, 7
ld a, $1 ; green question mark palette
call FillBoxCGB
call InitPartyMenuOBPals
ld hl, PokedexCursorPalette
ld de, wOBPals1 palette 7 ; green cursor palette
ld bc, 1 palettes
ld a, BANK(wOBPals1)
call FarCopyWRAM
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
PokedexQuestionMarkPalette:
INCLUDE "gfx/pokedex/question_mark.pal"
PokedexCursorPalette:
INCLUDE "gfx/pokedex/cursor.pal"
_CGB_BillsPC:
ld de, wBGPals1
ld a, PREDEFPAL_POKEDEX
call GetPredefPal
call LoadHLPaletteIntoDE
ld a, [wCurPartySpecies]
cp $ff
jr nz, .GetMonPalette
ld hl, BillsPCOrangePalette
call LoadHLPaletteIntoDE
jr .GotPalette
.GetMonPalette:
ld bc, wTempMonDVs
call GetPlayerOrMonPalettePointer
call LoadPalette_White_Col1_Col2_Black
.GotPalette:
call WipeAttrmap
hlcoord 1, 4, wAttrmap
lb bc, 7, 7
ld a, $1 ; mon palette
call FillBoxCGB
call InitPartyMenuOBPals
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
_CGB_Unknown: ; unreferenced
ld hl, BillsPCOrangePalette
call LoadHLPaletteIntoDE
jr .GotPalette
.GetMonPalette: ; unreferenced
ld bc, wTempMonDVs
call GetPlayerOrMonPalettePointer
call LoadPalette_White_Col1_Col2_Black
.GotPalette:
call WipeAttrmap
hlcoord 1, 1, wAttrmap
lb bc, 7, 7
ld a, $1 ; mon palette
call FillBoxCGB
call InitPartyMenuOBPals
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
BillsPCOrangePalette:
INCLUDE "gfx/pc/orange.pal"
_CGB_PokedexUnownMode:
ld de, wBGPals1
ld a, PREDEFPAL_POKEDEX
call GetPredefPal
call LoadHLPaletteIntoDE
ld a, [wCurPartySpecies]
call GetMonPalettePointer
call LoadPalette_White_Col1_Col2_Black
call WipeAttrmap
hlcoord 7, 5, wAttrmap
lb bc, 7, 7
ld a, $1 ; mon palette
call FillBoxCGB
call InitPartyMenuOBPals
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
_CGB_SlotMachine:
ld hl, SlotMachinePals
ld de, wBGPals1
ld bc, 16 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
call WipeAttrmap
hlcoord 0, 2, wAttrmap
lb bc, 10, 3
ld a, $2 ; "3" palette
call FillBoxCGB
hlcoord 17, 2, wAttrmap
lb bc, 10, 3
ld a, $2 ; "3" palette
call FillBoxCGB
hlcoord 0, 4, wAttrmap
lb bc, 6, 3
ld a, $3 ; "2" palette
call FillBoxCGB
hlcoord 17, 4, wAttrmap
lb bc, 6, 3
ld a, $3 ; "2" palette
call FillBoxCGB
hlcoord 0, 6, wAttrmap
lb bc, 2, 3
ld a, $4 ; "1" palette
call FillBoxCGB
hlcoord 17, 6, wAttrmap
lb bc, 2, 3
ld a, $4 ; "1" palette
call FillBoxCGB
hlcoord 4, 2, wAttrmap
lb bc, 2, 12
ld a, $1 ; Vileplume palette
call FillBoxCGB
hlcoord 3, 2, wAttrmap
lb bc, 10, 1
ld a, $1 ; lights palette
call FillBoxCGB
hlcoord 16, 2, wAttrmap
lb bc, 10, 1
ld a, $1 ; lights palette
call FillBoxCGB
hlcoord 0, 12, wAttrmap
ld bc, 6 * SCREEN_WIDTH
ld a, $7 ; text palette
call ByteFill
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
_CGB_BetaTitleScreen:
ld hl, PalPacket_BetaTitleScreen + 1
call CopyFourPalettes
call WipeAttrmap
ld de, wOBPals1
ld a, PREDEFPAL_PACK
call GetPredefPal
call LoadHLPaletteIntoDE
hlcoord 0, 6, wAttrmap
lb bc, 12, SCREEN_WIDTH
ld a, $1
call FillBoxCGB
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
_CGB_GSIntro:
ld b, 0
ld hl, .Jumptable
add hl, bc
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.Jumptable:
dw .ShellderLaprasScene
dw .JigglypuffPikachuScene
dw .StartersCharizardScene
.ShellderLaprasScene:
ld hl, .ShellderLaprasBGPalette
ld de, wBGPals1
call LoadHLPaletteIntoDE
ld hl, .ShellderLaprasOBPals
ld de, wOBPals1
ld bc, 2 palettes
ld a, BANK(wOBPals1)
call FarCopyWRAM
call WipeAttrmap
ret
.ShellderLaprasBGPalette:
INCLUDE "gfx/intro/gs_shellder_lapras_bg.pal"
.ShellderLaprasOBPals:
INCLUDE "gfx/intro/gs_shellder_lapras_ob.pal"
.JigglypuffPikachuScene:
ld de, wBGPals1
ld a, PREDEFPAL_GS_INTRO_JIGGLYPUFF_PIKACHU_BG
call GetPredefPal
call LoadHLPaletteIntoDE
ld de, wOBPals1
ld a, PREDEFPAL_GS_INTRO_JIGGLYPUFF_PIKACHU_OB
call GetPredefPal
call LoadHLPaletteIntoDE
call WipeAttrmap
ret
.StartersCharizardScene:
ld hl, PalPacket_Pack + 1
call CopyFourPalettes
ld de, wOBPals1
ld a, PREDEFPAL_GS_INTRO_STARTERS_TRANSITION
call GetPredefPal
call LoadHLPaletteIntoDE
call WipeAttrmap
ret
_CGB_BetaPoker:
ld hl, BetaPokerPals
ld de, wBGPals1
ld bc, 5 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
call ApplyPals
call WipeAttrmap
call ApplyAttrmap
ret
_CGB_Diploma:
ld hl, DiplomaPalettes
ld de, wBGPals1
ld bc, 16 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
ld hl, PalPacket_Diploma + 1
call CopyFourPalettes
call WipeAttrmap
call ApplyAttrmap
ret
_CGB_MapPals:
call LoadMapPals
ld a, SCGB_MAPPALS
ld [wDefaultSGBLayout], a
ret
_CGB_PartyMenu:
ld hl, PalPacket_PartyMenu + 1
call CopyFourPalettes
call InitPartyMenuBGPal0
call InitPartyMenuBGPal7
call InitPartyMenuOBPals
call ApplyAttrmap
ret
_CGB_Evolution:
ld de, wBGPals1
ld a, c
and a
jr z, .pokemon
ld a, PREDEFPAL_BLACKOUT
call GetPredefPal
call LoadHLPaletteIntoDE
jr .got_palette
.pokemon
ld hl, wPartyMon1DVs
ld bc, PARTYMON_STRUCT_LENGTH
ld a, [wCurPartyMon]
call AddNTimes
ld c, l
ld b, h
ld a, [wPlayerHPPal]
call GetPlayerOrMonPalettePointer
call LoadPalette_White_Col1_Col2_Black
ld hl, BattleObjectPals
ld de, wOBPals1 palette PAL_BATTLE_OB_GRAY
ld bc, 6 palettes
ld a, BANK(wOBPals1)
call FarCopyWRAM
.got_palette
call WipeAttrmap
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
_CGB_GSTitleScreen:
ld hl, UnusedGSTitleBGPals
ld de, wBGPals1
ld bc, 5 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
ld hl, UnusedGSTitleOBPals
ld de, wOBPals1
ld bc, 2 palettes
ld a, BANK(wOBPals1)
call FarCopyWRAM
ld a, SCGB_DIPLOMA
ld [wDefaultSGBLayout], a
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
_CGB_Unused0D:
ld hl, PalPacket_Diploma + 1
call CopyFourPalettes
call WipeAttrmap
call ApplyAttrmap
ret
_CGB_UnownPuzzle:
ld hl, PalPacket_UnownPuzzle + 1
call CopyFourPalettes
ld de, wOBPals1
ld a, PREDEFPAL_UNOWN_PUZZLE
call GetPredefPal
call LoadHLPaletteIntoDE
ldh a, [rSVBK]
push af
ld a, BANK(wOBPals1)
ldh [rSVBK], a
ld hl, wOBPals1
ld a, LOW(palred 31 + palgreen 0 + palblue 0)
ld [hli], a
ld a, HIGH(palred 31 + palgreen 0 + palblue 0)
ld [hl], a
pop af
ldh [rSVBK], a
call WipeAttrmap
call ApplyAttrmap
ret
_CGB_TrainerCard:
ld de, wBGPals1
xor a ; CHRIS
call GetTrainerPalettePointer
call LoadPalette_White_Col1_Col2_Black
ld a, FALKNER ; KRIS
call GetTrainerPalettePointer
call LoadPalette_White_Col1_Col2_Black
ld a, BUGSY
call GetTrainerPalettePointer
call LoadPalette_White_Col1_Col2_Black
ld a, WHITNEY
call GetTrainerPalettePointer
call LoadPalette_White_Col1_Col2_Black
ld a, MORTY
call GetTrainerPalettePointer
call LoadPalette_White_Col1_Col2_Black
ld a, CHUCK
call GetTrainerPalettePointer
call LoadPalette_White_Col1_Col2_Black
ld a, JASMINE
call GetTrainerPalettePointer
call LoadPalette_White_Col1_Col2_Black
ld a, PRYCE
call GetTrainerPalettePointer
call LoadPalette_White_Col1_Col2_Black
ld a, PREDEFPAL_CGB_BADGE
call GetPredefPal
call LoadHLPaletteIntoDE
; fill screen with opposite-gender palette for the card border
hlcoord 0, 0, wAttrmap
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
ld a, [wPlayerGender]
and a
ld a, $1 ; kris
jr z, .got_gender
ld a, $0 ; chris
.got_gender
call ByteFill
; fill trainer sprite area with same-gender palette
hlcoord 14, 1, wAttrmap
lb bc, 7, 5
ld a, [wPlayerGender]
and a
ld a, $0 ; chris
jr z, .got_gender2
ld a, $1 ; kris
.got_gender2
call FillBoxCGB
; top-right corner still uses the border's palette
hlcoord 18, 1, wAttrmap
ld [hl], $1
hlcoord 2, 11, wAttrmap
lb bc, 2, 4
ld a, $1 ; falkner
call FillBoxCGB
hlcoord 6, 11, wAttrmap
lb bc, 2, 4
ld a, $2 ; bugsy
call FillBoxCGB
hlcoord 10, 11, wAttrmap
lb bc, 2, 4
ld a, $3 ; whitney
call FillBoxCGB
hlcoord 14, 11, wAttrmap
lb bc, 2, 4
ld a, $4 ; morty
call FillBoxCGB
hlcoord 2, 14, wAttrmap
lb bc, 2, 4
ld a, $5 ; chuck
call FillBoxCGB
hlcoord 6, 14, wAttrmap
lb bc, 2, 4
ld a, $6 ; jasmine
call FillBoxCGB
hlcoord 10, 14, wAttrmap
lb bc, 2, 4
ld a, $7 ; pryce
call FillBoxCGB
; clair uses kris's palette
ld a, [wPlayerGender]
and a
push af
jr z, .got_gender3
hlcoord 14, 14, wAttrmap
lb bc, 2, 4
ld a, $1
call FillBoxCGB
.got_gender3
pop af
ld c, $0
jr nz, .got_gender4
inc c
.got_gender4
ld a, c
hlcoord 18, 1, wAttrmap
ld [hl], a
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
_CGB_MoveList:
ld de, wBGPals1
ld a, PREDEFPAL_GOLDENROD
call GetPredefPal
call LoadHLPaletteIntoDE
ld a, [wPlayerHPPal]
ld l, a
ld h, 0
add hl, hl
add hl, hl
ld bc, HPBarPals
add hl, bc
call LoadPalette_White_Col1_Col2_Black
call WipeAttrmap
hlcoord 11, 1, wAttrmap
lb bc, 2, 9
ld a, $1
call FillBoxCGB
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
_CGB_BetaPikachuMinigame:
ld hl, PalPacket_BetaPikachuMinigame + 1
call CopyFourPalettes
call WipeAttrmap
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
_CGB_PokedexSearchOption:
ld de, wBGPals1
ld a, PREDEFPAL_POKEDEX
call GetPredefPal
call LoadHLPaletteIntoDE
call WipeAttrmap
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
_CGB_PackPals:
; pack pals
ld a, [wBattleType]
cp BATTLETYPE_TUTORIAL
jr z, .tutorial_male
ld a, [wPlayerGender]
bit PLAYERGENDER_FEMALE_F, a
jr z, .tutorial_male
ld hl, .KrisPackPals
jr .got_gender
.tutorial_male
ld hl, .ChrisPackPals
.got_gender
ld de, wBGPals1
ld bc, 8 palettes ; 6 palettes?
ld a, BANK(wBGPals1)
call FarCopyWRAM
call WipeAttrmap
hlcoord 0, 0, wAttrmap
lb bc, 1, 10
ld a, $1
call FillBoxCGB
hlcoord 10, 0, wAttrmap
lb bc, 1, 10
ld a, $2
call FillBoxCGB
hlcoord 7, 2, wAttrmap
lb bc, 9, 1
ld a, $3
call FillBoxCGB
hlcoord 0, 7, wAttrmap
lb bc, 3, 5
ld a, $4
call FillBoxCGB
hlcoord 0, 3, wAttrmap
lb bc, 3, 5
ld a, $5
call FillBoxCGB
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
.ChrisPackPals:
INCLUDE "gfx/pack/pack.pal"
.KrisPackPals:
INCLUDE "gfx/pack/pack_f.pal"
_CGB_Pokepic:
call _CGB_MapPals
ld de, SCREEN_WIDTH
hlcoord 0, 0, wAttrmap
ld a, [wMenuBorderTopCoord]
.loop
and a
jr z, .found_top
dec a
add hl, de
jr .loop
.found_top
ld a, [wMenuBorderLeftCoord]
ld e, a
ld d, 0
add hl, de
ld a, [wMenuBorderTopCoord]
ld b, a
ld a, [wMenuBorderBottomCoord]
inc a
sub b
ld b, a
ld a, [wMenuBorderLeftCoord]
ld c, a
ld a, [wMenuBorderRightCoord]
sub c
inc a
ld c, a
ld a, PAL_BG_GRAY
call FillBoxCGB
call ApplyAttrmap
ret
_CGB_MagnetTrain: ; unused
ld hl, PalPacket_MagnetTrain + 1
call CopyFourPalettes
call WipeAttrmap
hlcoord 0, 4, wAttrmap
lb bc, 10, SCREEN_WIDTH
ld a, PAL_BG_GREEN
call FillBoxCGB
hlcoord 0, 6, wAttrmap
lb bc, 6, SCREEN_WIDTH
ld a, PAL_BG_RED
call FillBoxCGB
call ApplyAttrmap
call ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
_CGB_GamefreakLogo:
ld de, wBGPals1
ld a, PREDEFPAL_GAMEFREAK_LOGO_BG
call GetPredefPal
call LoadHLPaletteIntoDE
ld hl, .GamefreakDittoPalette
ld de, wOBPals1
call LoadHLPaletteIntoDE
ld hl, .GamefreakDittoPalette
ld de, wOBPals1 palette 1
call LoadHLPaletteIntoDE
call WipeAttrmap
call ApplyAttrmap
call ApplyPals
ret
.GamefreakDittoPalette:
INCLUDE "gfx/splash/ditto.pal"
_CGB_PlayerOrMonFrontpicPals:
ld de, wBGPals1
ld a, [wCurPartySpecies]
ld bc, wTempMonDVs
call GetPlayerOrMonPalettePointer
call LoadPalette_White_Col1_Col2_Black
call WipeAttrmap
call ApplyAttrmap
call ApplyPals
ret
_CGB_Unused1E:
ld de, wBGPals1
ld a, [wCurPartySpecies]
call GetMonPalettePointer
call LoadPalette_White_Col1_Col2_Black
call WipeAttrmap
call ApplyAttrmap
ret
_CGB_TradeTube:
ld hl, PalPacket_TradeTube + 1
call CopyFourPalettes
ld hl, PartyMenuOBPals
ld de, wOBPals1
ld bc, 1 palettes
ld a, BANK(wOBPals1)
call FarCopyWRAM
ld de, wOBPals1 palette 7
ld a, PREDEFPAL_TRADE_TUBE
call GetPredefPal
call LoadHLPaletteIntoDE
call WipeAttrmap
ret
_CGB_TrainerOrMonFrontpicPals:
ld de, wBGPals1
ld a, [wCurPartySpecies]
ld bc, wTempMonDVs
call GetFrontpicPalettePointer
call LoadPalette_White_Col1_Col2_Black
call WipeAttrmap
call ApplyAttrmap
call ApplyPals
ret
_CGB_MysteryGift:
ld hl, .MysteryGiftPalettes
ld de, wBGPals1
ld bc, 2 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
call ApplyPals
call WipeAttrmap
hlcoord 3, 7, wAttrmap
lb bc, 8, 14
ld a, $1
call FillBoxCGB
hlcoord 1, 5, wAttrmap
lb bc, 1, 18
ld a, $1
call FillBoxCGB
hlcoord 1, 16, wAttrmap
lb bc, 1, 18
ld a, $1
call FillBoxCGB
hlcoord 0, 0, wAttrmap
lb bc, 17, 2
ld a, $1
call FillBoxCGB
hlcoord 18, 5, wAttrmap
lb bc, 12, 1
ld a, $1
call FillBoxCGB
call ApplyAttrmap
ret
.MysteryGiftPalettes:
INCLUDE "gfx/mystery_gift/mystery_gift.pal"
GS_CGB_MysteryGift: ; unreferenced
ld hl, .MysteryGiftPalette
ld de, wBGPals1
ld bc, 1 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
call ApplyPals
call WipeAttrmap
call ApplyAttrmap
ret
.MysteryGiftPalette:
INCLUDE "gfx/mystery_gift/gs_mystery_gift.pal"

1339
engine/gfx/color.asm Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,293 @@
GetCrystalCGBLayout:
ld a, b
cp SCGB_DEFAULT
jr nz, .not_default
ld a, [wDefaultSGBLayout]
.not_default
push af
farcall ResetBGPals
pop af
ld l, a
ld h, 0
add hl, hl
ld de, .Jumptable
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ld de, .done
push de
jp hl
.done:
ret
.Jumptable:
dw _CrystalCGB_MobileLayout0
dw _CrystalCGB_MobileLayout1
dw _CrystalCGB_NameCard
Crystal_FillBoxCGB:
; This is a copy of 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
Crystal_WipeAttrmap:
; This is a copy of WipeAttrmap.
hlcoord 0, 0, wAttrmap
ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
xor a
call ByteFill
ret
MG_Mobile_Layout_LoadPals:
ld de, wBGPals1
ld hl, Palette_MysteryGiftMobile
ld bc, 5 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
ld de, wBGPals1 palette PAL_BG_TEXT
ld hl, Palette_TextBG7
ld bc, 1 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
ret
_CrystalCGB_MobileLayout0:
call MG_Mobile_Layout_LoadPals
call Crystal_WipeAttrmap
call MG_Mobile_Layout_CreatePalBoxes
farcall ApplyAttrmap
farcall ApplyPals
ret
MG_Mobile_Layout_CreatePalBoxes:
hlcoord 0, 0, wAttrmap
lb bc, 4, 1
ld a, $1
call Crystal_FillBoxCGB
lb bc, 2, 1
ld a, $2
call Crystal_FillBoxCGB
lb bc, 6, 1
ld a, $3
call Crystal_FillBoxCGB
hlcoord 1, 0, wAttrmap
ld a, $1
lb bc, 3, 18
call Crystal_FillBoxCGB
lb bc, 2, 18
ld a, $2
call Crystal_FillBoxCGB
lb bc, 12, 18
ld a, $3
call Crystal_FillBoxCGB
hlcoord 19, 0, wAttrmap
lb bc, 4, 1
ld a, $1
call Crystal_FillBoxCGB
lb bc, 2, 1
ld a, $2
call Crystal_FillBoxCGB
lb bc, 6, 1
ld a, $3
call Crystal_FillBoxCGB
hlcoord 0, 12, wAttrmap
ld bc, 6 * SCREEN_WIDTH
ld a, $7
call ByteFill
ret
Palette_MysteryGiftMobile:
INCLUDE "gfx/mystery_gift/mg_mobile.pal"
LoadOW_BGPal7::
ld hl, Palette_TextBG7
ld de, wBGPals1 palette PAL_BG_TEXT
ld bc, 1 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
ret
Palette_TextBG7:
INCLUDE "gfx/font/bg_text.pal"
Function49420::
ld hl, MansionPalette1 + 8 palettes
ld de, wBGPals1 palette PAL_BG_ROOF
ld bc, 1 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
ret
_CrystalCGB_MobileLayout1:
call MG_Mobile_Layout_LoadPals
ld de, wBGPals1 palette PAL_BG_TEXT
ld hl, .TextPalette
ld bc, 1 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
call Crystal_WipeAttrmap
hlcoord 0, 0, wAttrmap
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
xor a
call ByteFill
hlcoord 0, 14, wAttrmap
ld bc, 4 * SCREEN_WIDTH
ld a, $7
call ByteFill
ld a, [wd002]
bit 6, a
jr z, .asm_49464
call .Function49480
jr .done
.asm_49464
call .Function49496
.done
farcall ApplyAttrmap
farcall ApplyPals
ld a, TRUE
ldh [hCGBPalUpdate], a
ret
.TextPalette:
INCLUDE "gfx/mystery_gift/mobile_text.pal"
.Function49480:
hlcoord 0, 0, wAttrmap
lb bc, 4, SCREEN_WIDTH
ld a, $7
call Crystal_FillBoxCGB
hlcoord 0, 2, wAttrmap
ld a, $4
ld [hl], a
hlcoord 19, 2, wAttrmap
ld [hl], a
ret
.Function49496:
hlcoord 0, 0, wAttrmap
lb bc, 2, SCREEN_WIDTH
ld a, $7
call Crystal_FillBoxCGB
hlcoord 0, 1, wAttrmap
ld a, $4
ld [hl], a
hlcoord 19, 1, wAttrmap
ld [hl], a
ret
INCLUDE "engine/tilesets/tileset_palettes.asm"
_CrystalCGB_NameCard:
ld hl, .BGPalette
ld de, wBGPals1
ld bc, 1 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
farcall ApplyPals
call Crystal_WipeAttrmap
farcall ApplyAttrmap
ld hl, .OBPalette
ld de, wOBPals1
ld bc, 1 palettes
ld a, BANK(wOBPals1)
call FarCopyWRAM
ret
.BGPalette:
INCLUDE "gfx/mystery_gift/name_card_bg.pal"
.OBPalette:
INCLUDE "gfx/mystery_gift/name_card_ob.pal"
Function49742:
ld hl, .MobileBorderPalettes
ld de, wBGPals1
ld bc, 8 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
farcall ApplyPals
ret
.MobileBorderPalettes:
INCLUDE "gfx/trade/mobile_border.pal"
_InitMG_Mobile_LinkTradePalMap:
hlcoord 0, 0, wAttrmap
lb bc, 16, 2
ld a, $4
call Crystal_FillBoxCGB
ld a, $3
ldcoord_a 0, 1, wAttrmap
ldcoord_a 0, 14, wAttrmap
hlcoord 2, 0, wAttrmap
lb bc, 8, 18
ld a, $5
call Crystal_FillBoxCGB
hlcoord 2, 8, wAttrmap
lb bc, 8, 18
ld a, $6
call Crystal_FillBoxCGB
hlcoord 0, 16, wAttrmap
lb bc, 2, SCREEN_WIDTH
ld a, $4
call Crystal_FillBoxCGB
ld a, $3
lb bc, 6, 1
hlcoord 6, 1, wAttrmap
call Crystal_FillBoxCGB
ld a, $3
lb bc, 6, 1
hlcoord 17, 1, wAttrmap
call Crystal_FillBoxCGB
ld a, $3
lb bc, 6, 1
hlcoord 6, 9, wAttrmap
call Crystal_FillBoxCGB
ld a, $3
lb bc, 6, 1
hlcoord 17, 9, wAttrmap
call Crystal_FillBoxCGB
ld a, $2
hlcoord 2, 16, wAttrmap
ld [hli], a
ld a, $7
ld [hli], a
ld [hli], a
ld [hli], a
ld a, $2
ld [hl], a
hlcoord 2, 17, wAttrmap
ld a, $3
ld bc, 6
call ByteFill
ret
_LoadTradeRoomBGPals:
ld hl, TradeRoomPalette
ld de, wBGPals1 palette PAL_BG_GREEN
ld bc, 6 palettes
ld a, BANK(wBGPals1)
call FarCopyWRAM
farcall ApplyPals
ret
TradeRoomPalette:
INCLUDE "gfx/trade/border.pal"
InitMG_Mobile_LinkTradePalMap:
call _InitMG_Mobile_LinkTradePalMap
ret

604
engine/gfx/dma_transfer.asm Normal file
View file

@ -0,0 +1,604 @@
HDMATransferAttrmapAndTilemapToWRAMBank3::
ld hl, .Function
jp CallInSafeGFXMode
.Function:
decoord 0, 0, wAttrmap
ld hl, wScratchAttrmap
call PadAttrmapForHDMATransfer
decoord 0, 0
ld hl, wScratchTilemap
call PadTilemapForHDMATransfer
ld a, $0
ldh [rVBK], a
ld hl, wScratchTilemap
call HDMATransferToWRAMBank3
ld a, $1
ldh [rVBK], a
ld hl, wScratchAttrmap
call HDMATransferToWRAMBank3
ret
HDMATransferTilemapToWRAMBank3::
ld hl, .Function
jp CallInSafeGFXMode
.Function:
decoord 0, 0
ld hl, wScratchTilemap
call PadTilemapForHDMATransfer
ld a, $0
ldh [rVBK], a
ld hl, wScratchTilemap
call HDMATransferToWRAMBank3
ret
HDMATransferAttrmapToWRAMBank3:
ld hl, .Function
jp CallInSafeGFXMode
.Function:
decoord 0, 0, wAttrmap
ld hl, wScratchAttrmap
call PadAttrmapForHDMATransfer
ld a, $1
ldh [rVBK], a
ld hl, wScratchAttrmap
call HDMATransferToWRAMBank3
ret
ReloadMapPart::
ld hl, .Function
jp CallInSafeGFXMode
.Function:
decoord 0, 0, wAttrmap
ld hl, wScratchAttrmap
call PadAttrmapForHDMATransfer
decoord 0, 0
ld hl, wScratchTilemap
call PadTilemapForHDMATransfer
call DelayFrame
di
ldh a, [rVBK]
push af
ld a, $1
ldh [rVBK], a
ld hl, wScratchAttrmap
call HDMATransfer_Wait127Scanlines_toBGMap
ld a, $0
ldh [rVBK], a
ld hl, wScratchTilemap
call HDMATransfer_Wait127Scanlines_toBGMap
pop af
ldh [rVBK], a
ei
ret
Mobile_ReloadMapPart:
ld hl, ReloadMapPart ; useless
ld hl, .Function
jp CallInSafeGFXMode
.Function:
decoord 0, 0, wAttrmap
ld hl, wScratchAttrmap
call PadAttrmapForHDMATransfer
decoord 0, 0
ld hl, wScratchTilemap
call PadTilemapForHDMATransfer
call DelayFrame
di
ldh a, [rVBK]
push af
ld a, $1
ldh [rVBK], a
ld hl, wScratchAttrmap
call HDMATransfer_NoDI
ld a, $0
ldh [rVBK], a
ld hl, wScratchTilemap
call HDMATransfer_NoDI
pop af
ldh [rVBK], a
ei
ret
Function1040d4: ; unreferenced
ld hl, .Function
jp CallInSafeGFXMode
.Function
ld a, $1
ldh [rVBK], a
ld a, BANK(w3_d800)
ldh [rSVBK], a
ld de, w3_d800
ldh a, [hBGMapAddress + 1]
ldh [rHDMA1], a
ldh a, [hBGMapAddress]
ldh [rHDMA2], a
ld a, d
ldh [rHDMA3], a
ld a, e
ldh [rHDMA4], a
ld a, $23
ldh [hDMATransfer], a
call WaitDMATransfer
ret
Function1040fb: ; unreferenced
ld hl, .Function
jp CallInSafeGFXMode
.Function
ld a, $1
ldh [rVBK], a
ld a, BANK(w3_d800)
ldh [rSVBK], a
ld hl, w3_d800
call HDMATransferToWRAMBank3
ret
OpenAndCloseMenu_HDMATransferTilemapAndAttrmap::
; OpenText
ld hl, .Function
jp CallInSafeGFXMode
.Function:
; Transfer wAttrmap and Tilemap to BGMap
; Fill vBGAttrs with $00
; Fill vBGTiles with " "
decoord 0, 0, wAttrmap
ld hl, wScratchAttrmap
call PadAttrmapForHDMATransfer
decoord 0, 0
ld hl, wScratchTilemap
call PadTilemapForHDMATransfer
call DelayFrame
di
ldh a, [rVBK]
push af
ld a, $1
ldh [rVBK], a
ld hl, wScratchAttrmap
call HDMATransfer_Wait123Scanlines_toBGMap
ld a, $0
ldh [rVBK], a
ld hl, wScratchTilemap
call HDMATransfer_Wait123Scanlines_toBGMap
pop af
ldh [rVBK], a
ei
ret
Mobile_OpenAndCloseMenu_HDMATransferTilemapAndAttrmap:
ld hl, .Function
jp CallInSafeGFXMode
.Function:
; Transfer wAttrmap and Tilemap to BGMap
; Fill vBGAttrs with $00
; Fill vBGTiles with $ff
decoord 0, 0, wAttrmap
ld hl, wScratchAttrmap
call PadAttrmapForHDMATransfer
ld c, $ff
decoord 0, 0
ld hl, wScratchTilemap
call PadMapForHDMATransfer
ld a, $1
ldh [rVBK], a
ld hl, wScratchAttrmap
call HDMATransfer_Wait127Scanlines_toBGMap
ld a, $0
ldh [rVBK], a
ld hl, wScratchTilemap
call HDMATransfer_Wait127Scanlines_toBGMap
ret
CallInSafeGFXMode:
ldh a, [hBGMapMode]
push af
ldh a, [hMapAnims]
push af
xor a
ldh [hBGMapMode], a
ldh [hMapAnims], a
ldh a, [rSVBK]
push af
ld a, BANK(wScratchTilemap)
ldh [rSVBK], a
ldh a, [rVBK]
push af
call ._hl_
pop af
ldh [rVBK], a
pop af
ldh [rSVBK], a
pop af
ldh [hMapAnims], a
pop af
ldh [hBGMapMode], a
ret
._hl_
jp hl
HDMATransferToWRAMBank3:
call _LoadHDMAParameters
ld a, $23
ldh [hDMATransfer], a
WaitDMATransfer:
.loop
call DelayFrame
ldh a, [hDMATransfer]
and a
jr nz, .loop
ret
HDMATransfer_Wait127Scanlines_toBGMap:
; HDMA transfer from hl to [hBGMapAddress]
; hBGMapAddress -> de
; 2 * SCREEN_HEIGHT -> c
ldh a, [hBGMapAddress + 1]
ld d, a
ldh a, [hBGMapAddress]
ld e, a
ld c, 2 * SCREEN_HEIGHT
jr HDMATransfer_Wait127Scanlines
HDMATransfer_Wait123Scanlines_toBGMap:
; HDMA transfer from hl to [hBGMapAddress]
; hBGMapAddress -> de
; 2 * SCREEN_HEIGHT -> c
; $7b --> b
ldh a, [hBGMapAddress + 1]
ld d, a
ldh a, [hBGMapAddress]
ld e, a
ld c, 2 * SCREEN_HEIGHT
jr HDMATransfer_Wait123Scanlines
HDMATransfer_NoDI:
; HDMA transfer from hl to [hBGMapAddress]
; [hBGMapAddress] --> de
; 2 * SCREEN_HEIGHT --> c
ldh a, [hBGMapAddress + 1]
ld d, a
ldh a, [hBGMapAddress]
ld e, a
ld c, 2 * SCREEN_HEIGHT
; [rHDMA1, rHDMA2] = hl & $fff0
ld a, h
ldh [rHDMA1], a
ld a, l
and $f0
ldh [rHDMA2], a
; [rHDMA3, rHDMA4] = de & $1ff0
ld a, d
and $1f
ldh [rHDMA3], a
ld a, e
and $f0
ldh [rHDMA4], a
; b = c | %10000000
ld a, c
dec c
or $80
ld b, a
; d = $7f - c + 1
ld a, $7f
sub c
ld d, a
; while [rLY] >= d: pass
.loop1
ldh a, [rLY]
cp d
jr nc, .loop1
; while not [rSTAT] & 3: pass
.loop2
ldh a, [rSTAT]
and $3
jr z, .loop2
; load the 5th byte of HDMA
ld a, b
ldh [rHDMA5], a
; wait until rLY advances (c + 1) times
ldh a, [rLY]
inc c
ld hl, rLY
.loop3
cp [hl]
jr z, .loop3
ld a, [hl]
dec c
jr nz, .loop3
ld hl, rHDMA5
res 7, [hl]
ret
HDMATransfer_Wait123Scanlines:
ld b, $7b
jr _continue_HDMATransfer
HDMATransfer_Wait127Scanlines:
ld b, $7f
_continue_HDMATransfer:
; a lot of waiting around for hardware registers
; [rHDMA1, rHDMA2] = hl & $fff0
ld a, h
ldh [rHDMA1], a
ld a, l
and $f0 ; high nybble
ldh [rHDMA2], a
; [rHDMA3, rHDMA4] = de & $1ff0
ld a, d
and $1f ; lower 5 bits
ldh [rHDMA3], a
ld a, e
and $f0 ; high nybble
ldh [rHDMA4], a
; e = c | %10000000
ld a, c
dec c
or $80
ld e, a
; d = b - c + 1
ld a, b
sub c
ld d, a
; while [rLY] >= d: pass
.ly_loop
ldh a, [rLY]
cp d
jr nc, .ly_loop
di
; while [rSTAT] & 3: pass
.rstat_loop_1
ldh a, [rSTAT]
and $3
jr nz, .rstat_loop_1
; while not [rSTAT] & 3: pass
.rstat_loop_2
ldh a, [rSTAT]
and $3
jr z, .rstat_loop_2
; load the 5th byte of HDMA
ld a, e
ldh [rHDMA5], a
; wait until rLY advances (c + 1) times
ldh a, [rLY]
inc c
ld hl, rLY
.final_ly_loop
cp [hl]
jr z, .final_ly_loop
ld a, [hl]
dec c
jr nz, .final_ly_loop
ld hl, rHDMA5
res 7, [hl]
ei
ret
_LoadHDMAParameters:
ld a, h
ldh [rHDMA1], a
ld a, l
ldh [rHDMA2], a
ldh a, [hBGMapAddress + 1]
and $1f
ldh [rHDMA3], a
ldh a, [hBGMapAddress]
ldh [rHDMA4], a
ret
PadTilemapForHDMATransfer:
ld c, " "
jr PadMapForHDMATransfer
PadAttrmapForHDMATransfer:
ld c, $0
PadMapForHDMATransfer:
; pad a 20x18 map to 32x18 for HDMA transfer
; back up the padding value in c to hMapObjectIndex
ldh a, [hMapObjectIndex]
push af
ld a, c
ldh [hMapObjectIndex], a
; for each row on the screen
ld c, SCREEN_HEIGHT
.loop1
; for each tile in the row
ld b, SCREEN_WIDTH
.loop2
; copy from de to hl
ld a, [de]
inc de
ld [hli], a
dec b
jr nz, .loop2
; load the original padding value of c into hl for 32 - 20 = 12 rows
ldh a, [hMapObjectIndex]
ld b, BG_MAP_WIDTH - SCREEN_WIDTH
.loop3
ld [hli], a
dec b
jr nz, .loop3
dec c
jr nz, .loop1
; restore the original value of hMapObjectIndex
pop af
ldh [hMapObjectIndex], a
ret
HDMATransfer2bpp::
; 2bpp when [rLCDC] & $80
; switch to WRAM bank 6
ldh a, [rSVBK]
push af
ld a, BANK(wScratchTilemap)
ldh [rSVBK], a
push bc
push hl
; Copy c tiles of the 2bpp from b:de to wScratchTilemap
ld a, b ; bank
ld l, c ; number of tiles
ld h, $0
; multiply by 16 (16 bytes of a 2bpp = 8 x 8 tile)
add hl, hl
add hl, hl
add hl, hl
add hl, hl
ld b, h
ld c, l
ld h, d ; address
ld l, e
ld de, wScratchTilemap
call FarCopyBytes
pop hl
pop bc
push bc
call DelayFrame
pop bc
ld d, h
ld e, l
ld hl, wScratchTilemap
call HDMATransfer_Wait127Scanlines
; restore the previous bank
pop af
ldh [rSVBK], a
ret
HDMATransfer1bpp::
; 1bpp when [rLCDC] & $80
.loop
ld a, c
cp $10
jp c, .bankswitch
jp z, .bankswitch
push bc
push hl
push de
ld c, $10
call .bankswitch
pop de
ld hl, $80
add hl, de
ld d, h
ld e, l
pop hl
lb bc, 1, 0
add hl, bc
pop bc
ld a, c
sub $10
ld c, a
jr .loop
.bankswitch
ldh a, [rSVBK]
push af
ld a, BANK(wScratchTilemap)
ldh [rSVBK], a
push bc
push hl
ld a, b
ld l, c
ld h, $0
add hl, hl ; multiply by 8
add hl, hl ; multiply by 8
add hl, hl ; multiply by 8
ld c, l
ld b, h
ld h, d
ld l, e
ld de, wScratchTilemap
call FarCopyBytesDouble_DoubleBankSwitch
pop hl
pop bc
push bc
call DelayFrame
pop bc
ld d, h
ld e, l
ld hl, wScratchTilemap
call HDMATransfer_Wait127Scanlines
pop af
ldh [rSVBK], a
ret
HDMATransfer_OnlyTopFourRows:
ld hl, .Function
jp CallInSafeGFXMode
.Function:
ld hl, wScratchTilemap
decoord 0, 0
call .Copy
ld hl, wScratchTilemap + $80
decoord 0, 0, wAttrmap
call .Copy
ld a, $1
ldh [rVBK], a
ld c, $8
ld hl, wScratchTilemap + $80
debgcoord 0, 0, vBGMap1
call HDMATransfer_Wait127Scanlines
ld a, $0
ldh [rVBK], a
ld c, $8
ld hl, wScratchTilemap
debgcoord 0, 0, vBGMap1
call HDMATransfer_Wait127Scanlines
ret
.Copy:
ld b, 4
.outer_loop
ld c, SCREEN_WIDTH
.inner_loop
ld a, [de]
ld [hli], a
inc de
dec c
jr nz, .inner_loop
ld a, l
add BG_MAP_WIDTH - SCREEN_WIDTH
ld l, a
ld a, h
adc 0
ld h, a
dec b
jr nz, .outer_loop
ret

144
engine/gfx/load_font.asm Normal file
View file

@ -0,0 +1,144 @@
INCLUDE "gfx/font.asm"
EnableHDMAForGraphics:
db FALSE
Get1bppOptionalHDMA: ; unreferenced
ld a, [EnableHDMAForGraphics]
and a
jp nz, Get1bppViaHDMA
jp Get1bpp
Get2bppOptionalHDMA: ; unreferenced
ld a, [EnableHDMAForGraphics]
and a
jp nz, Get2bppViaHDMA
jp Get2bpp
_LoadStandardFont::
ld de, Font
ld hl, vTiles1
lb bc, BANK(Font), 128 ; "A" to "9"
ldh a, [rLCDC]
bit rLCDC_ENABLE, a
jp z, Copy1bpp
ld de, Font
ld hl, vTiles1
lb bc, BANK(Font), 32 ; "A" to "]"
call Get1bppViaHDMA
ld de, Font + 32 * LEN_1BPP_TILE
ld hl, vTiles1 tile $20
lb bc, BANK(Font), 32 ; "a" to $bf
call Get1bppViaHDMA
ld de, Font + 64 * LEN_1BPP_TILE
ld hl, vTiles1 tile $40
lb bc, BANK(Font), 32 ; "Ä" to "←"
call Get1bppViaHDMA
ld de, Font + 96 * LEN_1BPP_TILE
ld hl, vTiles1 tile $60
lb bc, BANK(Font), 32 ; "'" to "9"
call Get1bppViaHDMA
ret
_LoadFontsExtra1::
ld de, FontsExtra_SolidBlackGFX
ld hl, vTiles2 tile "■" ; $60
lb bc, BANK(FontsExtra_SolidBlackGFX), 1
call Get1bppViaHDMA
ld de, PokegearPhoneIconGFX
ld hl, vTiles2 tile "☎" ; $62
lb bc, BANK(PokegearPhoneIconGFX), 1
call Get2bppViaHDMA
ld de, FontExtra + 3 tiles ; "<BOLD_D>"
ld hl, vTiles2 tile "<BOLD_D>"
lb bc, BANK(FontExtra), 22 ; "<BOLD_D>" to "ぉ"
call Get2bppViaHDMA
jr LoadFrame
_LoadFontsExtra2::
ld de, FontsExtra2_UpArrowGFX
ld hl, vTiles2 tile "▲" ; $61
ld b, BANK(FontsExtra2_UpArrowGFX)
ld c, 1
call Get2bppViaHDMA
ret
_LoadFontsBattleExtra::
ld de, FontBattleExtra
ld hl, vTiles2 tile $60
lb bc, BANK(FontBattleExtra), 25
call Get2bppViaHDMA
jr LoadFrame
LoadFrame:
ld a, [wTextboxFrame]
maskbits NUM_FRAMES
ld bc, TEXTBOX_FRAME_TILES * LEN_1BPP_TILE
ld hl, Frames
call AddNTimes
ld d, h
ld e, l
ld hl, vTiles2 tile "┌" ; $79
lb bc, BANK(Frames), TEXTBOX_FRAME_TILES ; "┌" to "┘"
call Get1bppViaHDMA
ld hl, vTiles2 tile " " ; $7f
ld de, TextboxSpaceGFX
lb bc, BANK(TextboxSpaceGFX), 1
call Get1bppViaHDMA
ret
LoadBattleFontsHPBar:
ld de, FontBattleExtra
ld hl, vTiles2 tile $60
lb bc, BANK(FontBattleExtra), 12
call Get2bppViaHDMA
ld hl, vTiles2 tile $70
ld de, FontBattleExtra + 16 tiles ; "<DO>"
lb bc, BANK(FontBattleExtra), 3 ; "<DO>" to "『"
call Get2bppViaHDMA
call LoadFrame
LoadHPBar:
ld de, EnemyHPBarBorderGFX
ld hl, vTiles2 tile $6c
lb bc, BANK(EnemyHPBarBorderGFX), 4
call Get1bppViaHDMA
ld de, HPExpBarBorderGFX
ld hl, vTiles2 tile $73
lb bc, BANK(HPExpBarBorderGFX), 6
call Get1bppViaHDMA
ld de, ExpBarGFX
ld hl, vTiles2 tile $55
lb bc, BANK(ExpBarGFX), 9
call Get2bppViaHDMA
ld de, MobilePhoneTilesGFX + 7 tiles ; mobile phone icon
ld hl, vTiles2 tile $5e
lb bc, BANK(MobilePhoneTilesGFX), 2
call Get2bppViaHDMA
ret
StatsScreen_LoadFont:
call _LoadFontsBattleExtra
ld de, EnemyHPBarBorderGFX
ld hl, vTiles2 tile $6c
lb bc, BANK(EnemyHPBarBorderGFX), 4
call Get1bppViaHDMA
ld de, HPExpBarBorderGFX
ld hl, vTiles2 tile $78
lb bc, BANK(HPExpBarBorderGFX), 1
call Get1bppViaHDMA
ld de, HPExpBarBorderGFX + 3 * LEN_1BPP_TILE
ld hl, vTiles2 tile $76
lb bc, BANK(HPExpBarBorderGFX), 2
call Get1bppViaHDMA
ld de, ExpBarGFX
ld hl, vTiles2 tile $55
lb bc, BANK(ExpBarGFX), 8
call Get2bppViaHDMA
LoadStatsScreenPageTilesGFX:
ld de, StatsScreenPageTilesGFX
ld hl, vTiles2 tile $31
lb bc, BANK(StatsScreenPageTilesGFX), 17
call Get2bppViaHDMA
ret

View file

@ -0,0 +1,16 @@
LoadOverworldFont::
ld de, .OverworldFontGFX
ld hl, vTiles1
lb bc, BANK(.OverworldFontGFX), $80
call Get2bpp
ld de, .OverworldFontSpaceGFX
ld hl, vTiles2 tile " "
lb bc, BANK(.OverworldFontSpaceGFX), 1
call Get2bpp
ret
.OverworldFontGFX:
INCBIN "gfx/font/overworld.2bpp"
.OverworldFontSpaceGFX:
INCBIN "gfx/font/overworld_space.2bpp"

468
engine/gfx/load_pics.asm Normal file
View file

@ -0,0 +1,468 @@
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 10 to get 0-25
ldh [hDividend + 3], a
xor a
ldh [hDividend], a
ldh [hDividend + 1], a
ldh [hDividend + 2], a
ld a, $ff / NUM_UNOWN + 1
ldh [hDivisor], a
ld b, 4
call Divide
; Increment to get 1-26
ldh a, [hQuotient + 3]
inc a
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

View file

@ -0,0 +1,28 @@
WriteOAMDMACodeToHRAM::
ld c, LOW(hTransferShadowOAM)
ld b, OAMDMACodeEnd - OAMDMACode
ld hl, OAMDMACode
.copy
ld a, [hli]
ldh [c], a
inc c
dec b
jr nz, .copy
ret
OAMDMACode:
; This code is defined in ROM, but
; copied to and called from HRAM.
LOAD "OAM DMA", HRAM
hTransferShadowOAM::
; initiate DMA
ld a, HIGH(wShadowOAM)
ldh [rDMA], a
; wait for DMA to finish
ld a, NUM_SPRITE_OAM_STRUCTS
.wait
dec a
jr nz, .wait
ret
ENDL
OAMDMACodeEnd:

453
engine/gfx/mon_icons.asm Normal file
View file

@ -0,0 +1,453 @@
LoadOverworldMonIcon:
ld a, e
call ReadMonMenuIcon
ld l, a
ld h, 0
add hl, hl
ld de, IconPointers
add hl, de
ld a, [hli]
ld e, a
ld d, [hl]
ld b, BANK(Icons)
ld c, 8
ret
LoadMenuMonIcon:
push hl
push de
push bc
call .LoadIcon
pop bc
pop de
pop hl
ret
.LoadIcon:
ld d, 0
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.Jumptable:
; entries correspond to MONICON_* constants
dw PartyMenu_InitAnimatedMonIcon ; MONICON_PARTYMENU
dw NamingScreen_InitAnimatedMonIcon ; MONICON_NAMINGSCREEN
dw MoveList_InitAnimatedMonIcon ; MONICON_MOVES
dw Trade_LoadMonIconGFX ; MONICON_TRADE
dw Mobile_InitAnimatedMonIcon ; MONICON_MOBILE1
dw Mobile_InitPartyMenuBGPal71 ; MONICON_MOBILE2
dw Unused_GetPartyMenuMonIcon ; MONICON_UNUSED
Unused_GetPartyMenuMonIcon:
call InitPartyMenuIcon
call .GetPartyMonItemGFX
call SetPartyMonIconAnimSpeed
ret
.GetPartyMonItemGFX:
push bc
ldh a, [hObjectStructIndex]
ld hl, wPartyMon1Item
ld bc, PARTYMON_STRUCT_LENGTH
call AddNTimes
pop bc
ld a, [hl]
and a
jr z, .no_item
push hl
push bc
ld d, a
callfar ItemIsMail
pop bc
pop hl
jr c, .not_mail
ld a, $06
jr .got_tile
.not_mail
ld a, $05
; fallthrough
.no_item
ld a, $04
.got_tile
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld [hl], a
ret
Mobile_InitAnimatedMonIcon:
call PartyMenu_InitAnimatedMonIcon
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
add hl, bc
ld a, SPRITE_ANIM_SEQ_NULL
ld [hl], a
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld a, 9 * 8
ld [hl], a
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
ld a, 9 * 8
ld [hl], a
ret
Mobile_InitPartyMenuBGPal71:
call InitPartyMenuIcon
call SetPartyMonIconAnimSpeed
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
add hl, bc
ld a, SPRITE_ANIM_SEQ_NULL
ld [hl], a
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld a, 3 * 8
ld [hl], a
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
ld a, 12 * 8
ld [hl], a
ld a, c
ld [wc608], a
ld a, b
ld [wc608 + 1], a
ret
PartyMenu_InitAnimatedMonIcon:
call InitPartyMenuIcon
call .SpawnItemIcon
call SetPartyMonIconAnimSpeed
ret
.SpawnItemIcon:
push bc
ldh a, [hObjectStructIndex]
ld hl, wPartyMon1Item
ld bc, PARTYMON_STRUCT_LENGTH
call AddNTimes
pop bc
ld a, [hl]
and a
ret z
push hl
push bc
ld d, a
callfar ItemIsMail
pop bc
pop hl
jr c, .mail
ld a, SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_ITEM
jr .okay
.mail
ld a, SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_MAIL
.okay
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld [hl], a
ret
InitPartyMenuIcon:
ld a, [wCurIconTile]
push af
ldh a, [hObjectStructIndex]
ld hl, wPartySpecies
ld e, a
ld d, 0
add hl, de
ld a, [hl]
call ReadMonMenuIcon
ld [wCurIcon], a
call GetMemIconGFX
ldh a, [hObjectStructIndex]
; y coord
add a
add a
add a
add a
add $1c
ld d, a
; x coord
ld e, $10
; type is partymon icon
ld a, SPRITE_ANIM_INDEX_PARTY_MON
call _InitSpriteAnimStruct
pop af
ld hl, SPRITEANIMSTRUCT_TILE_ID
add hl, bc
ld [hl], a
ret
SetPartyMonIconAnimSpeed:
push bc
ldh a, [hObjectStructIndex]
ld b, a
call .getspeed
ld a, b
pop bc
ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET
add hl, bc
ld [hl], a
rlca
rlca
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld [hl], a
ret
.getspeed
farcall PlacePartymonHPBar
call GetHPPal
ld e, d
ld d, 0
ld hl, .speeds
add hl, de
ld b, [hl]
ret
.speeds
db $00 ; HP_GREEN
db $40 ; HP_YELLOW
db $80 ; HP_RED
NamingScreen_InitAnimatedMonIcon:
ld a, [wTempIconSpecies]
call ReadMonMenuIcon
ld [wCurIcon], a
xor a
call GetIconGFX
depixel 4, 4, 4, 0
ld a, SPRITE_ANIM_INDEX_PARTY_MON
call _InitSpriteAnimStruct
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
add hl, bc
ld [hl], SPRITE_ANIM_SEQ_NULL
ret
MoveList_InitAnimatedMonIcon:
ld a, [wTempIconSpecies]
call ReadMonMenuIcon
ld [wCurIcon], a
xor a
call GetIconGFX
ld d, 3 * 8 + 2 ; depixel 3, 4, 2, 4
ld e, 4 * 8 + 4
ld a, SPRITE_ANIM_INDEX_PARTY_MON
call _InitSpriteAnimStruct
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
add hl, bc
ld [hl], SPRITE_ANIM_SEQ_NULL
ret
Trade_LoadMonIconGFX:
ld a, [wTempIconSpecies]
call ReadMonMenuIcon
ld [wCurIcon], a
ld a, $62
ld [wCurIconTile], a
call GetMemIconGFX
ret
GetSpeciesIcon:
; Load species icon into VRAM at tile a
push de
ld a, [wTempIconSpecies]
call ReadMonMenuIcon
ld [wCurIcon], a
pop de
ld a, e
call GetIconGFX
ret
FlyFunction_GetMonIcon:
push de
ld a, [wTempIconSpecies]
call ReadMonMenuIcon
ld [wCurIcon], a
pop de
ld a, e
call GetIcon_a
ret
GetMonIconDE: ; unreferenced
push de
ld a, [wTempIconSpecies]
call ReadMonMenuIcon
ld [wCurIcon], a
pop de
call GetIcon_de
ret
GetMemIconGFX:
ld a, [wCurIconTile]
GetIconGFX:
call GetIcon_a
ld de, 8 tiles
add hl, de
ld de, HeldItemIcons
lb bc, BANK(HeldItemIcons), 2
call GetGFXUnlessMobile
ld a, [wCurIconTile]
add 10
ld [wCurIconTile], a
ret
HeldItemIcons:
INCBIN "gfx/stats/mail.2bpp"
INCBIN "gfx/stats/item.2bpp"
GetIcon_de:
; Load icon graphics into VRAM starting from tile de.
ld l, e
ld h, d
jr GetIcon
GetIcon_a:
; Load icon graphics into VRAM starting from tile a.
ld l, a
ld h, 0
GetIcon:
; Load icon graphics into VRAM starting from tile hl.
; One tile is 16 bytes long.
rept 4
add hl, hl
endr
ld de, vTiles0
add hl, de
push hl
; The icons are contiguous, in order and of the same
; size, so the pointer table is somewhat redundant.
ld a, [wCurIcon]
push hl
ld l, a
ld h, 0
add hl, hl
ld de, IconPointers
add hl, de
ld a, [hli]
ld e, a
ld d, [hl]
pop hl
lb bc, BANK(Icons), 8
call GetGFXUnlessMobile
pop hl
ret
GetGFXUnlessMobile:
ld a, [wLinkMode]
cp LINK_MOBILE
jp nz, Request2bpp
jp Get2bppViaHDMA
FreezeMonIcons:
ld hl, wSpriteAnimationStructs
ld e, PARTY_LENGTH
ld a, [wMenuCursorY]
ld d, a
.loop
ld a, [hl]
and a
jr z, .next
cp d
jr z, .loadwithtwo
ld a, SPRITE_ANIM_SEQ_NULL
jr .ok
.loadwithtwo
ld a, SPRITE_ANIM_SEQ_PARTY_MON_SWITCH
.ok
push hl
ld c, l
ld b, h
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
add hl, bc
ld [hl], a
pop hl
.next
ld bc, $10
add hl, bc
dec e
jr nz, .loop
ret
UnfreezeMonIcons:
ld hl, wSpriteAnimationStructs
ld e, PARTY_LENGTH
.loop
ld a, [hl]
and a
jr z, .next
push hl
ld c, l
ld b, h
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
add hl, bc
ld [hl], SPRITE_ANIM_SEQ_PARTY_MON
pop hl
.next
ld bc, $10
add hl, bc
dec e
jr nz, .loop
ret
HoldSwitchmonIcon:
ld hl, wSpriteAnimationStructs
ld e, PARTY_LENGTH
ld a, [wSwitchMon]
ld d, a
.loop
ld a, [hl]
and a
jr z, .next
cp d
jr z, .is_switchmon
ld a, SPRITE_ANIM_SEQ_PARTY_MON_SELECTED
jr .join_back
.is_switchmon
ld a, SPRITE_ANIM_SEQ_PARTY_MON_SWITCH
.join_back
push hl
ld c, l
ld b, h
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
add hl, bc
ld [hl], a
pop hl
.next
ld bc, $10
add hl, bc
dec e
jr nz, .loop
ret
ReadMonMenuIcon:
cp EGG
jr z, .egg
call GetPokemonIndexFromID
ld de, MonMenuIcons - 1
add hl, de
ld a, [hl]
ret
.egg
ld a, ICON_EGG
ret
INCLUDE "data/pokemon/menu_icons.asm"
INCLUDE "data/icon_pointers.asm"
INCLUDE "gfx/icons.asm"

1098
engine/gfx/pic_animation.asm Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,55 @@
PlaceGraphic:
; Fill wBoxAlignment-aligned box width b height c
; with iterating tile starting from hGraphicStartTile at hl.
ld de, SCREEN_WIDTH
ld a, [wBoxAlignment]
and a
jr nz, .right
ldh a, [hGraphicStartTile]
.x1
push bc
push hl
.y1
ld [hl], a
add hl, de
inc a
dec c
jr nz, .y1
pop hl
inc hl
pop bc
dec b
jr nz, .x1
ret
.right
; Right-aligned.
push bc
ld b, 0
dec c
add hl, bc
pop bc
ldh a, [hGraphicStartTile]
.x2
push bc
push hl
.y2
ld [hl], a
add hl, de
inc a
dec c
jr nz, .y2
pop hl
dec hl
pop bc
dec b
jr nz, .x2
ret

218
engine/gfx/player_gfx.asm Normal file
View file

@ -0,0 +1,218 @@
BetaLoadPlayerTrainerClass: ; unreferenced
ld c, CAL
ld a, [wPlayerGender]
bit PLAYERGENDER_FEMALE_F, a
jr z, .got_class
ld c, KAREN ; not KRIS?
.got_class
ld a, c
ld [wTrainerClass], a
ret
MovePlayerPicRight:
hlcoord 6, 4
ld de, 1
jr MovePlayerPic
MovePlayerPicLeft:
hlcoord 13, 4
ld de, -1
; fallthrough
MovePlayerPic:
; Move player pic at hl by de * 7 tiles.
ld c, $8
.loop
push bc
push hl
push de
xor a
ldh [hBGMapMode], a
lb bc, 7, 7
predef PlaceGraphic
xor a
ldh [hBGMapThird], a
call WaitBGMap
call DelayFrame
pop de
pop hl
add hl, de
pop bc
dec c
ret z
push hl
push bc
ld a, l
sub e
ld l, a
ld a, h
sbc d
ld h, a
lb bc, 7, 7
call ClearBox
pop bc
pop hl
jr .loop
ShowPlayerNamingChoices:
ld hl, ChrisNameMenuHeader
ld a, [wPlayerGender]
bit PLAYERGENDER_FEMALE_F, a
jr z, .got_header
ld hl, KrisNameMenuHeader
.got_header
call LoadMenuHeader
call VerticalMenu
ld a, [wMenuCursorY]
dec a
call CopyNameFromMenu
call CloseWindow
ret
INCLUDE "data/player_names.asm"
GetPlayerNameArray: ; unreferenced
ld hl, wPlayerName
ld de, MalePlayerNameArray
ld a, [wPlayerGender]
bit PLAYERGENDER_FEMALE_F, a
jr z, .got_array
ld de, FemalePlayerNameArray
.got_array
call InitName
ret
GetPlayerIcon:
ld de, ChrisSpriteGFX
ld b, BANK(ChrisSpriteGFX)
ld a, [wPlayerGender]
bit PLAYERGENDER_FEMALE_F, a
jr z, .got_gfx
ld de, KrisSpriteGFX
ld b, BANK(KrisSpriteGFX)
.got_gfx
ret
GetCardPic:
ld hl, ChrisCardPic
ld a, [wPlayerGender]
bit PLAYERGENDER_FEMALE_F, a
jr z, .got_pic
ld hl, KrisCardPic
.got_pic
ld de, vTiles2 tile $00
ld bc, $23 tiles
ld a, BANK(ChrisCardPic) ; aka BANK(KrisCardPic)
call FarCopyBytes
ld hl, TrainerCardGFX
ld de, vTiles2 tile $23
ld bc, 6 tiles
ld a, BANK(TrainerCardGFX)
call FarCopyBytes
ret
ChrisCardPic:
INCBIN "gfx/trainer_card/chris_card.2bpp"
KrisCardPic:
INCBIN "gfx/trainer_card/kris_card.2bpp"
TrainerCardGFX:
INCBIN "gfx/trainer_card/trainer_card.2bpp"
GetPlayerBackpic:
ld a, [wPlayerGender]
bit PLAYERGENDER_FEMALE_F, a
jr z, GetChrisBackpic
call GetKrisBackpic
ret
GetChrisBackpic:
ld hl, ChrisBackpic
ld b, BANK(ChrisBackpic)
ld de, vTiles2 tile $31
ld c, 7 * 7
predef DecompressGet2bpp
ret
HOF_LoadTrainerFrontpic:
call WaitBGMap
xor a
ldh [hBGMapMode], a
; Get class
ld e, CHRIS
ld a, [wPlayerGender]
bit PLAYERGENDER_FEMALE_F, a
jr z, .got_class
ld e, KRIS
.got_class
ld a, e
ld [wTrainerClass], a
; Load pic
ld de, ChrisPic
ld a, [wPlayerGender]
bit PLAYERGENDER_FEMALE_F, a
jr z, .got_pic
ld de, KrisPic
.got_pic
ld hl, vTiles2
ld b, BANK(ChrisPic) ; aka BANK(KrisPic)
ld c, 7 * 7
call Get2bpp
call WaitBGMap
ld a, $1
ldh [hBGMapMode], a
ret
DrawIntroPlayerPic:
; Draw the player pic at (6,4).
; Get class
ld e, CHRIS
ld a, [wPlayerGender]
bit PLAYERGENDER_FEMALE_F, a
jr z, .got_class
ld e, KRIS
.got_class
ld a, e
ld [wTrainerClass], a
; Load pic
ld de, ChrisPic
ld a, [wPlayerGender]
bit PLAYERGENDER_FEMALE_F, a
jr z, .got_pic
ld de, KrisPic
.got_pic
ld hl, vTiles2
ld b, BANK(ChrisPic) ; aka BANK(KrisPic)
ld c, 7 * 7 ; dimensions
call Get2bpp
; Draw
xor a
ldh [hGraphicStartTile], a
hlcoord 6, 4
lb bc, 7, 7
predef PlaceGraphic
ret
ChrisPic:
INCBIN "gfx/player/chris.2bpp"
KrisPic:
INCBIN "gfx/player/kris.2bpp"
GetKrisBackpic:
; Kris's backpic is uncompressed.
ld de, KrisBackpic
ld hl, vTiles2 tile $31
lb bc, BANK(KrisBackpic), 7 * 7 ; dimensions
call Get2bpp
ret
KrisBackpic:
INCBIN "gfx/player/kris_back.2bpp"

572
engine/gfx/sgb_layouts.asm Normal file
View file

@ -0,0 +1,572 @@
LoadSGBLayout:
call CheckCGB
jp nz, LoadSGBLayoutCGB
ld a, b
cp SCGB_DEFAULT
jr nz, .not_default
ld a, [wDefaultSGBLayout]
.not_default
cp SCGB_PARTY_MENU_HP_BARS
jp z, SGB_ApplyPartyMenuHPPals
ld l, a
ld h, 0
add hl, hl
ld de, SGBLayoutJumptable
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ld de, _LoadSGBLayout_ReturnFromJumptable
push de
jp hl
SGBLayoutJumptable:
table_width 2, SGBLayoutJumptable
dw .SGB_BattleGrayscale
dw .SGB_BattleColors
dw .SGB_PokegearPals
dw .SGB_StatsScreenHPPals
dw .SGB_Pokedex
dw .SGB_SlotMachine
dw .SGB_BetaTitleScreen
dw .SGB_GSIntro
dw .SGB_Diploma
dw .SGB_MapPals
dw .SGB_PartyMenu
dw .SGB_Evolution
dw .SGB_GSTitleScreen
dw .SGB_Unused0D
dw .SGB_MoveList
dw .SGB_BetaPikachuMinigame
dw .SGB_PokedexSearchOption
dw .SGB_BetaPoker
dw .SGB_Pokepic
dw .SGB_MagnetTrain
dw .SGB_PackPals
dw .SGB_TrainerCard
dw .SGB_PokedexUnownMode
dw .SGB_BillsPC
dw .SGB_UnownPuzzle
dw .SGB_GamefreakLogo
dw .SGB_PlayerOrMonFrontpicPals
dw .SGB_TradeTube
dw .SGB_TrainerOrMonFrontpicPals
dw .SGB_MysteryGift
dw .SGB_Unused1E
assert_table_length NUM_SCGB_LAYOUTS
.SGB_BattleGrayscale:
ld hl, PalPacket_BattleGrayscale
ld de, BlkPacket_Battle
ret
.SGB_BattleColors:
ld hl, BlkPacket_Battle
call PushSGBPals
ld hl, PalPacket_Pal01
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
ld a, [wPlayerHPPal]
ld l, a
ld h, 0
add hl, hl
add hl, hl
ld de, HPBarPals
add hl, de
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 a, [wEnemyHPPal]
ld l, a
ld h, 0
add hl, hl
add hl, hl
ld de, HPBarPals
add hl, de
ld a, [hli]
ld [wSGBPals + 9], a
ld a, [hli]
ld [wSGBPals + 10], a
ld a, [hli]
ld [wSGBPals + 11], a
ld a, [hl]
ld [wSGBPals + 12], a
ld hl, PalPacket_Pal23
ld de, wSGBPals + PALPACKET_LENGTH
ld bc, PALPACKET_LENGTH
call CopyBytes
call GetBattlemonBackpicPalettePointer
ld a, [hli]
ld [wSGBPals + 19], a
ld a, [hli]
ld [wSGBPals + 20], a
ld a, [hli]
ld [wSGBPals + 21], a
ld a, [hl]
ld [wSGBPals + 22], a
call GetEnemyFrontpicPalettePointer
ld a, [hli]
ld [wSGBPals + 25], a
ld a, [hli]
ld [wSGBPals + 26], a
ld a, [hli]
ld [wSGBPals + 27], a
ld a, [hl]
ld [wSGBPals + 28], a
ld hl, wSGBPals
ld de, wSGBPals + PALPACKET_LENGTH
ld a, SCGB_BATTLE_COLORS
ld [wDefaultSGBLayout], a
ret
.SGB_MoveList:
ld hl, PalPacket_AllPal0
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
ld hl, wSGBPals + 1
ld [hl], $10
inc hl
inc hl
ld a, [wPlayerHPPal]
add PREDEFPAL_HP_GREEN
ld [hl], a
ld hl, wSGBPals
ld de, BlkPacket_MoveList
ret
.SGB_PokegearPals:
ld hl, PalPacket_Pokegear
ld de, BlkPacket_AllPal0
ret
.SGB_StatsScreenHPPals:
ld hl, PalPacket_Pal01
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
ld a, [wCurHPPal]
ld l, a
ld h, 0
add hl, hl
add hl, hl
ld de, HPBarPals
add hl, de
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 a, [wCurPartySpecies]
ld bc, wTempMonDVs
call GetPlayerOrMonPalettePointer
ld a, [hli]
ld [wSGBPals + 9], a
ld a, [hli]
ld [wSGBPals + 10], a
ld a, [hli]
ld [wSGBPals + 11], a
ld a, [hl]
ld [wSGBPals + 12], a
ld hl, wSGBPals
ld de, BlkPacket_StatsScreen
ret
.SGB_PartyMenu:
ld hl, PalPacket_PartyMenu
ld de, wSGBPals + 1
ret
.SGB_Pokedex:
ld hl, PalPacket_Pal01
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
ld hl, wSGBPals + 3
ld [hl], LOW(palred 31 + palgreen 20 + palblue 10)
inc hl
ld [hl], HIGH(palred 31 + palgreen 20 + palblue 10)
inc hl
ld [hl], LOW(palred 26 + palgreen 10 + palblue 6)
inc hl
ld [hl], HIGH(palred 26 + palgreen 10 + palblue 6)
ld a, [wCurPartySpecies]
call GetMonPalettePointer
ld a, [hli]
ld [wSGBPals + 9], a
ld a, [hli]
ld [wSGBPals + 10], a
ld a, [hli]
ld [wSGBPals + 11], a
ld a, [hl]
ld [wSGBPals + 12], a
ld hl, wSGBPals
ld de, BlkPacket_Pokedex_PC
ret
.SGB_BillsPC:
ld hl, PalPacket_Pal01
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
ld hl, wSGBPals + 3
ld [hl], LOW(palred 31 + palgreen 20 + palblue 10)
inc hl
ld [hl], HIGH(palred 31 + palgreen 20 + palblue 10)
inc hl
ld [hl], LOW(palred 26 + palgreen 10 + palblue 6)
inc hl
ld [hl], HIGH(palred 26 + palgreen 10 + palblue 6)
ld a, [wCurPartySpecies]
ld bc, wTempMonDVs
call GetPlayerOrMonPalettePointer
ld a, [hli]
ld [wSGBPals + 9], a
ld a, [hli]
ld [wSGBPals + 10], a
ld a, [hli]
ld [wSGBPals + 11], a
ld a, [hl]
ld [wSGBPals + 12], a
ld hl, wSGBPals
ld de, BlkPacket_Pokedex_PC
ret
.SGB_PokedexUnownMode:
call .SGB_Pokedex
ld de, BlkPacket_PokedexUnownMode
ret
.SGB_PokedexSearchOption:
ld hl, PalPacket_Pal01
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
ld hl, wSGBPals + 3
ld [hl], LOW(palred 31 + palgreen 20 + palblue 10)
inc hl
ld [hl], HIGH(palred 31 + palgreen 20 + palblue 10)
inc hl
ld [hl], LOW(palred 26 + palgreen 10 + palblue 6)
inc hl
ld [hl], HIGH(palred 26 + palgreen 10 + palblue 6)
ld hl, wSGBPals
ld de, BlkPacket_AllPal0
ret
.SGB_PackPals:
ld hl, PalPacket_Pack
ld de, BlkPacket_AllPal0
ret
.SGB_SlotMachine:
ld hl, PalPacket_SlotMachine
ld de, BlkPacket_SlotMachine
ret
.SGB_BetaTitleScreen:
ld hl, PalPacket_BetaTitleScreen
ld de, BlkPacket_BetaTitleScreen
ret
.SGB_Diploma:
.SGB_MysteryGift:
ld hl, PalPacket_Diploma
ld de, BlkPacket_AllPal0
ret
.SGB_GSIntro:
ld b, 0
ld hl, .BlkPacketTable_GSIntro
rept 4
add hl, bc
endr
ld e, [hl]
inc hl
ld d, [hl]
inc hl
ld a, [hli]
ld h, [hl]
ld l, a
ret
.BlkPacketTable_GSIntro:
dw BlkPacket_AllPal0, PalPacket_GSIntroShellderLapras
dw BlkPacket_GSIntroJigglypuffPikachu, PalPacket_GSIntroJigglypuffPikachu
dw BlkPacket_AllPal0, PalPacket_GSIntroStartersTransition
.SGB_GSTitleScreen:
ld hl, PalPacket_GSTitleScreen
ld de, BlkPacket_GSTitleScreen
ld a, SCGB_DIPLOMA
ld [wDefaultSGBLayout], a
ret
.SGB_MagnetTrain:
ld hl, PalPacket_MagnetTrain
ld de, BlkPacket_MagnetTrain
ret
.SGB_BetaPikachuMinigame:
ld hl, PalPacket_BetaPikachuMinigame
ld de, BlkPacket_AllPal0
ret
.SGB_BetaPoker:
ld hl, BlkPacket_AllPal0
ld de, wBetaPokerSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
ld hl, PalPacket_BetaPoker
ld de, BlkPacket_AllPal0
ret
.SGB_MapPals:
ld hl, PalPacket_AllPal0
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
call .GetMapPalsIndex
ld hl, wSGBPals + 1
ld [hld], a
ld de, BlkPacket_AllPal0
ld a, SCGB_MAPPALS
ld [wDefaultSGBLayout], a
ret
.SGB_Evolution:
push bc
ld hl, PalPacket_Pal01
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
pop bc
ld a, c
and a
jr z, .partymon
; Egg
ld hl, wSGBPals + 3
ld [hl], LOW(palred 7 + palgreen 7 + palblue 7)
inc hl
ld [hl], HIGH(palred 7 + palgreen 7 + palblue 7)
inc hl
ld [hl], LOW(palred 2 + palgreen 3 + palblue 3)
inc hl
ld [hl], HIGH(palred 2 + palgreen 3 + palblue 3)
jr .done
.partymon
ld hl, wPartyMon1DVs
ld bc, PARTYMON_STRUCT_LENGTH
ld a, [wCurPartyMon]
call AddNTimes
ld c, l
ld b, h
ld a, [wPlayerHPPal]
call GetPlayerOrMonPalettePointer
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
.done
ld hl, wSGBPals
ld de, BlkPacket_AllPal0
ret
.SGB_Unused0D:
.SGB_TrainerCard:
ld hl, PalPacket_Diploma
ld de, BlkPacket_AllPal0
ret
.SGB_UnownPuzzle:
ld hl, PalPacket_UnownPuzzle
ld de, BlkPacket_AllPal0
ret
.SGB_Pokepic:
ld hl, PalPacket_AllPal0
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
ld hl, BlkPacket_AllPal0
ld de, wSGBPals + PALPACKET_LENGTH
ld bc, PALPACKET_LENGTH
call CopyBytes
call .GetMapPalsIndex
ld hl, wSGBPals + 1
ld [hl], a
ld hl, wSGBPals + 3
ld [hl], $2e
ld hl, wSGBPals + $13
ld a, 5
ld [hli], a
ld a, [wMenuBorderLeftCoord]
ld [hli], a
ld a, [wMenuBorderTopCoord]
ld [hli], a
ld a, [wMenuBorderRightCoord]
ld [hli], a
ld a, [wMenuBorderBottomCoord]
ld [hl], a
ld hl, wSGBPals
ld de, wSGBPals + PALPACKET_LENGTH
ret
.SGB_Unused1E:
ld hl, PalPacket_Pal01
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
ld a, [wCurPartySpecies]
call GetPokemonIndexFromID
add hl, hl
add hl, hl
add hl, hl
ld de, PokemonPalettes
add hl, de
ld a, [wUnusedSGB1eColorOffset]
and 3
sla a
sla a
ld c, a
ld b, 0
add hl, bc
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
ld de, BlkPacket_AllPal0
ret
.SGB_GamefreakLogo:
ld hl, PalPacket_GamefreakLogo
ld de, BlkPacket_AllPal0
ret
.SGB_PlayerOrMonFrontpicPals:
ld hl, PalPacket_Pal01
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
ld a, [wCurPartySpecies]
ld bc, wTempMonDVs
call GetPlayerOrMonPalettePointer
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
ld de, BlkPacket_AllPal0
ret
.SGB_TradeTube:
ld hl, PalPacket_TradeTube
ld de, BlkPacket_AllPal0
ret
.SGB_TrainerOrMonFrontpicPals:
ld hl, PalPacket_Pal01
ld de, wSGBPals
ld bc, PALPACKET_LENGTH
call CopyBytes
ld a, [wCurPartySpecies]
ld bc, wTempMonDVs
call GetFrontpicPalettePointer
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
ld de, BlkPacket_AllPal0
ret
.GetMapPalsIndex:
ld a, [wTimeOfDayPal]
cp NITE_F
jr c, .morn_day
ld a, PREDEFPAL_NITE
ret
.morn_day
ld a, [wEnvironment]
cp ROUTE
jr z, .route
cp CAVE
jr z, .cave
cp DUNGEON
jr z, .cave
cp ENVIRONMENT_5
jr z, .env5
cp GATE
jr z, .gate
ld a, [wMapGroup]
ld e, a
ld d, 0
ld hl, MapGroupRoofSGBPalInds
add hl, de
ld a, [hl]
ret
.route
ld a, PREDEFPAL_ROUTES
ret
.cave
ld a, PREDEFPAL_DUNGEONS
ret
.env5
ld a, PREDEFPAL_VERMILION
ret
.gate
ld a, PREDEFPAL_PEWTER
ret
INCLUDE "data/maps/sgb_roof_pal_inds.asm"
_LoadSGBLayout_ReturnFromJumptable:
push de
call PushSGBPals
pop hl
jp PushSGBPals

877
engine/gfx/sprite_anims.asm Normal file
View file

@ -0,0 +1,877 @@
DoAnimFrame:
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
add hl, bc
ld e, [hl]
ld d, 0
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.Jumptable:
; entries correspond to SPRITE_ANIM_SEQ_* constants (see constants/sprite_anim_constants.asm)
table_width 2, DoAnimFrame.Jumptable
dw AnimSeq_Null
dw AnimSeq_PartyMon
dw AnimSeq_PartyMonSwitch
dw AnimSeq_PartyMonSelected
dw AnimSeq_GSTitleTrail
dw AnimSeq_NamingScreenCursor
dw AnimSeq_GameFreakLogo
dw AnimSeq_GSGameFreakLogoStar
dw AnimSeq_GSGameFreakLogoSparkle
dw AnimSeq_SlotsGolem
dw AnimSeq_SlotsChansey
dw AnimSeq_SlotsChanseyEgg
dw AnimSeq_MailCursor
dw AnimSeq_UnusedCursor
dw AnimSeq_MemoryGameCursor
dw AnimSeq_PokegearArrow
dw AnimSeq_TradePokeBall
dw AnimSeq_TradeTubeBulge
dw AnimSeq_TrademonInTube
dw AnimSeq_RevealNewMon
dw AnimSeq_RadioTuningKnob
dw AnimSeq_CutLeaves
dw AnimSeq_FlyFrom
dw AnimSeq_FlyLeaf
dw AnimSeq_FlyTo
dw AnimSeq_GSIntroHoOhLugia
dw AnimSeq_EZChatCursor
dw AnimSeq_MobileTradeSentPulse
dw AnimSeq_MobileTradeOTPulse
dw AnimSeq_IntroSuicune
dw AnimSeq_IntroPichuWooper
dw AnimSeq_Celebi
dw AnimSeq_IntroUnown
dw AnimSeq_IntroUnownF
dw AnimSeq_IntroSuicuneAway
assert_table_length NUM_SPRITE_ANIM_SEQS
AnimSeq_Null:
ret
AnimSeq_PartyMon:
ld a, [wMenuCursorY]
ld hl, SPRITEANIMSTRUCT_INDEX
add hl, bc
cp [hl]
jr z, AnimSeq_PartyMonSwitch
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld [hl], 8 * 2
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], 0
ret
AnimSeq_PartyMonSwitch:
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld [hl], 8 * 3
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld d, a
inc [hl]
and $f
ret nz
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld e, [hl]
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld a, d
and $10 ; bit 4
jr z, .load_zero
ld a, e
and a
jr z, .load_minus_two
cp $1
jr z, .load_minus_one
.load_zero
xor a
ld [hl], a
ret
.load_minus_one
ld a, -1
ld [hl], a
ret
.load_minus_two
ld a, -2
ld [hl], a
ret
AnimSeq_PartyMonSelected:
ld a, [wMenuCursorY]
ld hl, SPRITEANIMSTRUCT_INDEX
add hl, bc
cp [hl]
jr z, .three_offset_right
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld [hl], 8 * 2
ret
.three_offset_right
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld [hl], 8 * 3
ret
AnimSeq_GSTitleTrail:
call AnimSeqs_AnonJumptable
jp hl
.anon_dw
dw .zero
dw .one
.zero
call AnimSeqs_IncAnonJumptableIndex
ld hl, SPRITEANIMSTRUCT_INDEX
add hl, bc
ld a, [hl]
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
and $3
ld [hl], a
inc [hl]
swap a
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld [hl], a
.one
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $a4
jr nc, .delete
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
add 4
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld [hl], a
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
inc [hl]
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
sla a
sla a
ld d, 2
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
add 3
ld [hl], a
call AnimSeqs_Sine
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ret
.delete
call DeinitializeSprite
ret
AnimSeq_GSIntroHoOhLugia:
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc a
ld [hl], a
ld d, 2
call AnimSeqs_Sine
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ret
AnimSeq_NamingScreenCursor:
callfar NamingScreen_AnimateCursor
ret
AnimSeq_MailCursor:
callfar ComposeMail_AnimateCursor
ret
AnimSeq_GameFreakLogo:
callfar GameFreakLogoSpriteAnim
ret
AnimSeq_GSGameFreakLogoStar:
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
and a
jr z, .delete
dec [hl]
dec [hl]
ld d, a
and $1f
jr nz, .stay
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
dec [hl]
.stay
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld a, [hl]
push af
push de
call AnimSeqs_Sine
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call AnimSeqs_Cosine
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
add [hl]
ld [hl], a
ret
.delete
ld a, 1
ld [wIntroSceneFrameCounter], a
call DeinitializeSprite
ret
AnimSeq_GSGameFreakLogoSparkle:
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hli]
or [hl]
jr z, .delete
ld hl, SPRITEANIMSTRUCT_VAR4
add hl, bc
ld d, [hl]
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld a, [hl]
push af
push de
call AnimSeqs_Sine
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call AnimSeqs_Cosine
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld e, [hl]
inc hl
ld d, [hl]
ld hl, SPRITEANIMSTRUCT_VAR3
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
add hl, de
ld e, l
ld d, h
ld hl, SPRITEANIMSTRUCT_VAR3
add hl, bc
ld [hl], e
inc hl
ld [hl], d
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld de, -$10
add hl, de
ld e, l
ld d, h
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld [hl], e
inc hl
ld [hl], d
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld a, [hl]
xor $20
ld [hl], a
ret
.delete
call DeinitializeSprite
ret
AnimSeq_SlotsGolem:
callfar Slots_AnimateGolem
ret
AnimSeq_SlotsChansey:
callfar Slots_AnimateChansey
ld hl, wSlotsDelay
ld a, [hl]
cp $2
ret nz
ld [hl], $3
ld a, SPRITE_ANIM_FRAMESET_SLOTS_CHANSEY_2
call _ReinitSpriteAnimFrame
ret
AnimSeq_SlotsChanseyEgg:
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld a, [hl]
dec [hl]
ld e, a
and $1
jr z, .move_vertical
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp 15 * 8
jr c, .move_right
call DeinitializeSprite
ld a, $4
ld [wSlotsDelay], a
ld de, SFX_PLACE_PUZZLE_PIECE_DOWN
call PlaySFX
ret
.move_right
inc [hl]
.move_vertical
ld a, e
ld d, 32
call AnimSeqs_Sine
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ret
AnimSeq_UnusedCursor:
callfar UnusedCursor_InterpretJoypad_AnimateCursor
ret
AnimSeq_PokegearArrow:
callfar AnimatePokegearModeIndicatorArrow
ret
AnimSeq_MemoryGameCursor:
callfar MemoryGame_InterpretJoypad_AnimateCursor
ret
AnimSeq_TradePokeBall:
call AnimSeqs_AnonJumptable
jp hl
.anon_dw
dw .zero
dw .one
dw .two
dw .three
dw .four
dw .delete
.zero
ld a, SPRITE_ANIM_FRAMESET_TRADE_POKE_BALL_WOBBLE
call _ReinitSpriteAnimFrame
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld [hl], 2 ; .two
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $20
ret
.two
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
and a
jr z, .next
dec [hl]
ret
.next
call AnimSeqs_IncAnonJumptableIndex
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $40
.three
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
cp 48
jr c, .done
dec [hl]
ld d, 40
call AnimSeqs_Sine
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ret
.done
ld de, SFX_GOT_SAFARI_BALLS
call PlaySFX
jr .delete
.one
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld [hl], $4
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $30
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld [hl], $24
ret
.four
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
and a
jr z, .done2
ld d, a
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
call Sprites_Sine
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
inc [hl]
ld a, [hl]
and $3f
ret nz
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $20
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
sub $c
ld [hl], a
ld de, SFX_SWITCH_POKEMON
call PlaySFX
ret
.done2
xor a
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
call AnimSeqs_IncAnonJumptableIndex
ret
.delete
call DeinitializeSprite
ret
AnimSeq_TradeTubeBulge:
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
inc [hl]
inc [hl]
cp $b0
jr nc, .delete
and $3
ret nz
ld de, SFX_POKEBALLS_PLACED_ON_TABLE
call PlaySFX
ret
.delete
call DeinitializeSprite
ret
AnimSeq_TrademonInTube:
callfar TradeAnim_AnimateTrademonInTube
ret
AnimSeq_RevealNewMon:
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
cp $80
jr nc, .finish_EggShell
ld d, a
add 8
ld [hl], a
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld a, [hl]
xor $20
ld [hl], a
push af
push de
call AnimSeqs_Sine
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call AnimSeqs_Cosine
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
.finish_EggShell
call DeinitializeSprite
ret
AnimSeq_RadioTuningKnob:
callfar AnimateTuningKnob
ret
AnimSeq_CutLeaves:
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld e, [hl]
inc hl
ld d, [hl]
ld hl, $80
add hl, de
ld e, l
ld d, h
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld [hl], e
inc hl
ld [hl], d
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc [hl]
inc [hl]
inc [hl]
push af
push de
call AnimSeqs_Sine
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call AnimSeqs_Cosine
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
AnimSeq_FlyFrom:
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
and a
ret z
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
inc [hl]
cp $40
ret c
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
dec [hl]
dec [hl]
ld hl, SPRITEANIMSTRUCT_VAR4
add hl, bc
ld a, [hl]
ld d, a
cp $40
jr nc, .skip
add 8
ld [hl], a
.skip
ld hl, SPRITEANIMSTRUCT_VAR3
add hl, bc
ld a, [hl]
inc [hl]
call AnimSeqs_Cosine
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
AnimSeq_FlyLeaf:
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp -9 * 8
jr nc, .delete_leaf
inc [hl]
inc [hl]
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
dec [hl]
ld d, $40
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc [hl]
call AnimSeqs_Cosine
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
.delete_leaf
call DeinitializeSprite
ret
AnimSeq_FlyTo:
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
cp 10 * 8 + 4
ret z
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
inc [hl]
inc [hl]
ld hl, SPRITEANIMSTRUCT_VAR4
add hl, bc
ld a, [hl]
ld d, a
and a
jr z, .stay
sub $2
ld [hl], a
.stay
ld hl, SPRITEANIMSTRUCT_VAR3
add hl, bc
ld a, [hl]
inc [hl]
call AnimSeqs_Cosine
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
AnimSeq_MobileTradeSentPulse:
farcall MobileTradeAnim_AnimateSentPulse
ret
AnimSeq_MobileTradeOTPulse:
farcall MobileTradeAnim_AnimateOTPulse
ret
AnimSeq_IntroSuicune:
ld a, [wIntroSceneTimer]
and a
jr nz, .continue
ret
.continue
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], $0
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
add 2
ld [hl], a
xor $ff
inc a
ld d, 32
call AnimSeqs_Sine
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld a, SPRITE_ANIM_FRAMESET_INTRO_SUICUNE_2
call _ReinitSpriteAnimFrame
ret
AnimSeq_IntroPichuWooper:
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
cp 20
jr nc, .done
add 2
ld [hl], a
xor $ff
inc a
ld d, 32
call AnimSeqs_Sine
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
.done
ret
AnimSeq_IntroUnown:
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld d, [hl]
inc [hl]
inc [hl]
inc [hl]
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
push af
push de
call AnimSeqs_Sine
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call AnimSeqs_Cosine
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
AnimSeq_IntroUnownF:
ld a, [wSlotsDelay]
cp $40
ret nz
ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_F_2
call _ReinitSpriteAnimFrame
ret
AnimSeq_IntroSuicuneAway:
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
add 16
ld [hl], a
ret
AnimSeq_EZChatCursor:
farcall AnimateEZChatCursor
ret
AnimSeq_Celebi:
farcall UpdateCelebiPosition
ret
AnimSeqs_AnonJumptable:
ld hl, sp+0
ld e, [hl]
inc hl
ld d, [hl]
inc de
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld l, [hl]
ld h, 0
add hl, hl
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ret
AnimSeqs_IncAnonJumptableIndex:
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
inc [hl]
ret
AnimSeqs_Sine:
call Sprites_Sine
ret
AnimSeqs_Cosine:
call Sprites_Cosine
ret

633
engine/gfx/sprites.asm Normal file
View file

@ -0,0 +1,633 @@
ClearSpriteAnims:
ld hl, wSpriteAnimData
ld bc, wSpriteAnimDataEnd - wSpriteAnimData
.loop
ld [hl], 0
inc hl
dec bc
ld a, c
or b
jr nz, .loop
ret
PlaySpriteAnimationsAndDelayFrame:
call PlaySpriteAnimations
call DelayFrame
ret
PlaySpriteAnimations:
push hl
push de
push bc
push af
ld a, LOW(wShadowOAM)
ld [wCurSpriteOAMAddr], a
call DoNextFrameForAllSprites
pop af
pop bc
pop de
pop hl
ret
DoNextFrameForAllSprites:
ld hl, wSpriteAnimationStructs
ld e, NUM_SPRITE_ANIM_STRUCTS
.loop
ld a, [hl]
and a
jr z, .next ; This struct is deinitialized.
ld c, l
ld b, h
push hl
push de
call DoAnimFrame ; Uses a massive dw
call UpdateAnimFrame
pop de
pop hl
jr c, .done
.next
ld bc, SPRITEANIMSTRUCT_LENGTH
add hl, bc
dec e
jr nz, .loop
ld a, [wCurSpriteOAMAddr]
ld l, a
ld h, HIGH(wShadowOAM)
.loop2 ; Clear (wShadowOAM + [wCurSpriteOAMAddr] --> wShadowOAMEnd)
ld a, l
cp LOW(wShadowOAMEnd)
jr nc, .done
xor a
ld [hli], a
jr .loop2
.done
ret
DoNextFrameForFirst16Sprites:
ld hl, wSpriteAnimationStructs
ld e, NUM_SPRITE_ANIM_STRUCTS
.loop
ld a, [hl]
and a
jr z, .next
ld c, l
ld b, h
push hl
push de
call DoAnimFrame ; Uses a massive dw
call UpdateAnimFrame
pop de
pop hl
jr c, .done
.next
ld bc, SPRITEANIMSTRUCT_LENGTH
add hl, bc
dec e
jr nz, .loop
ld a, [wCurSpriteOAMAddr]
ld l, a
ld h, HIGH(wShadowOAMSprite16)
.loop2 ; Clear (wShadowOAM + [wCurSpriteOAMAddr] --> Sprites + $40)
ld a, l
cp LOW(wShadowOAMSprite16)
jr nc, .done
xor a
ld [hli], a
jr .loop2
.done
ret
_InitSpriteAnimStruct::
; Initialize animation a at pixel x=e, y=d
; Find if there's any room in the wSpriteAnimationStructs array, which is 10x16
push de
push af
ld hl, wSpriteAnimationStructs
ld e, NUM_SPRITE_ANIM_STRUCTS
.loop
ld a, [hl]
and a
jr z, .found
ld bc, SPRITEANIMSTRUCT_LENGTH
add hl, bc
dec e
jr nz, .loop
; We've reached the end. There is no more room here.
; Return carry.
pop af
pop de
scf
ret
.found
; Back up the structure address to bc.
ld c, l
ld b, h
; Increment [wSpriteAnimCount], skipping a 0 value.
ld hl, wSpriteAnimCount
inc [hl]
ld a, [hl]
and a
jr nz, .nonzero
inc [hl]
.nonzero
; Get row a of SpriteAnimSeqData, copy the pointer into de
pop af
ld e, a
ld d, 0
ld hl, SpriteAnimSeqData
add hl, de
add hl, de
add hl, de
ld e, l
ld d, h
; Set hl to the first field (field 0) in the current structure.
ld hl, SPRITEANIMSTRUCT_INDEX
add hl, bc
; Load the index.
ld a, [wSpriteAnimCount]
ld [hli], a ; SPRITEANIMSTRUCT_INDEX
; Copy the table entry to the next two fields.
ld a, [de]
ld [hli], a ; SPRITEANIMSTRUCT_FRAMESET_ID
inc de
ld a, [de]
ld [hli], a ; SPRITEANIMSTRUCT_ANIM_SEQ_ID
inc de
; Look up the third field in the wSpriteAnimDict mapping.
; Take the mapped value and load it in.
ld a, [de]
call GetSpriteAnimVTile
ld [hli], a ; SPRITEANIMSTRUCT_TILE_ID
pop de
; Set hl to field 4 (X coordinate). Kinda pointless, because we're presumably already here.
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
; Load the original value of de into here.
ld a, e
ld [hli], a ; SPRITEANIMSTRUCT_XCOORD
ld a, d
ld [hli], a ; SPRITEANIMSTRUCT_YCOORD
; load 0 into the next four fields
xor a
ld [hli], a ; SPRITEANIMSTRUCT_XOFFSET
ld [hli], a ; SPRITEANIMSTRUCT_YOFFSET
xor a
ld [hli], a ; SPRITEANIMSTRUCT_DURATION
ld [hli], a ; SPRITEANIMSTRUCT_DURATIONOFFSET
; load -1 into the next field
dec a
ld [hli], a ; SPRITEANIMSTRUCT_FRAME
; load 0 into the last five fields
xor a
ld [hli], a ; SPRITEANIMSTRUCT_JUMPTABLE_INDEX
ld [hli], a ; SPRITEANIMSTRUCT_VAR1
ld [hli], a ; SPRITEANIMSTRUCT_VAR2
ld [hli], a ; SPRITEANIMSTRUCT_VAR3
ld [hl], a ; SPRITEANIMSTRUCT_VAR4
; back up the address of the first field to wSpriteAnimAddrBackup
ld a, c
ld [wSpriteAnimAddrBackup], a
ld a, b
ld [wSpriteAnimAddrBackup + 1], a
ret
DeinitializeSprite:
; Clear the index field of the struct in bc.
ld hl, SPRITEANIMSTRUCT_INDEX
add hl, bc
ld [hl], 0
ret
DeinitializeAllSprites:
; Clear the index field of every struct in the wSpriteAnimationStructs array.
ld hl, wSpriteAnimationStructs
ld bc, SPRITEANIMSTRUCT_LENGTH
ld e, NUM_SPRITE_ANIM_STRUCTS
xor a
.loop
ld [hl], a
add hl, bc
dec e
jr nz, .loop
ret
UpdateAnimFrame:
call InitSpriteAnimBuffer ; init WRAM
call GetSpriteAnimFrame ; read from a memory array
cp oamwait_command
jr z, .done
cp oamdelete_command
jr z, .delete
call GetFrameOAMPointer
; add byte to [wCurAnimVTile]
ld a, [wCurAnimVTile]
add [hl]
ld [wCurAnimVTile], a
inc hl
; load pointer into hl
ld a, [hli]
ld h, [hl]
ld l, a
push bc
ld a, [wCurSpriteOAMAddr]
ld e, a
ld d, HIGH(wShadowOAM)
ld a, [hli]
ld c, a ; number of objects
.loop
; first byte: y (px)
; [de] = [wCurAnimYCoord] + [wCurAnimYOffset] + [wGlobalAnimYOffset] + AddOrSubtractY([hl])
ld a, [wCurAnimYCoord]
ld b, a
ld a, [wCurAnimYOffset]
add b
ld b, a
ld a, [wGlobalAnimYOffset]
add b
ld b, a
call AddOrSubtractY
add b
ld [de], a
inc hl
inc de
; second byte: x (px)
; [de] = [wCurAnimXCoord] + [wCurAnimXOffset] + [wGlobalAnimXOffset] + AddOrSubtractX([hl])
ld a, [wCurAnimXCoord]
ld b, a
ld a, [wCurAnimXOffset]
add b
ld b, a
ld a, [wGlobalAnimXOffset]
add b
ld b, a
call AddOrSubtractX
add b
ld [de], a
inc hl
inc de
; third byte: vtile
; [de] = [wCurAnimVTile] + [hl]
ld a, [wCurAnimVTile]
add [hl]
ld [de], a
inc hl
inc de
; fourth byte: attributes
; [de] = GetSpriteOAMAttr([hl])
call GetSpriteOAMAttr
ld [de], a
inc hl
inc de
ld a, e
ld [wCurSpriteOAMAddr], a
cp LOW(wShadowOAMEnd)
jr nc, .reached_the_end
dec c
jr nz, .loop
pop bc
jr .done
.delete
; Removes the object from the screen, as opposed to `oamend` which just stops all motion
call DeinitializeSprite
.done
and a
ret
.reached_the_end
pop bc
scf
ret
AddOrSubtractY:
push hl
ld a, [hl]
ld hl, wCurSpriteOAMFlags
bit OAM_Y_FLIP, [hl]
jr z, .ok
; -8 - a
add 8
xor $ff
inc a
.ok
pop hl
ret
AddOrSubtractX:
push hl
ld a, [hl]
ld hl, wCurSpriteOAMFlags
bit OAM_X_FLIP, [hl]
jr z, .ok
; -8 - a
add 8
xor $ff
inc a
.ok
pop hl
ret
GetSpriteOAMAttr:
ld a, [wCurSpriteOAMFlags]
ld b, a
ld a, [hl]
xor b
and PRIORITY | Y_FLIP | X_FLIP
ld b, a
ld a, [hl]
and ~(PRIORITY | Y_FLIP | X_FLIP)
or b
ret
InitSpriteAnimBuffer:
xor a
ld [wCurSpriteOAMFlags], a
ld hl, SPRITEANIMSTRUCT_TILE_ID
add hl, bc
ld a, [hli]
ld [wCurAnimVTile], a
ld a, [hli]
ld [wCurAnimXCoord], a
ld a, [hli]
ld [wCurAnimYCoord], a
ld a, [hli]
ld [wCurAnimXOffset], a
ld a, [hli]
ld [wCurAnimYOffset], a
ret
GetSpriteAnimVTile:
; a = wSpriteAnimDict[a] if a in wSpriteAnimDict else vtile offset $00
push hl
push bc
ld hl, wSpriteAnimDict
ld b, a
ld c, NUM_SPRITEANIMDICT_ENTRIES
.loop
ld a, [hli]
cp b
jr z, .ok
inc hl
dec c
jr nz, .loop
xor a
jr .done
.ok
ld a, [hl]
.done
pop bc
pop hl
ret
_ReinitSpriteAnimFrame::
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld [hl], a
ld hl, SPRITEANIMSTRUCT_DURATION
add hl, bc
ld [hl], 0
ld hl, SPRITEANIMSTRUCT_FRAME
add hl, bc
ld [hl], -1
ret
GetSpriteAnimFrame:
.loop
ld hl, SPRITEANIMSTRUCT_DURATION
add hl, bc
ld a, [hl]
and a
jr z, .next_frame
dec [hl]
call .GetPointer
ld a, [hli]
push af
jr .okay
.next_frame
ld hl, SPRITEANIMSTRUCT_FRAME
add hl, bc
inc [hl]
call .GetPointer
ld a, [hli]
cp oamrestart_command
jr z, .restart
cp oamend_command
jr z, .repeat_last
push af
ld a, [hl]
push hl
and ~(Y_FLIP << 1 | X_FLIP << 1)
ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET
add hl, bc
add [hl]
ld hl, SPRITEANIMSTRUCT_DURATION
add hl, bc
ld [hl], a
pop hl
.okay
ld a, [hl]
and Y_FLIP << 1 | X_FLIP << 1 ; The << 1 is compensated in the "oamframe" macro
srl a
ld [wCurSpriteOAMFlags], a
pop af
ret
.repeat_last
xor a
ld hl, SPRITEANIMSTRUCT_DURATION
add hl, bc
ld [hl], a
ld hl, SPRITEANIMSTRUCT_FRAME
add hl, bc
dec [hl]
dec [hl]
jr .loop
.restart
xor a
ld hl, SPRITEANIMSTRUCT_DURATION
add hl, bc
ld [hl], a
dec a
ld hl, SPRITEANIMSTRUCT_FRAME
add hl, bc
ld [hl], a
jr .loop
.GetPointer:
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld e, [hl]
ld d, 0
ld hl, SpriteAnimFrameData
add hl, de
add hl, de
ld e, [hl]
inc hl
ld d, [hl]
ld hl, SPRITEANIMSTRUCT_FRAME
add hl, bc
ld l, [hl]
ld h, 0
add hl, hl
add hl, de
ret
GetFrameOAMPointer:
ld e, a
ld d, 0
ld hl, SpriteAnimOAMData
add hl, de
add hl, de
add hl, de
ret
UnusedLoadSpriteAnimGFX: ; unreferenced
push hl
ld l, a
ld h, 0
add hl, hl
add hl, hl
ld de, UnusedSpriteAnimGFX
add hl, de
ld c, [hl]
inc hl
ld b, [hl]
inc hl
ld e, [hl]
inc hl
ld d, [hl]
pop hl
push bc
call Request2bpp
pop bc
ret
INCLUDE "data/sprite_anims/sequences.asm"
INCLUDE "engine/gfx/sprite_anims.asm"
INCLUDE "data/sprite_anims/framesets.asm"
INCLUDE "data/sprite_anims/oam.asm"
INCLUDE "data/sprite_anims/unused_gfx.asm"
Sprites_Cosine:
; a = d * cos(a * pi/32)
add %010000 ; cos(x) = sin(x + pi/2)
; fallthrough
Sprites_Sine:
; a = d * sin(a * pi/32)
calc_sine_wave
AnimateEndOfExpBar:
ldh a, [hSGB]
ld de, EndOfExpBarGFX
and a
jr z, .load
ld de, SGBEndOfExpBarGFX
.load
ld hl, vTiles0 tile $00
lb bc, BANK(EndOfExpBarGFX), 1
call Request2bpp
ld c, 8
ld d, 0
.loop
push bc
call .AnimateFrame
call DelayFrame
pop bc
inc d
inc d
dec c
jr nz, .loop
call ClearSprites
ret
.AnimateFrame:
ld hl, wShadowOAMSprite00
ld c, 8 ; number of animated circles
.anim_loop
ld a, c
and a
ret z
dec c
ld a, c
; multiply by 8
sla a
sla a
sla a
push af
push de
push hl
call Sprites_Sine
pop hl
pop de
add 13 * TILE_WIDTH
ld [hli], a ; y
pop af
push de
push hl
call Sprites_Cosine
pop hl
pop de
add 10 * TILE_WIDTH + 4
ld [hli], a ; x
ld a, $0
ld [hli], a ; tile id
ld a, PAL_BATTLE_OB_BLUE
ld [hli], a ; attributes
jr .anim_loop
EndOfExpBarGFX:
INCBIN "gfx/battle/expbarend.2bpp"
SGBEndOfExpBarGFX:
INCBIN "gfx/battle/expbarend_sgb.2bpp"
ClearSpriteAnims2:
push hl
push de
push bc
push af
ld hl, wSpriteAnimData
ld bc, wSpriteAnimDataEnd - wSpriteAnimData
.loop
ld [hl], 0
inc hl
dec bc
ld a, c
or b
jr nz, .loop
pop af
pop bc
pop de
pop hl
ret

View file

@ -0,0 +1,38 @@
GetTrademonFrontpic:
ld a, [wOTTrademonSpecies]
ld hl, wOTTrademonDVs
ld de, vTiles2
push de
push af
predef GetUnownLetter
pop af
ld [wCurPartySpecies], a
ld [wCurSpecies], a
call GetBaseData
pop de
predef GetAnimatedFrontpic
ret
AnimateTrademonFrontpic:
ld a, [wOTTrademonSpecies]
call IsAPokemon
ret c
farcall ShowOTTrademonStats
ld a, [wOTTrademonSpecies]
ld [wCurPartySpecies], a
ld a, [wOTTrademonDVs]
ld [wTempMonDVs], a
ld a, [wOTTrademonDVs + 1]
ld [wTempMonDVs + 1], a
ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS
call GetSGBLayout
ld a, %11100100 ; 3,2,1,0
call DmgToCgbBGPals
farcall TradeAnim_ShowGetmonFrontpic
ld a, [wOTTrademonSpecies]
ld [wCurPartySpecies], a
hlcoord 7, 2
ld d, $0
ld e, ANIM_MON_TRADE
predef AnimateFrontpic
ret