summaryrefslogtreecommitdiff
path: root/engine/pokemon/stats_screen.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/pokemon/stats_screen.asm')
-rw-r--r--engine/pokemon/stats_screen.asm868
1 files changed, 868 insertions, 0 deletions
diff --git a/engine/pokemon/stats_screen.asm b/engine/pokemon/stats_screen.asm
new file mode 100644
index 00000000..a2345f37
--- /dev/null
+++ b/engine/pokemon/stats_screen.asm
@@ -0,0 +1,868 @@
+ const_def 1
+ const PINK_PAGE ; 1
+ const GREEN_PAGE ; 2
+ const BLUE_PAGE ; 3
+
+StatsScreenInit:
+ ldh a, [hMapAnims]
+ push af
+ xor a
+ ldh [hMapAnims], a ; disable overworld tile animations
+
+ ld c, 1
+ call StatsScreenMain
+
+ ; restore old values
+ pop af
+ ldh [hMapAnims], a
+ ret
+
+StatsScreenMain:
+ push bc
+ ld a, [wMonType]
+ cp TEMPMON
+ jr nz, .not_tempmon
+ ld a, [wBufferMonSpecies]
+ ld [wCurSpecies], a
+ call GetBaseData
+ ld hl, wBufferMon
+ ld de, wTempMon
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call CopyBytes
+ jr .got_stats
+
+.not_tempmon
+ call CopyMonToTempMon
+ ld a, [wCurPartySpecies]
+ cp EGG
+ jp z, .got_stats
+ ld a, [wMonType]
+ cp BOXMON
+ jr c, .got_stats
+ call CalcTempmonStats
+
+.got_stats
+ call ClearBGPalettes
+ call ClearTilemap
+ call UpdateSprites
+ callfar StatsScreen_LoadFont
+
+ pop bc
+ ld a, [wCurPartySpecies]
+ cp EGG
+ jp z, EggStatsInit
+ call StatsScreen_InitUpperHalf
+ ld b, 0
+ jp StatsScreen_JumpToLoadPageFunction
+
+StatsScreen_LoadPage:
+ push bc
+ ld de, .done_loading
+ push de
+; first jump to LoadPage function in jumptable
+ jp hl
+
+; return here after LoadPage function finishes
+.done_loading
+ pop bc
+ ld b, 1
+
+.joypad_loop
+ call GetJoypad
+ ld a, [wMonType]
+ cp TEMPMON
+ jr nz, .not_tempmon
+ push hl
+ push de
+ push bc
+ farcall StatsScreenDPad
+ pop bc
+ pop de
+ pop hl
+ ld a, [wMenuJoypad]
+ and D_DOWN | D_UP
+ jr nz, StatsScreenMain
+ ld a, [wMenuJoypad]
+ jr .joypad_action
+
+.not_tempmon
+ ldh a, [hJoyPressed]
+
+.joypad_action
+ and D_DOWN | D_UP | D_LEFT | D_RIGHT | A_BUTTON | B_BUTTON
+ jr z, .joypad_loop
+ bit B_BUTTON_F, a
+ jp nz, StatsScreen_Exit
+ bit D_LEFT_F, a
+ jr nz, .d_left
+ bit D_RIGHT_F, a
+ jr nz, .d_right
+ bit A_BUTTON_F, a
+ jr nz, .a_button
+ bit D_UP_F, a
+ jr nz, .d_up
+
+; .d_down
+ ld a, [wMonType]
+ cp BOXMON
+ jr nc, .joypad_loop
+ and a
+ ld a, [wPartyCount]
+ jr z, .next_mon
+ ld a, [wOTPartyCount]
+.next_mon
+ ld b, a
+ ld a, [wCurPartyMon]
+ inc a
+ cp b
+ jr z, .joypad_loop
+ ld [wCurPartyMon], a
+ ld b, a
+ ld a, [wMonType]
+ and a
+ jr nz, .load_mon
+ ld a, b
+ inc a
+ ld [wPartyMenuCursor], a
+ jr .load_mon
+
+.d_up
+ ld a, [wCurPartyMon]
+ and a
+ jr z, .joypad_loop
+ dec a
+ ld [wCurPartyMon], a
+ ld b, a
+ ld a, [wMonType]
+ and a
+ jr nz, .load_mon
+ ld a, b
+ inc a
+ ld [wPartyMenuCursor], a
+; fall through
+.load_mon
+ jp StatsScreenMain
+
+.a_button
+ ld a, c
+ cp BLUE_PAGE ; last page
+ jr z, StatsScreen_Exit
+
+.d_right
+ inc c
+ ld a, BLUE_PAGE ; last page
+ cp c
+ jr nc, StatsScreen_JumpToLoadPageFunction
+ ld c, PINK_PAGE ; first page
+ jr StatsScreen_JumpToLoadPageFunction
+
+.d_left
+ dec c
+ jr nz, StatsScreen_JumpToLoadPageFunction
+ ld c, BLUE_PAGE ; last page
+; fall through
+
+StatsScreen_JumpToLoadPageFunction:
+ ld hl, StatsScreen_LoadPageJumptable
+ push bc
+ dec c
+ ld b, 0
+ add hl, bc
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop bc
+ jp StatsScreen_LoadPage
+
+EggStatsInit:
+ push bc
+ call EggStatsScreen
+ pop bc
+; fall through
+
+EggStats_JoypadLoop:
+ call GetJoypad
+ ld a, [wMonType]
+ cp TEMPMON
+ jr nz, .not_tempmon
+; .tempmon
+ push hl
+ push de
+ push bc
+ farcall StatsScreenDPad
+ pop bc
+ pop de
+ pop hl
+ ld a, [wMenuJoypad]
+ and D_DOWN | D_UP
+ jp nz, StatsScreenMain
+ ld a, [wMenuJoypad]
+ jr .joypad_action
+
+.not_tempmon
+ ldh a, [hJoyPressed]
+.joypad_action
+ and D_DOWN | D_UP | A_BUTTON | B_BUTTON
+ jr z, EggStats_JoypadLoop
+ bit A_BUTTON_F, a
+ jr nz, StatsScreen_Exit
+ bit B_BUTTON_F, a
+ jr nz, StatsScreen_Exit
+ bit D_UP_F, a
+ jr nz, EggStats_UpAction
+ bit D_DOWN_F, a
+ jp EggStats_DownAction
+
+StatsScreen_Exit:
+ call ClearBGPalettes
+ call ClearTilemap
+ ret
+
+EggStats_DownAction:
+ ld a, [wMonType]
+ cp BOXMON
+ jr nc, EggStats_JoypadLoop
+ and a
+ ld a, [wPartyCount]
+ jr z, .next_mon
+ ld a, [wOTPartyCount]
+.next_mon
+ ld b, a
+ ld a, [wCurPartyMon]
+ inc a
+ cp b
+ jr z, EggStats_JoypadLoop
+ ld [wCurPartyMon], a
+ ld b, a
+ ld a, [wMonType]
+ and a
+ jr nz, EggStats_ScrollToLoadMon
+ ld a, b
+ inc a
+ ld [wPartyMenuCursor], a
+ jr EggStats_ScrollToLoadMon
+
+EggStats_UpAction:
+ ld a, [wCurPartyMon]
+ and a
+ jr z, EggStats_JoypadLoop
+ dec a
+ ld [wCurPartyMon], a
+ ld b, a
+ ld a, [wMonType]
+ and a
+ jr nz, EggStats_ScrollToLoadMon
+ ld a, b
+ inc a
+ ld [wPartyMenuCursor], a
+; fall through
+
+EggStats_ScrollToLoadMon:
+ jp StatsScreenMain
+
+StatsScreen_LoadPageJumptable:
+; entries correspond to *_PAGE constants
+ dw LoadPinkPage
+ dw LoadGreenPage
+ dw LoadBluePage
+
+StatsScreen_InitUpperHalf:
+ push bc
+ xor a
+ ldh [hBGMapMode], a
+ ld a, [wBaseDexNo]
+ ld [wDeciramBuffer], a
+ ld [wCurSpecies], a
+ hlcoord 8, 0
+ ld [hl], "№"
+ inc hl
+ ld [hl], "."
+ inc hl
+ ld de, wDeciramBuffer
+ lb bc, PRINTNUM_LEADINGZEROS | 1, 3
+ call PrintNum
+ hlcoord 14, 0
+ call PrintLevel
+ ld hl, .NicknamePointers
+ call GetNicknamePointer
+; Nickname
+ ld a, [wMonType]
+ cp BOXMON
+ ld a, BANK(sBoxMonNicknames)
+ call z, OpenSRAM
+ ld d, h
+ ld e, l
+ hlcoord 8, 2
+ call PlaceString
+ ld a, [wMonType]
+ cp BOXMON
+ call z, CloseSRAM
+; Gender character
+ call GetGender
+ jr c, .next
+ ld a, "♂"
+ jr nz, .got_gender
+ ld a, "♀"
+.got_gender
+ hlcoord 18, 0
+ ld [hl], a
+.next
+ hlcoord 9, 4
+ ld a, "/"
+ ld [hli], a
+ ld a, [wBaseDexNo]
+ ld [wNamedObjectIndexBuffer], a
+ call GetPokemonName
+ call PlaceString
+ call StatsScreen_PlaceHorizontalDivider
+ call StatsScreen_PlacePageSwitchArrows
+ call StatsScreen_PlaceShinyIcon
+; Place HP bar
+ ld hl, wTempMonHP
+ ld a, [hli]
+ ld b, a
+ ld c, [hl]
+ ld hl, wTempMonMaxHP
+ ld a, [hli]
+ ld d, a
+ ld e, [hl]
+ callfar ComputeHPBarPixels
+ ld hl, wCurHPPal
+ call SetHPPal
+ ld b, SCGB_STATS_SCREEN_HP_PALS
+ call GetSGBLayout
+ pop bc
+ ret
+
+.NicknamePointers:
+ dw wPartyMonNicknames
+ dw wOTPartyMonNicknames
+ dw sBoxMonNicknames
+ dw wBufferMonNick
+
+LoadPinkPage:
+ push bc
+ push bc
+ xor a
+ ldh [hBGMapMode], a
+ ld a, [wBaseDexNo]
+ ld [wDeciramBuffer], a
+ ld [wCurSpecies], a
+ ld b, PINK_PAGE
+ call StatsScreen_LoadPageIndicators
+
+; Load graphics
+ hlcoord 0, 8
+ lb bc, 10, 20
+ call ClearBox
+ hlcoord 0, 9
+ ld b, 0
+ call DrawPlayerHP
+ hlcoord 8, 9
+ ld [hl], $41 ; right HP/exp bar end cap
+ hlcoord 0, 12
+ ld de, .Status_Type
+ call PlaceString
+ ld a, [wTempMonPokerusStatus]
+ ld b, a
+ and $f
+ jr nz, .HasPokerus
+ ld a, b
+ and $f0
+ jr z, .NotImmuneToPkrs
+ hlcoord 8, 8
+ ld [hl], "." ; Pokérus immunity dot
+.NotImmuneToPkrs:
+ ld a, [wMonType]
+ cp BOXMON
+ jr z, .StatusOK
+ hlcoord 6, 13
+ push hl
+ ld de, wTempMonStatus
+ call PlaceStatusString
+ pop hl
+ jr .StatusOK
+.HasPokerus:
+ ld de, .PkrsStr
+ hlcoord 1, 13
+ call PlaceString
+ jr .done_status
+.StatusOK:
+ ld de, .OK_str
+ call z, PlaceString
+.done_status
+ hlcoord 1, 15
+ call PrintMonTypes
+ ld bc, 9
+ decoord 0, 16
+ hlcoord 0, 17
+ call CopyBytes
+ ld a, " "
+ ld bc, 9
+ hlcoord 0, 17
+ call ByteFill
+ hlcoord 9, 8
+ ld de, SCREEN_WIDTH
+ ld b, 10
+ ld a, $31 ; vertical divider
+.vertical_divider
+ ld [hl], a
+ add hl, de
+ dec b
+ jr nz, .vertical_divider
+ hlcoord 10, 9
+ ld de, .ExpPointStr
+ call PlaceString
+; print next level
+ ld a, [wTempMonLevel]
+ push af
+ cp MAX_LEVEL
+ jr z, .got_level
+ inc a
+ ld [wTempMonLevel], a
+.got_level
+ hlcoord 17, 14
+ call PrintLevel
+ pop af
+ ld [wTempMonLevel], a
+ ld de, wTempMonExp
+ hlcoord 13, 10
+ lb bc, 3, 7
+ call PrintNum
+; level-up graphics and strings
+ call .CalcExpToNextLevel
+ ld de, wBuffer1
+ hlcoord 13, 13
+ lb bc, 3, 7
+ call PrintNum
+ hlcoord 10, 12
+ ld de, .LevelUpStr
+ call PlaceString
+ hlcoord 14, 14
+ ld de, .ToStr
+ call PlaceString
+ ld a, [wTempMonLevel]
+ ld b, a
+ ld de, wTempMonExp + 2
+ hlcoord 11, 16
+ predef FillInExpBar
+ hlcoord 10, 16
+ ld [hl], $40 ; left exp bar end cap
+ hlcoord 19, 16
+ ld [hl], $41 ; right exp bar end cap
+
+; Load palettes / place frontpic
+ pop bc
+ farcall LoadStatsScreenPals
+ call WaitBGMap
+ ld a, 1
+ ldh [hBGMapMode], a
+ pop bc
+ ld a, b
+ and a
+ jp z, StatsScreen_PlaceFrontpic
+ ret
+
+.CalcExpToNextLevel:
+ ld a, [wTempMonLevel]
+ cp MAX_LEVEL
+ jr z, .AlreadyAtMaxLevel
+ inc a
+ ld d, a
+ call CalcExpAtLevel
+ ld hl, wTempMonExp + 2
+ ld hl, wTempMonExp + 2
+ ldh a, [hQuotient + 3]
+ sub [hl]
+ dec hl
+ ld [wBuffer3], a
+ ldh a, [hQuotient + 2]
+ sbc [hl]
+ dec hl
+ ld [wBuffer2], a
+ ldh a, [hQuotient + 1]
+ sbc [hl]
+ ld [wBuffer1], a
+ ret
+
+.AlreadyAtMaxLevel:
+ ld hl, wBuffer1
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ret
+
+.Status_Type:
+ db "STATUS/"
+ next "TYPE/@"
+
+.OK_str:
+ db "OK @"
+
+.ExpPointStr:
+ db "EXP POINTS@"
+
+.LevelUpStr:
+ db "LEVEL UP@"
+
+.ToStr:
+ db "TO@"
+
+.PkrsStr:
+ db "#RUS@"
+
+Unreferenced_Function50f4d:
+ hlcoord 7, 0
+ ld bc, SCREEN_WIDTH
+ ld d, SCREEN_HEIGHT
+.loop
+ ld a, $31 ; vertical divider
+ ld [hl], a
+ add hl, bc
+ dec d
+ jr nz, .loop
+ ret
+
+StatsScreen_PlaceHorizontalDivider:
+ hlcoord 0, 7
+ ld b, SCREEN_WIDTH
+ ld a, $62 ; horizontal divider (empty HP/exp bar)
+.loop
+ ld [hli], a
+ dec b
+ jr nz, .loop
+ ret
+
+StatsScreen_PlacePageSwitchArrows:
+ hlcoord 12, 6
+ ld [hl], "◀"
+ hlcoord 19, 6
+ ld [hl], "▶"
+ ret
+
+StatsScreen_PlaceShinyIcon:
+ ld bc, wTempMonDVs
+ callfar CheckShininess
+ ret nc
+ hlcoord 19, 0
+ ld [hl], "⁂"
+ ret
+
+LoadGreenPage:
+ push bc
+ push bc
+ xor a
+ ldh [hBGMapMode], a
+ ld b, GREEN_PAGE
+ call StatsScreen_LoadPageIndicators
+
+; Load graphics
+ hlcoord 0, 8
+ lb bc, 10, 20
+ call ClearBox
+; item info
+ hlcoord 0, 8
+ ld de, .Item
+ call PlaceString
+ ld a, [wTempMonItem]
+ and a
+ ld de, .ThreeDashes
+ jr z, .got_item_name
+ ld b, a
+ farcall TimeCapsule_ReplaceTeruSama
+ ld a, b
+ ld [wNamedObjectIndexBuffer], a
+ call GetItemName
+.got_item_name
+ hlcoord 6, 8
+ call PlaceString
+; move info
+ ld hl, wTempMonMoves
+ ld de, wListMoves_MoveIndicesBuffer
+ ld bc, NUM_MOVES
+ call CopyBytes
+ hlcoord 0, 10
+ ld de, .Move
+ call PlaceString
+ hlcoord 8, 10
+ ld a, SCREEN_WIDTH * 2
+ ld [wBuffer1], a
+ call ListMoves
+ hlcoord 12, 11
+ ld a, SCREEN_WIDTH * 2
+ ld [wBuffer1], a
+ call ListMovePP
+
+; Load palettes / place frontpic
+ pop bc
+ farcall LoadStatsScreenPals
+ call WaitBGMap
+ ld a, 1
+ ldh [hBGMapMode], a
+ pop bc
+ ld a, b
+ and a
+ jp z, StatsScreen_PlaceFrontpic
+ ret
+
+.Item:
+ db "ITEM@"
+
+.ThreeDashes:
+ db "---@"
+
+.Move:
+ db "MOVE@"
+
+LoadBluePage:
+ push bc
+ push bc
+ xor a
+ ldh [hBGMapMode], a
+ ld b, BLUE_PAGE
+ call StatsScreen_LoadPageIndicators
+
+; Load graphics
+ hlcoord 0, 8
+ lb bc, 10, 20
+ call ClearBox
+ call .PlaceOTInfo
+ hlcoord 10, 8
+ ld de, SCREEN_WIDTH
+ ld b, 10
+ ld a, $31 ; vertical divider
+.vertical_divider
+ ld [hl], a
+ add hl, de
+ dec b
+ jr nz, .vertical_divider
+ hlcoord 11, 8
+ ld bc, 6
+ call PrintTempMonStats
+
+; Load palettes / place frontpic
+ pop bc
+ farcall LoadStatsScreenPals
+ call WaitBGMap
+ ld a, 1
+ ldh [hBGMapMode], a
+ pop bc
+ ld a, b
+ and a
+ jp z, StatsScreen_PlaceFrontpic
+ ret
+
+.PlaceOTInfo:
+ hlcoord 0, 9
+ ld de, IDNoString
+ call PlaceString
+ hlcoord 0, 12
+ ld de, OTString
+ call PlaceString
+ hlcoord 2, 10
+ ld de, wTempMonID
+ lb bc, PRINTNUM_LEADINGZEROS | 2, 5
+ call PrintNum
+ ld hl, .OTNamePointers
+ call GetNicknamePointer
+; OT name
+ ld a, [wMonType]
+ cp BOXMON
+ ld a, BANK(sBoxMonOT)
+ call z, OpenSRAM
+ ld de, wStringBuffer1
+ push de
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ pop de
+ ld a, [wMonType]
+ cp BOXMON
+ call z, CloseSRAM
+ callfar CorrectNickErrors
+ push de
+
+; Adjust coordinate of OT name based on index of nickname terminator
+ lb bc, 0, -1
+.loop
+ inc c
+ ld a, [de]
+ inc de
+ cp "@"
+ jr nz, .loop
+; remove left padding if name was 8-10 chars (somehow?)
+ ld a, NAME_LENGTH - 1
+ sub c
+ cp 3 ; NAME_LENGTH - PLAYER_NAME_LENGTH
+; otherwise, use 2 spaces of left padding
+ jr c, .ok
+ ld a, 2 ; NAME_LENGTH - PLAYER_NAME_LENGTH - 1
+.ok
+ ld c, a
+ hlcoord 0, 13
+ add hl, bc
+; that's finally over ... place string, quit forever
+ pop de
+ call PlaceString
+ ret
+
+.OTNamePointers:
+ dw wPartyMonOT
+ dw wOTPartyMonOT
+ dw sBoxMonOT
+ dw wBufferMonOT
+
+IDNoString:
+ db "<ID>№.@"
+
+OTString:
+ db "OT/@"
+
+StatsScreen_PlaceFrontpic:
+ push bc
+ call SetPalettes
+ ld hl, wTempMonDVs
+ call GetUnownLetter
+ hlcoord 0, 0
+ ld a, [wCurPartySpecies]
+ cp UNOWN
+ jr z, .unown
+
+ call PrepMonFrontpic
+ jr .play_cry
+
+.unown
+ xor a
+ ld [wBoxAlignment], a
+ call _PrepMonFrontpic
+
+.play_cry
+ ld a, [wCurPartySpecies]
+ call PlayMonCry
+ pop bc
+ ld b, 1
+ ret
+
+EggStatsScreen:
+ ld hl, wCurHPPal
+ call SetHPPal
+ ld b, SCGB_STATS_SCREEN_HP_PALS
+ call GetSGBLayout
+ call StatsScreen_PlaceHorizontalDivider
+ hlcoord 8, 1
+ ld de, EggString
+ call PlaceString
+ hlcoord 8, 3
+ ld de, IDNoString
+ call PlaceString
+ hlcoord 8, 5
+ ld de, OTString
+ call PlaceString
+ hlcoord 11, 3
+ ld de, FiveQMarkString
+ call PlaceString
+ hlcoord 11, 5
+ ld de, FiveQMarkString
+ call PlaceString
+ ld a, [wTempMonHappiness] ; egg status
+ ld de, EggSoonString
+ cp $6
+ jr c, .picked
+ ld de, EggCloseString
+ cp $b
+ jr c, .picked
+ ld de, EggMoreTimeString
+ cp $29
+ jr c, .picked
+ ld de, EggALotMoreTimeString
+.picked
+ hlcoord 1, 9
+ call PlaceString
+ call WaitBGMap
+ ld a, 1
+ ldh [hBGMapMode], a
+ call SetPalettes ; pals
+ hlcoord 0, 0
+ call PrepMonFrontpic
+ ld a, [wTempMonHappiness]
+ cp 6
+ ret nc
+ ld de, SFX_2_BOOPS
+ call PlaySFX
+ call WaitSFX
+ ret
+
+EggString:
+ db "EGG@"
+
+FiveQMarkString:
+ db "?????@"
+
+EggSoonString:
+ db "It's making sounds"
+ next "inside. It's going"
+ next "to hatch soon!@"
+
+EggCloseString:
+ db "It moves around"
+ next "inside sometimes."
+ next "It must be close"
+ next "to hatching.@"
+
+EggMoreTimeString:
+ db "Wonder what's"
+ next "inside? It needs"
+ next "more time, though.@"
+
+EggALotMoreTimeString:
+ db "This EGG needs a"
+ next "lot more time to"
+ next "hatch.@"
+
+StatsScreen_LoadPageIndicators:
+ hlcoord 13, 5
+ ld a, $36 ; first of 4 small square tiles
+ call .load_square
+ hlcoord 15, 5
+ ld a, $36 ; " " " "
+ call .load_square
+ hlcoord 17, 5
+ ld a, $36 ; " " " "
+ call .load_square
+ ld a, b
+ cp GREEN_PAGE
+ ld a, $3a ; first of 4 large square tiles
+ hlcoord 13, 5 ; PINK_PAGE (< GREEN_PAGE)
+ jr c, .load_square
+ hlcoord 15, 5 ; GREEN_PAGE (= GREEN_PAGE)
+ jr z, .load_square
+ hlcoord 17, 5 ; BLUE_PAGE (> GREEN_PAGE)
+.load_square
+ ld [hli], a
+ inc a
+ ld [hld], a
+ push bc
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ inc a
+ ld [hli], a
+ inc a
+ ld [hl], a
+ ret
+
+GetNicknamePointer:
+ ld a, [wMonType]
+ add a
+ ld c, a
+ ld b, 0
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wMonType]
+ cp TEMPMON
+ ret z
+ ld a, [wCurPartyMon]
+ jp SkipNames