diff options
Diffstat (limited to 'engine/pokemon/stats_screen.asm')
-rw-r--r-- | engine/pokemon/stats_screen.asm | 868 |
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 |