pokecrystal-board/engine/menus/trainer_card.asm
2024-02-11 00:16:00 +01:00

619 lines
10 KiB
NASM

; TrainerCard.Jumptable indexes
const_def
const TRAINERCARDSTATE_PAGE1_LOADGFX ; 0
const TRAINERCARDSTATE_PAGE1_JOYPAD ; 1
const TRAINERCARDSTATE_PAGE2_LOADGFX ; 2
const TRAINERCARDSTATE_PAGE2_JOYPAD ; 3
const TRAINERCARDSTATE_PAGE3_LOADGFX ; 4
const TRAINERCARDSTATE_PAGE3_JOYPAD ; 5
const TRAINERCARDSTATE_QUIT ; 6
TrainerCard:
ld a, [wVramState]
push af
xor a
ld [wVramState], a
ld hl, wOptions
ld a, [hl]
push af
set NO_TEXT_SCROLL, [hl]
call .InitRAM
.loop
call JoyTextDelay
ld a, [wJumptableIndex]
bit 7, a
jr nz, .quit
ldh a, [hJoyLast]
and B_BUTTON
jr nz, .quit
call .RunJumptable
call DelayFrame
jr .loop
.quit
pop af
ld [wOptions], a
pop af
ld [wVramState], a
ret
.InitRAM:
call ClearBGPalettes
call ClearSprites
call ClearTilemap
call DisableLCD
farcall GetCardPic
ld hl, CardRightCornerGFX
ld de, vTiles2 tile $1c
ld bc, 1 tiles
ld a, BANK(CardRightCornerGFX)
call FarCopyBytes
ld hl, CardStatusGFX
ld de, vTiles2 tile $29
ld bc, 86 tiles
ld a, BANK(CardStatusGFX)
call FarCopyBytes
call TrainerCard_PrintTopHalfOfCard
hlcoord 0, 8
ld d, 6
call TrainerCard_InitBorder
call EnableLCD
call WaitBGMap
ld b, CGB_TRAINER_CARD
call GetCGBLayout
call SetDefaultBGPAndOBP
call WaitBGMap
ld hl, wJumptableIndex
xor a ; TRAINERCARDSTATE_PAGE1_LOADGFX
ld [hli], a ; wJumptableIndex
ld [hli], a ; wTrainerCardBadgeFrameCounter
ld [hli], a ; wTrainerCardBadgeTileID
ld [hl], a ; wTrainerCardBadgeAttributes
ret
.RunJumptable:
jumptable .Jumptable, wJumptableIndex
.Jumptable:
; entries correspond to TRAINERCARDSTATE_* constants
dw TrainerCard_Page1_LoadGFX
dw TrainerCard_Page1_Joypad
dw TrainerCard_Page2_LoadGFX
dw TrainerCard_Page2_Joypad
dw TrainerCard_Page3_LoadGFX
dw TrainerCard_Page3_Joypad
dw TrainerCard_Quit
TrainerCard_IncrementJumptable:
ld hl, wJumptableIndex
inc [hl]
ret
TrainerCard_Quit:
ld hl, wJumptableIndex
set 7, [hl]
ret
TrainerCard_Page1_LoadGFX:
call ClearSprites
hlcoord 0, 8
ld d, 6
call TrainerCard_InitBorder
call WaitBGMap
ld de, CardStatusGFX
ld hl, vTiles2 tile $29
lb bc, BANK(CardStatusGFX), 86
call Request2bpp
call TrainerCard_Page1_PrintDexCaught_GameTime
call TrainerCard_IncrementJumptable
ret
TrainerCard_Page1_Joypad:
call TrainerCard_Page1_PrintGameTime
ld hl, hJoyLast
ld a, [hl]
and D_RIGHT | A_BUTTON
jr nz, .pressed_right_a
ret
.pressed_right_a
ld a, TRAINERCARDSTATE_PAGE2_LOADGFX
ld [wJumptableIndex], a
ret
.KantoBadgeCheck: ; unreferenced
ld a, [wKantoBadges]
and a
ret z
ld a, TRAINERCARDSTATE_PAGE3_LOADGFX
ld [wJumptableIndex], a
ret
TrainerCard_Page2_LoadGFX:
call ClearSprites
hlcoord 0, 8
ld d, 6
call TrainerCard_InitBorder
call WaitBGMap
ld de, LeaderGFX
ld hl, vTiles2 tile $29
lb bc, BANK(LeaderGFX), 86
call Request2bpp
ld de, BadgeGFX
ld hl, vTiles0 tile $00
lb bc, BANK(BadgeGFX), 44
call Request2bpp
call TrainerCard_Page2_3_InitObjectsAndStrings
call TrainerCard_IncrementJumptable
ret
TrainerCard_Page2_Joypad:
ld hl, TrainerCard_JohtoBadgesOAM
call TrainerCard_Page2_3_AnimateBadges
ld hl, hJoyLast
ld a, [hl]
and A_BUTTON
jr nz, .Quit
ld a, [hl]
and D_LEFT
jr nz, .d_left
ret
.d_left
ld a, TRAINERCARDSTATE_PAGE1_LOADGFX
ld [wJumptableIndex], a
ret
.KantoBadgeCheck: ; unreferenced
ld a, [wKantoBadges]
and a
ret z
ld a, TRAINERCARDSTATE_PAGE3_LOADGFX
ld [wJumptableIndex], a
ret
.Quit:
ld a, TRAINERCARDSTATE_QUIT
ld [wJumptableIndex], a
ret
TrainerCard_Page3_LoadGFX:
call ClearSprites
hlcoord 0, 8
ld d, 6
call TrainerCard_InitBorder
call WaitBGMap
ld de, LeaderGFX2
ld hl, vTiles2 tile $29
lb bc, BANK(LeaderGFX2), 86
call Request2bpp
ld de, BadgeGFX2
ld hl, vTiles0 tile $00
lb bc, BANK(BadgeGFX2), 44
call Request2bpp
call TrainerCard_Page2_3_InitObjectsAndStrings
call TrainerCard_IncrementJumptable
ret
TrainerCard_Page3_Joypad:
ld hl, TrainerCard_JohtoBadgesOAM
call TrainerCard_Page2_3_AnimateBadges
ld hl, hJoyLast
ld a, [hl]
and D_LEFT
jr nz, .left
ld a, [hl]
and D_RIGHT
jr nz, .right
ret
.left
ld a, TRAINERCARDSTATE_PAGE2_LOADGFX
ld [wJumptableIndex], a
ret
.right
ld a, TRAINERCARDSTATE_PAGE1_LOADGFX
ld [wJumptableIndex], a
ret
TrainerCard_PrintTopHalfOfCard:
hlcoord 0, 0
ld d, 5
call TrainerCard_InitBorder
hlcoord 2, 2
ld de, .Name_Coins
call PlaceString
hlcoord 2, 4
ld de, .ID_No
call TrainerCardSetup_PlaceTilemapString
hlcoord 7, 2
ld de, wPlayerName
call PlaceString
hlcoord 5, 4
ld de, wPlayerID
lb bc, PRINTNUM_LEADINGZEROS | 2, 5
call PrintNum
hlcoord 7, 6
ld de, wCoins
lb bc, PRINTNUM_COINS | 3, 6
call PrintNum
hlcoord 1, 3
ld de, .HorizontalDivider
call TrainerCardSetup_PlaceTilemapString
hlcoord 14, 1
lb bc, 5, 7
xor a
ldh [hGraphicStartTile], a
predef PlaceGraphic
ret
.Name_Coins:
db "NAME/"
next ""
next "COINS@"
.ID_No:
db $27, $28, -1 ; ID NO
.HorizontalDivider:
db $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $26, -1 ; ____________>
TrainerCard_Page1_PrintDexCaught_GameTime:
hlcoord 2, 10
ld de, .Dex_PlayTime
call PlaceString
hlcoord 10, 15
ld de, .Badges
call PlaceString
ld hl, wPokedexCaught
ld b, wEndPokedexCaught - wPokedexCaught
call CountSetBits
ld de, wNumSetBits
hlcoord 15, 10
lb bc, 1, 3
call PrintNum
call TrainerCard_Page1_PrintGameTime
hlcoord 2, 8
ld de, .StatusTilemap
call TrainerCardSetup_PlaceTilemapString
ld a, [wStatusFlags]
bit STATUSFLAGS_POKEDEX_F, a
ret nz
hlcoord 1, 9
lb bc, 2, 17
call ClearBox
ret
.Dex_PlayTime:
db "#DEX"
next "PLAY TIME@"
.Unused: ; unreferenced
db "@"
.Badges:
db " BADGESâ–¶@"
.StatusTilemap:
db $29, $2a, $2b, $2c, $2d, -1
TrainerCard_Page2_3_InitObjectsAndStrings:
hlcoord 2, 8
ld de, .BadgesTilemap
call TrainerCardSetup_PlaceTilemapString
hlcoord 2, 10
ld a, $29
ld c, 4
.loop
call TrainerCard_Page2_3_PlaceLeadersFaces
rept 4
inc hl
endr
dec c
jr nz, .loop
hlcoord 2, 13
ld a, $51
ld c, 4
.loop2
call TrainerCard_Page2_3_PlaceLeadersFaces
rept 4
inc hl
endr
dec c
jr nz, .loop2
xor a
ld [wTrainerCardBadgeFrameCounter], a
ld hl, TrainerCard_JohtoBadgesOAM
call TrainerCard_Page2_3_OAMUpdate
ret
.BadgesTilemap:
db $79, $7a, $7b, $7c, $7d, -1 ; "BADGES"
TrainerCardSetup_PlaceTilemapString:
.loop
ld a, [de]
cp -1
ret z
ld [hli], a
inc de
jr .loop
TrainerCard_InitBorder:
ld e, SCREEN_WIDTH
.loop1
ld a, $23
ld [hli], a
dec e
jr nz, .loop1
ld a, $23
ld [hli], a
ld e, SCREEN_WIDTH - 3
ld a, " "
.loop2
ld [hli], a
dec e
jr nz, .loop2
ld a, $1c
ld [hli], a
ld a, $23
ld [hli], a
.loop3
ld a, $23
ld [hli], a
ld e, SCREEN_WIDTH - 2
ld a, " "
.loop4
ld [hli], a
dec e
jr nz, .loop4
ld a, $23
ld [hli], a
dec d
jr nz, .loop3
ld a, $23
ld [hli], a
ld a, $24
ld [hli], a
ld e, SCREEN_WIDTH - 3
ld a, " "
.loop5
ld [hli], a
dec e
jr nz, .loop5
ld a, $23
ld [hli], a
ld e, SCREEN_WIDTH
.loop6
ld a, $23
ld [hli], a
dec e
jr nz, .loop6
ret
TrainerCard_Page2_3_PlaceLeadersFaces:
push de
push hl
ld [hli], a
inc a
ld [hli], a
inc a
ld [hli], a
inc a
ld [hli], a
inc a
ld de, SCREEN_WIDTH - 3
add hl, de
ld [hli], a
inc a
ld [hli], a
inc a
ld [hli], a
inc a
ld de, SCREEN_WIDTH - 3
add hl, de
ld [hli], a
inc a
ld [hli], a
inc a
ld [hli], a
inc a
pop hl
pop de
ret
TrainerCard_Page1_PrintGameTime:
hlcoord 11, 12
ld de, wGameTimeHours
lb bc, 2, 4
call PrintNum
inc hl
ld de, wGameTimeMinutes
lb bc, PRINTNUM_LEADINGZEROS | 1, 2
call PrintNum
ldh a, [hVBlankCounter]
and $1f
ret nz
hlcoord 15, 12
ld a, [hl]
xor " " ^ $2e ; alternate between space and small colon ($2e) tiles
ld [hl], a
ret
TrainerCard_Page2_3_AnimateBadges:
ldh a, [hVBlankCounter]
and %111
ret nz
ld a, [wTrainerCardBadgeFrameCounter]
inc a
and %111
ld [wTrainerCardBadgeFrameCounter], a
jr TrainerCard_Page2_3_OAMUpdate
TrainerCard_Page2_3_OAMUpdate:
; copy flag array pointer
ld a, [hli]
ld e, a
ld a, [hli]
; get flag array
ld d, a
ld a, [de]
ld c, a
ld de, wShadowOAMSprite00
ld b, NUM_JOHTO_BADGES
.loop
srl c
push bc
jr nc, .skip_badge
push hl
ld a, [hli] ; y
ld b, a
ld a, [hli] ; x
ld c, a
ld a, [hli] ; pal
ld [wTrainerCardBadgeAttributes], a
ld a, [wTrainerCardBadgeFrameCounter]
add l
ld l, a
ld a, 0
adc h
ld h, a
ld a, [hl]
ld [wTrainerCardBadgeTileID], a
call .PrepOAM
pop hl
.skip_badge
ld bc, $b ; 3 + 2 * 4
add hl, bc
pop bc
dec b
jr nz, .loop
ret
.PrepOAM:
ld a, [wTrainerCardBadgeTileID]
and 1 << 7
jr nz, .xflip
ld hl, .facing1
jr .loop2
.xflip
ld hl, .facing2
.loop2
ld a, [hli]
cp -1
ret z
add b
ld [de], a ; y
inc de
ld a, [hli]
add c
ld [de], a ; x
inc de
ld a, [wTrainerCardBadgeTileID]
and ~(1 << 7)
add [hl]
ld [de], a ; tile id
inc hl
inc de
ld a, [wTrainerCardBadgeAttributes]
add [hl]
ld [de], a ; attributes
inc hl
inc de
jr .loop2
.facing1
dbsprite 0, 0, 0, 0, $00, 0
dbsprite 1, 0, 0, 0, $01, 0
dbsprite 0, 1, 0, 0, $02, 0
dbsprite 1, 1, 0, 0, $03, 0
db -1
.facing2
dbsprite 0, 0, 0, 0, $01, 0 | X_FLIP
dbsprite 1, 0, 0, 0, $00, 0 | X_FLIP
dbsprite 0, 1, 0, 0, $03, 0 | X_FLIP
dbsprite 1, 1, 0, 0, $02, 0 | X_FLIP
db -1
TrainerCard_JohtoBadgesOAM:
; Template OAM data for each badge on the trainer card.
; Format:
; y, x, palette
; cycle 1: face tile, in1 tile, in2 tile, in3 tile
; cycle 2: face tile, in1 tile, in2 tile, in3 tile
dw wJohtoBadges
; Zephyrbadge
db $68, $18, 0
db $00, $20, $24, $20 | (1 << 7)
db $00, $20, $24, $20 | (1 << 7)
; Hivebadge
db $68, $38, 0
db $04, $20, $24, $20 | (1 << 7)
db $04, $20, $24, $20 | (1 << 7)
; Plainbadge
db $68, $58, 0
db $08, $20, $24, $20 | (1 << 7)
db $08, $20, $24, $20 | (1 << 7)
; Fogbadge
db $68, $78, 0
db $0c, $20, $24, $20 | (1 << 7)
db $0c, $20, $24, $20 | (1 << 7)
; Mineralbadge
db $80, $38, 0
db $10, $20, $24, $20 | (1 << 7)
db $10, $20, $24, $20 | (1 << 7)
; Stormbadge
db $80, $18, 0
db $14, $20, $24, $20 | (1 << 7)
db $14, $20, $24, $20 | (1 << 7)
; Glacierbadge
db $80, $58, 0
db $18, $20, $24, $20 | (1 << 7)
db $18, $20, $24, $20 | (1 << 7)
; Risingbadge
; X-flips on alternate cycles.
db $80, $78, 0
db $1c, $20, $24, $20 | (1 << 7)
db $1c | (1 << 7), $20, $24, $20 | (1 << 7)
CardStatusGFX: INCBIN "gfx/trainer_card/card_status.2bpp"
LeaderGFX: INCBIN "gfx/trainer_card/leaders.2bpp"
LeaderGFX2: INCBIN "gfx/trainer_card/leaders.2bpp"
BadgeGFX: INCBIN "gfx/trainer_card/badges.2bpp"
BadgeGFX2: INCBIN "gfx/trainer_card/badges.2bpp"
CardRightCornerGFX: INCBIN "gfx/trainer_card/card_right_corner.2bpp"