pokecrystal-board/engine/events/halloffame.asm

598 lines
9.4 KiB
NASM

DEF HALLOFFAME_COLON EQU $63
HallOfFame::
call HallOfFame_FadeOutMusic
ld a, [wStatusFlags]
push af
ld a, 1
ld [wGameLogicPaused], a
call DisableSpriteUpdates
; Enable the Pokégear map to cycle through all of Kanto
ld hl, wStatusFlags
set STATUSFLAGS_HALL_OF_FAME_F, [hl]
farcall HallOfFame_InitSaveIfNeeded
ld hl, wHallOfFameCount
ld a, [hl]
cp HOF_MASTER_COUNT
jr nc, .ok
inc [hl]
.ok
farcall SaveGameData
call GetHallOfFameParty
farcall AddHallOfFameEntry
xor a
ld [wGameLogicPaused], a
call AnimateHallOfFame
pop af
ld b, a
farcall Credits
ret
RedCredits::
ld a, LOW(MUSIC_NONE)
ld [wMusicFadeID], a
ld a, HIGH(MUSIC_NONE)
ld [wMusicFadeID + 1], a
ld a, 10
ld [wMusicFade], a
farcall FadeOutToWhite
xor a
ld [wStateFlags], a
ldh [hMapAnims], a
farcall InitDisplayForRedCredits
ld c, 8
call DelayFrames
call DisableSpriteUpdates
ld a, [wStatusFlags]
ld b, a
farcall Credits
ret
HallOfFame_FadeOutMusic:
ld a, LOW(MUSIC_NONE)
ld [wMusicFadeID], a
ld a, HIGH(MUSIC_NONE)
ld [wMusicFadeID + 1], a
ld a, 10
ld [wMusicFade], a
farcall FadeOutToWhite
xor a
ld [wStateFlags], a
ldh [hMapAnims], a
farcall InitDisplayForHallOfFame
ld c, 100
jp DelayFrames
HallOfFame_PlayMusicDE:
push de
ld de, MUSIC_NONE
call PlayMusic
call DelayFrame
pop de
call PlayMusic
ret
AnimateHallOfFame:
xor a
ld [wJumptableIndex], a
call LoadHOFTeam
jr c, .done
ld de, MUSIC_HALL_OF_FAME
call HallOfFame_PlayMusicDE
xor a
ld [wHallOfFameMonCounter], a
.loop
ld a, [wHallOfFameMonCounter]
cp PARTY_LENGTH
jr nc, .done
ld hl, wHallOfFameTempMon1
ld bc, wHallOfFameTempMon1End - wHallOfFameTempMon1
call AddNTimes
ld a, [hl]
cp -1
jr z, .done
push hl
call AnimateHOFMonEntrance
pop hl
call .DisplayNewHallOfFamer
jr c, .done
ld hl, wHallOfFameMonCounter
inc [hl]
jr .loop
.done
call HOF_AnimatePlayerPic
ld a, $4
ld [wMusicFade], a
call RotateThreePalettesRight
ld c, 8
call DelayFrames
ret
.DisplayNewHallOfFamer:
call DisplayHOFMon
ld de, .String_NewHallOfFamer
hlcoord 1, 2
call PlaceString
call WaitBGMap
decoord 6, 5
ld c, ANIM_MON_HOF
predef HOF_AnimateFrontpic
ld c, 60
call DelayFrames
and a
ret
.String_NewHallOfFamer:
db "New Hall of Famer!@"
GetHallOfFameParty:
ld hl, wHallOfFamePokemonList
ld bc, wHallOfFamePokemonListEnd - wHallOfFamePokemonList + 1
xor a
call ByteFill
ld a, [wHallOfFameCount]
ld de, wHallOfFamePokemonList
ld [de], a
inc de
ld hl, wPartySpecies
ld c, 0
.next
ld a, [hli]
cp -1
jr z, .done
cp EGG
jr nz, .mon
inc c
jr .next
.mon
push hl
push de
push bc
ld a, c
ld hl, wPartyMons
ld bc, PARTYMON_STRUCT_LENGTH
call AddNTimes
ld c, l
ld b, h
ld hl, MON_SPECIES
add hl, bc
ld a, [hl]
ld [de], a
inc de
ld hl, MON_ID
add hl, bc
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
inc de
ld hl, MON_DVS
add hl, bc
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
inc de
ld hl, MON_LEVEL
add hl, bc
ld a, [hl]
ld [de], a
inc de
pop bc
push bc
ld a, c
ld hl, wPartyMonNicknames
ld bc, MON_NAME_LENGTH
call AddNTimes
ld bc, MON_NAME_LENGTH - 1
call CopyBytes
pop bc
inc c
pop de
ld hl, wHallOfFamePokemonListMon1End - wHallOfFamePokemonListMon1
add hl, de
ld e, l
ld d, h
pop hl
jr .next
.done
ld a, -1
ld [de], a
ret
AnimateHOFMonEntrance:
push hl
call ClearBGPalettes
farcall ResetDisplayBetweenHallOfFameMons
pop hl
ld a, [hli]
ld [wTempMonSpecies], a
ld [wCurPartySpecies], a
inc hl
inc hl
ld a, [hli]
ld [wTempMonDVs], a
ld a, [hli]
ld [wTempMonDVs + 1], a
ld hl, wTempMonDVs
predef GetUnownLetter
hlcoord 0, 0
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
ld a, " "
call ByteFill
ld de, vTiles2 tile $31
predef GetMonBackpic
ld a, $31
ldh [hGraphicStartTile], a
hlcoord 6, 6
lb bc, 6, 6
predef PlaceGraphic
ld a, $d0
ldh [hSCY], a
ld a, $90
ldh [hSCX], a
call WaitBGMap
xor a
ldh [hBGMapMode], a
ld b, CGB_PLAYER_OR_MON_FRONTPIC_PALS
call GetCGBLayout
call SetDefaultBGPAndOBP
call HOF_SlideBackpic
xor a
ld [wBoxAlignment], a
hlcoord 0, 0
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
ld a, " "
call ByteFill
hlcoord 6, 5
call _PrepMonFrontpic
call WaitBGMap
xor a
ldh [hBGMapMode], a
ldh [hSCY], a
call HOF_SlideFrontpic
ret
HOF_SlideBackpic:
.backpicloop
ldh a, [hSCX]
cp $70
ret z
add 4
ldh [hSCX], a
call DelayFrame
jr .backpicloop
HOF_SlideFrontpic:
.frontpicloop
ldh a, [hSCX]
and a
ret z
dec a
dec a
ldh [hSCX], a
call DelayFrame
jr .frontpicloop
_HallOfFamePC:
call LoadFontsBattleExtra
xor a
ld [wJumptableIndex], a
.MasterLoop:
call LoadHOFTeam
ret c
call .DisplayTeam
ret c
ld hl, wJumptableIndex
inc [hl]
jr .MasterLoop
.DisplayTeam:
xor a
ld [wHallOfFameMonCounter], a
.next
call .DisplayMonAndStrings
jr c, .start_button
.loop
call JoyTextDelay
ld hl, hJoyLast
ld a, [hl]
and B_BUTTON
jr nz, .b_button
ld a, [hl]
and A_BUTTON
jr nz, .a_button
ld a, [hl]
and START
jr nz, .start_button
call DelayFrame
jr .loop
.a_button
ld hl, wHallOfFameMonCounter
inc [hl]
jr .next
.b_button
scf
ret
.start_button
and a
ret
.DisplayMonAndStrings:
; Print the number of times the player has entered the Hall of Fame.
; If that number is at least HOF_MASTER_COUNT, print "HOF Master!" instead.
ld a, [wHallOfFameMonCounter]
cp PARTY_LENGTH
jr nc, .fail
ld hl, wHallOfFameTempMon1
ld bc, wHallOfFameTempMon1End - wHallOfFameTempMon1
call AddNTimes
ld a, [hl]
cp -1
jr nz, .okay
.fail
scf
ret
.okay
push hl
call ClearBGPalettes
pop hl
call DisplayHOFMon
; BUG: A "HOF Master!" title for 200-Time Famers is defined but inaccessible (see docs/bugs_and_glitches.md)
ld a, [wHallOfFameTempWinCount]
cp HOF_MASTER_COUNT + 1
jr c, .print_num_hof
ld de, .HOFMaster
hlcoord 1, 2
call PlaceString
hlcoord 13, 2
jr .finish
.print_num_hof
ld de, .TimeFamer
hlcoord 1, 2
call PlaceString
hlcoord 2, 2
ld de, wHallOfFameTempWinCount
lb bc, 1, 3
call PrintNum
hlcoord 11, 2
.finish
ld de, .EmptyString
call PlaceString
call WaitBGMap
ld b, CGB_PLAYER_OR_MON_FRONTPIC_PALS
call GetCGBLayout
call SetDefaultBGPAndOBP
decoord 6, 5
ld c, ANIM_MON_HOF
predef HOF_AnimateFrontpic
and a
ret
.EmptyString:
db "@"
.HOFMaster:
db " HOF Master!@"
.TimeFamer:
db " -Time Famer@"
LoadHOFTeam:
ld a, [wJumptableIndex]
cp NUM_HOF_TEAMS
jr nc, .invalid
ld hl, sHallOfFame
ld bc, wHallOfFameTempEnd - wHallOfFameTemp + 1
call AddNTimes
ld a, BANK(sHallOfFame)
call OpenSRAM
ld a, [hl]
and a
jr z, .absent
ld de, wHallOfFameTemp
ld bc, wHallOfFameTempEnd - wHallOfFameTemp + 1
call CopyBytes
call CloseSRAM
and a
ret
.absent
call CloseSRAM
.invalid
scf
ret
DisplayHOFMon:
xor a
ldh [hBGMapMode], a
ld a, [hli]
ld [wTempMonSpecies], a
ld a, [hli]
ld [wTempMonID], a
ld a, [hli]
ld [wTempMonID + 1], a
ld a, [hli]
ld [wTempMonDVs], a
ld a, [hli]
ld [wTempMonDVs + 1], a
ld a, [hli]
ld [wTempMonLevel], a
ld de, wStringBuffer2
ld bc, MON_NAME_LENGTH - 1
call CopyBytes
ld a, "@"
ld [wStringBuffer2 + MON_NAME_LENGTH - 1], a
hlcoord 0, 0
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
ld a, " "
call ByteFill
hlcoord 0, 0
lb bc, 3, SCREEN_WIDTH - 2
call Textbox1bpp
hlcoord 0, 12
lb bc, 4, SCREEN_WIDTH - 2
call Textbox1bpp
ld a, [wTempMonSpecies]
ld [wCurPartySpecies], a
ld [wTextDecimalByte], a
ld hl, wTempMonDVs
predef GetUnownLetter
xor a
ld [wBoxAlignment], a
hlcoord 6, 5
call _PrepMonFrontpic
ld a, [wCurPartySpecies]
cp EGG
jr z, .print_id_no
hlcoord 1, 13
ld a, "№"
ld [hli], a
ld [hl], "."
hlcoord 3, 13
ld de, wTextDecimalByte
lb bc, PRINTNUM_LEADINGZEROS | 1, 3
call PrintNum
call GetBasePokemonName
hlcoord 7, 13
call PlaceString
ld a, TEMPMON
ld [wMonType], a
farcall GetGender
ld a, " "
jr c, .got_gender
ld a, "♂"
jr nz, .got_gender
ld a, "♀"
.got_gender
hlcoord 18, 13
ld [hli], a
hlcoord 8, 14
ld a, "/"
ld [hli], a
ld de, wStringBuffer2
call PlaceString
hlcoord 1, 16
call PrintLevel
.print_id_no
hlcoord 7, 16
ld a, "<ID>"
ld [hli], a
ld a, "№"
ld [hli], a
ld [hl], "/"
hlcoord 10, 16
ld de, wTempMonID
lb bc, PRINTNUM_LEADINGZEROS | 2, 5
call PrintNum
ret
HOF_AnimatePlayerPic:
call ClearBGPalettes
hlcoord 0, 0
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
ld a, " "
call ByteFill
farcall GetPlayerBackpic
ld a, $31
ldh [hGraphicStartTile], a
hlcoord 6, 6
lb bc, 6, 6
predef PlaceGraphic
ld a, $d0
ldh [hSCY], a
ld a, $90
ldh [hSCX], a
call WaitBGMap
xor a
ldh [hBGMapMode], a
ld [wCurPartySpecies], a
ld b, CGB_PLAYER_OR_MON_FRONTPIC_PALS
call GetCGBLayout
call SetDefaultBGPAndOBP
call HOF_SlideBackpic
xor a
ld [wBoxAlignment], a
hlcoord 0, 0
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
ld a, " "
call ByteFill
farcall HOF_LoadTrainerFrontpic
xor a
ldh [hGraphicStartTile], a
hlcoord 12, 5
lb bc, 7, 7
predef PlaceGraphic
ld a, $c0
ldh [hSCX], a
call WaitBGMap
xor a
ldh [hBGMapMode], a
ldh [hSCY], a
call HOF_SlideFrontpic
xor a
ldh [hBGMapMode], a
hlcoord 0, 2
lb bc, 8, 9
call Textbox1bpp
hlcoord 0, 12
lb bc, 4, 18
call Textbox1bpp
hlcoord 2, 4
ld de, wPlayerName
call PlaceString
hlcoord 1, 6
ld a, "<ID>"
ld [hli], a
ld a, "№"
ld [hli], a
ld [hl], "/"
hlcoord 4, 6
ld de, wPlayerID
lb bc, PRINTNUM_LEADINGZEROS | 2, 5
call PrintNum
hlcoord 1, 8
ld de, .PlayTime
call PlaceString
hlcoord 3, 9
ld de, wGameTimeHours
lb bc, 2, 3
call PrintNum
ld [hl], ":"
inc hl
ld de, wGameTimeMinutes
lb bc, PRINTNUM_LEADINGZEROS | 1, 2
call PrintNum
call WaitBGMap
farcall ProfOaksPCRating
ret
.PlayTime:
db "PLAY TIME@"