mirror of https://github.com/pret/pokecrystal.git
1420 lines
21 KiB
NASM
Executable File
1420 lines
21 KiB
NASM
Executable File
_MainMenu: ; 5ae8
|
|
ld de, MUSIC_NONE
|
|
call PlayMusic
|
|
call DelayFrame
|
|
ld de, MUSIC_MAIN_MENU
|
|
ld a, e
|
|
ld [wMapMusic], a
|
|
call PlayMusic
|
|
farcall MainMenu
|
|
jp StartTitleScreen
|
|
; 5b04
|
|
|
|
; unreferenced
|
|
ret
|
|
; 5b05
|
|
|
|
PrintDayOfWeek: ; 5b05
|
|
push de
|
|
ld hl, .Days
|
|
ld a, b
|
|
call GetNthString
|
|
ld d, h
|
|
ld e, l
|
|
pop hl
|
|
call PlaceString
|
|
ld h, b
|
|
ld l, c
|
|
ld de, .Day
|
|
call PlaceString
|
|
ret
|
|
; 5b1c
|
|
|
|
.Days: ; 5b1c
|
|
db "SUN@"
|
|
db "MON@"
|
|
db "TUES@"
|
|
db "WEDNES@"
|
|
db "THURS@"
|
|
db "FRI@"
|
|
db "SATUR@"
|
|
; 5b40
|
|
|
|
.Day: ; 5b40
|
|
db "DAY@"
|
|
; 5b44
|
|
|
|
NewGame_ClearTileMapEtc: ; 5b44
|
|
xor a
|
|
ld [hMapAnims], a
|
|
call ClearTileMap
|
|
call LoadFontsExtra
|
|
call LoadStandardFont
|
|
call ClearWindowData
|
|
ret
|
|
; 5b54
|
|
|
|
MysteryGift: ; 5b54
|
|
call UpdateTime
|
|
farcall DoMysteryGiftIfDayHasPassed
|
|
farcall DoMysteryGift
|
|
ret
|
|
; 5b64
|
|
|
|
OptionsMenu: ; 5b64
|
|
farcall _OptionsMenu
|
|
ret
|
|
; 5b6b
|
|
|
|
NewGame: ; 5b6b
|
|
xor a
|
|
ld [wMonStatusFlags], a
|
|
call ResetWRAM
|
|
call NewGame_ClearTileMapEtc
|
|
call AreYouABoyOrAreYouAGirl
|
|
call OakSpeech
|
|
call InitializeWorld
|
|
ld a, 1
|
|
ld [wPreviousLandmark], a
|
|
|
|
ld a, SPAWN_HOME
|
|
ld [DefaultSpawnpoint], a
|
|
|
|
ld a, MAPSETUP_WARP
|
|
ld [hMapEntryMethod], a
|
|
jp FinishContinueFunction
|
|
; 5b8f
|
|
|
|
AreYouABoyOrAreYouAGirl: ; 5b8f
|
|
farcall Mobile_AlwaysReturnNotCarry ; some mobile stuff
|
|
jr c, .ok
|
|
farcall InitGender
|
|
ret
|
|
|
|
.ok
|
|
ld c, 0
|
|
farcall InitMobileProfile ; mobile
|
|
ret
|
|
; 5ba7
|
|
|
|
ResetWRAM: ; 5ba7
|
|
xor a
|
|
ld [hBGMapMode], a
|
|
call _ResetWRAM
|
|
ret
|
|
; 5bae
|
|
|
|
_ResetWRAM: ; 5bae
|
|
|
|
ld hl, Sprites
|
|
ld bc, Options - Sprites
|
|
xor a
|
|
call ByteFill
|
|
|
|
ld hl, WRAM1_Begin
|
|
ld bc, wGameData - WRAM1_Begin
|
|
xor a
|
|
call ByteFill
|
|
|
|
ld hl, wGameData
|
|
ld bc, wGameDataEnd - wGameData
|
|
xor a
|
|
call ByteFill
|
|
|
|
ld a, [rLY]
|
|
ld [hSecondsBackup], a
|
|
call DelayFrame
|
|
ld a, [hRandomSub]
|
|
ld [PlayerID], a
|
|
|
|
ld a, [rLY]
|
|
ld [hSecondsBackup], a
|
|
call DelayFrame
|
|
ld a, [hRandomAdd]
|
|
ld [PlayerID + 1], a
|
|
|
|
call Random
|
|
ld [wSecretID], a
|
|
call DelayFrame
|
|
call Random
|
|
ld [wSecretID + 1], a
|
|
|
|
ld hl, PartyCount
|
|
call .InitList
|
|
|
|
xor a
|
|
ld [wCurBox], a
|
|
ld [wSavedAtLeastOnce], a
|
|
|
|
call SetDefaultBoxNames
|
|
|
|
ld a, BANK(sBoxCount)
|
|
call GetSRAMBank
|
|
ld hl, sBoxCount
|
|
call .InitList
|
|
call CloseSRAM
|
|
|
|
ld hl, NumItems
|
|
call .InitList
|
|
|
|
ld hl, NumKeyItems
|
|
call .InitList
|
|
|
|
ld hl, NumBalls
|
|
call .InitList
|
|
|
|
ld hl, PCItems
|
|
call .InitList
|
|
|
|
xor a
|
|
ld [wRoamMon1Species], a
|
|
ld [wRoamMon2Species], a
|
|
ld [wRoamMon3Species], a
|
|
ld a, -1
|
|
ld [wRoamMon1MapGroup], a
|
|
ld [wRoamMon2MapGroup], a
|
|
ld [wRoamMon3MapGroup], a
|
|
ld [wRoamMon1MapNumber], a
|
|
ld [wRoamMon2MapNumber], a
|
|
ld [wRoamMon3MapNumber], a
|
|
|
|
ld a, BANK(sMysteryGiftItem)
|
|
call GetSRAMBank
|
|
ld hl, sMysteryGiftItem
|
|
xor a
|
|
ld [hli], a
|
|
dec a
|
|
ld [hl], a
|
|
call CloseSRAM
|
|
|
|
call LoadOrRegenerateLuckyIDNumber
|
|
call InitializeMagikarpHouse
|
|
|
|
xor a
|
|
ld [MonType], a
|
|
|
|
ld [wJohtoBadges], a
|
|
ld [wKantoBadges], a
|
|
|
|
ld [Coins], a
|
|
ld [Coins + 1], a
|
|
|
|
if START_MONEY >= $10000
|
|
ld a, HIGH(START_MONEY >> 8)
|
|
endc
|
|
ld [Money], a
|
|
ld a, HIGH(START_MONEY) ; mid
|
|
ld [Money + 1], a
|
|
ld a, LOW(START_MONEY)
|
|
ld [Money + 2], a
|
|
|
|
xor a
|
|
ld [wWhichMomItem], a
|
|
|
|
ld hl, MomItemTriggerBalance
|
|
ld [hl], HIGH(MOM_MONEY >> 8)
|
|
inc hl
|
|
ld [hl], HIGH(MOM_MONEY) ; mid
|
|
inc hl
|
|
ld [hl], LOW(MOM_MONEY)
|
|
|
|
call InitializeNPCNames
|
|
|
|
farcall InitDecorations
|
|
|
|
farcall DeletePartyMonMail
|
|
|
|
farcall DeleteMobileEventIndex
|
|
|
|
call ResetGameTime
|
|
ret
|
|
; 5ca1
|
|
|
|
.InitList: ; 5ca1
|
|
; Loads 0 in the count and -1 in the first item or mon slot.
|
|
xor a
|
|
ld [hli], a
|
|
dec a
|
|
ld [hl], a
|
|
ret
|
|
; 5ca6
|
|
|
|
SetDefaultBoxNames: ; 5ca6
|
|
ld hl, wBoxNames
|
|
ld c, 0
|
|
.loop
|
|
push hl
|
|
ld de, .Box
|
|
call CopyName2
|
|
dec hl
|
|
ld a, c
|
|
inc a
|
|
cp 10
|
|
jr c, .less
|
|
sub 10
|
|
ld [hl], "1"
|
|
inc hl
|
|
|
|
.less
|
|
add "0"
|
|
ld [hli], a
|
|
ld [hl], "@"
|
|
pop hl
|
|
ld de, 9
|
|
add hl, de
|
|
inc c
|
|
ld a, c
|
|
cp NUM_BOXES
|
|
jr c, .loop
|
|
ret
|
|
|
|
.Box:
|
|
db "BOX@"
|
|
; 5cd3
|
|
|
|
InitializeMagikarpHouse: ; 5cd3
|
|
ld hl, wBestMagikarpLengthFeet
|
|
ld a, $3
|
|
ld [hli], a
|
|
ld a, $6
|
|
ld [hli], a
|
|
ld de, .Ralph
|
|
call CopyName2
|
|
ret
|
|
; 5ce3
|
|
|
|
.Ralph: ; 5ce3
|
|
db "RALPH@"
|
|
; 5ce9
|
|
|
|
InitializeNPCNames: ; 5ce9
|
|
ld hl, .Rival
|
|
ld de, RivalName
|
|
call .Copy
|
|
|
|
ld hl, .Mom
|
|
ld de, MomsName
|
|
call .Copy
|
|
|
|
ld hl, .Red
|
|
ld de, RedsName
|
|
call .Copy
|
|
|
|
ld hl, .Green
|
|
ld de, GreensName
|
|
|
|
.Copy:
|
|
ld bc, NAME_LENGTH
|
|
call CopyBytes
|
|
ret
|
|
|
|
.Rival: db "???@"
|
|
.Red: db "RED@"
|
|
.Green: db "GREEN@"
|
|
.Mom: db "MOM@"
|
|
; 5d23
|
|
|
|
InitializeWorld: ; 5d23
|
|
call ShrinkPlayer
|
|
farcall SpawnPlayer
|
|
farcall _InitializeStartDay
|
|
ret
|
|
; 5d33
|
|
|
|
LoadOrRegenerateLuckyIDNumber: ; 5d33
|
|
ld a, BANK(sLuckyIDNumber)
|
|
call GetSRAMBank
|
|
ld a, [CurDay]
|
|
inc a
|
|
ld b, a
|
|
ld a, [sLuckyNumberDay]
|
|
cp b
|
|
ld a, [sLuckyIDNumber + 1]
|
|
ld c, a
|
|
ld a, [sLuckyIDNumber]
|
|
jr z, .skip
|
|
ld a, b
|
|
ld [sLuckyNumberDay], a
|
|
call Random
|
|
ld c, a
|
|
call Random
|
|
|
|
.skip
|
|
ld [wLuckyIDNumber], a
|
|
ld [sLuckyIDNumber], a
|
|
ld a, c
|
|
ld [wLuckyIDNumber + 1], a
|
|
ld [sLuckyIDNumber + 1], a
|
|
jp CloseSRAM
|
|
; 5d65
|
|
|
|
Continue: ; 5d65
|
|
farcall TryLoadSaveFile
|
|
jr c, .FailToLoad
|
|
farcall _LoadData
|
|
call LoadStandardMenuDataHeader
|
|
call DisplaySaveInfoOnContinue
|
|
ld a, $1
|
|
ld [hBGMapMode], a
|
|
ld c, 20
|
|
call DelayFrames
|
|
call ConfirmContinue
|
|
jr nc, .Check1Pass
|
|
call CloseWindow
|
|
jr .FailToLoad
|
|
|
|
.Check1Pass:
|
|
call Continue_CheckRTC_RestartClock
|
|
jr nc, .Check2Pass
|
|
call CloseWindow
|
|
jr .FailToLoad
|
|
|
|
.Check2Pass:
|
|
ld a, $8
|
|
ld [MusicFade], a
|
|
ld a, LOW(MUSIC_NONE)
|
|
ld [MusicFadeID], a
|
|
ld a, HIGH(MUSIC_NONE)
|
|
ld [MusicFadeID + 1], a
|
|
call ClearBGPalettes
|
|
call Continue_MobileAdapterMenu
|
|
call CloseWindow
|
|
call ClearTileMap
|
|
ld c, 20
|
|
call DelayFrames
|
|
farcall JumpRoamMons
|
|
farcall MysteryGift_CopyReceivedDecosToPC ; Mystery Gift
|
|
farcall Function140ae ; time-related
|
|
ld a, [wSpawnAfterChampion]
|
|
cp SPAWN_LANCE
|
|
jr z, .SpawnAfterE4
|
|
ld a, MAPSETUP_CONTINUE
|
|
ld [hMapEntryMethod], a
|
|
jp FinishContinueFunction
|
|
|
|
.FailToLoad:
|
|
ret
|
|
|
|
.SpawnAfterE4:
|
|
ld a, SPAWN_NEW_BARK
|
|
ld [DefaultSpawnpoint], a
|
|
call PostCreditsSpawn
|
|
jp FinishContinueFunction
|
|
; 5de2
|
|
|
|
SpawnAfterRed: ; 5de2
|
|
ld a, SPAWN_MT_SILVER
|
|
ld [DefaultSpawnpoint], a
|
|
; 5de7
|
|
|
|
PostCreditsSpawn: ; 5de7
|
|
xor a
|
|
ld [wSpawnAfterChampion], a
|
|
ld a, MAPSETUP_WARP
|
|
ld [hMapEntryMethod], a
|
|
ret
|
|
; 5df0
|
|
|
|
Continue_MobileAdapterMenu: ; 5df0
|
|
farcall Mobile_AlwaysReturnNotCarry ; mobile check
|
|
ret nc
|
|
|
|
; the rest of this stuff is never reached because
|
|
; the previous function returns with carry not set
|
|
ld hl, wd479
|
|
bit 1, [hl]
|
|
ret nz
|
|
ld a, 5
|
|
ld [MusicFade], a
|
|
ld a, LOW(MUSIC_MOBILE_ADAPTER_MENU)
|
|
ld [MusicFadeID], a
|
|
ld a, HIGH(MUSIC_MOBILE_ADAPTER_MENU)
|
|
ld [MusicFadeID + 1], a
|
|
ld c, 20
|
|
call DelayFrames
|
|
ld c, $1
|
|
farcall InitMobileProfile ; mobile
|
|
farcall _SaveData
|
|
ld a, 8
|
|
ld [MusicFade], a
|
|
ld a, LOW(MUSIC_NONE)
|
|
ld [MusicFadeID], a
|
|
ld a, HIGH(MUSIC_NONE)
|
|
ld [MusicFadeID + 1], a
|
|
ld c, 35
|
|
call DelayFrames
|
|
ret
|
|
; 5e34
|
|
|
|
ConfirmContinue: ; 5e34
|
|
.loop
|
|
call DelayFrame
|
|
call GetJoypad
|
|
ld hl, hJoyPressed
|
|
bit A_BUTTON_F, [hl]
|
|
jr nz, .PressA
|
|
bit B_BUTTON_F, [hl]
|
|
jr z, .loop
|
|
scf
|
|
ret
|
|
|
|
.PressA:
|
|
ret
|
|
; 5e48
|
|
|
|
Continue_CheckRTC_RestartClock: ; 5e48
|
|
call CheckRTCStatus
|
|
and %10000000 ; Day count exceeded 16383
|
|
jr z, .pass
|
|
farcall RestartClock
|
|
ld a, c
|
|
and a
|
|
jr z, .pass
|
|
scf
|
|
ret
|
|
|
|
.pass
|
|
xor a
|
|
ret
|
|
; 5e5d
|
|
|
|
FinishContinueFunction: ; 5e5d
|
|
.loop
|
|
xor a
|
|
ld [wDontPlayMapMusicOnReload], a
|
|
ld [wLinkMode], a
|
|
ld hl, wGameTimerPause
|
|
set 0, [hl]
|
|
res 7, [hl]
|
|
ld hl, wEnteredMapFromContinue
|
|
set 1, [hl]
|
|
farcall OverworldLoop
|
|
ld a, [wSpawnAfterChampion]
|
|
cp SPAWN_RED
|
|
jr z, .AfterRed
|
|
jp Reset
|
|
|
|
.AfterRed:
|
|
call SpawnAfterRed
|
|
jr .loop
|
|
; 5e85
|
|
|
|
DisplaySaveInfoOnContinue: ; 5e85
|
|
call CheckRTCStatus
|
|
and %10000000
|
|
jr z, .clock_ok
|
|
lb de, 4, 8
|
|
call DisplayContinueDataWithRTCError
|
|
ret
|
|
|
|
.clock_ok
|
|
lb de, 4, 8
|
|
call DisplayNormalContinueData
|
|
ret
|
|
; 5e9a
|
|
|
|
DisplaySaveInfoOnSave: ; 5e9a
|
|
lb de, 4, 0
|
|
jr DisplayNormalContinueData
|
|
; 5e9f
|
|
|
|
DisplayNormalContinueData: ; 5e9f
|
|
call Continue_LoadMenuHeader
|
|
call Continue_DisplayBadgesDexPlayerName
|
|
call Continue_PrintGameTime
|
|
call LoadFontsExtra
|
|
call UpdateSprites
|
|
ret
|
|
; 5eaf
|
|
|
|
DisplayContinueDataWithRTCError: ; 5eaf
|
|
call Continue_LoadMenuHeader
|
|
call Continue_DisplayBadgesDexPlayerName
|
|
call Continue_UnknownGameTime
|
|
call LoadFontsExtra
|
|
call UpdateSprites
|
|
ret
|
|
; 5ebf
|
|
|
|
Continue_LoadMenuHeader: ; 5ebf
|
|
xor a
|
|
ld [hBGMapMode], a
|
|
ld hl, .MenuDataHeader_Dex
|
|
ld a, [wStatusFlags]
|
|
bit 0, a ; pokedex
|
|
jr nz, .pokedex_header
|
|
ld hl, .MenuDataHeader_NoDex
|
|
|
|
.pokedex_header
|
|
call _OffsetMenuDataHeader
|
|
call MenuBox
|
|
call PlaceVerticalMenuItems
|
|
ret
|
|
; 5ed9
|
|
|
|
.MenuDataHeader_Dex: ; 5ed9
|
|
db $40 ; flags
|
|
db 00, 00 ; start coords
|
|
db 09, 15 ; end coords
|
|
dw .MenuData2_Dex
|
|
db 1 ; default option
|
|
; 5ee1
|
|
|
|
.MenuData2_Dex: ; 5ee1
|
|
db $00 ; flags
|
|
db 4 ; items
|
|
db "PLAYER@"
|
|
db "BADGES@"
|
|
db "#DEX@"
|
|
db "TIME@"
|
|
; 5efb
|
|
|
|
.MenuDataHeader_NoDex: ; 5efb
|
|
db $40 ; flags
|
|
db 00, 00 ; start coords
|
|
db 09, 15 ; end coords
|
|
dw .MenuData2_NoDex
|
|
db 1 ; default option
|
|
; 5f03
|
|
|
|
.MenuData2_NoDex: ; 5f03
|
|
db $00 ; flags
|
|
db 4 ; items
|
|
db "PLAYER <PLAYER>@"
|
|
db "BADGES@"
|
|
db " @"
|
|
db "TIME@"
|
|
; 5f1c
|
|
|
|
|
|
Continue_DisplayBadgesDexPlayerName: ; 5f1c
|
|
call MenuBoxCoord2Tile
|
|
push hl
|
|
decoord 13, 4, 0
|
|
add hl, de
|
|
call Continue_DisplayBadgeCount
|
|
pop hl
|
|
push hl
|
|
decoord 12, 6, 0
|
|
add hl, de
|
|
call Continue_DisplayPokedexNumCaught
|
|
pop hl
|
|
push hl
|
|
decoord 8, 2, 0
|
|
add hl, de
|
|
ld de, .Player
|
|
call PlaceString
|
|
pop hl
|
|
ret
|
|
|
|
.Player:
|
|
db "<PLAYER>@"
|
|
; 5f40
|
|
|
|
Continue_PrintGameTime: ; 5f40
|
|
decoord 9, 8, 0
|
|
add hl, de
|
|
call Continue_DisplayGameTime
|
|
ret
|
|
; 5f48
|
|
|
|
Continue_UnknownGameTime: ; 5f48
|
|
decoord 9, 8, 0
|
|
add hl, de
|
|
ld de, .three_question_marks
|
|
call PlaceString
|
|
ret
|
|
|
|
.three_question_marks
|
|
db " ???@"
|
|
; 5f58
|
|
|
|
Continue_DisplayBadgeCount: ; 5f58
|
|
push hl
|
|
ld hl, wJohtoBadges
|
|
ld b, 2
|
|
call CountSetBits
|
|
pop hl
|
|
ld de, wd265
|
|
lb bc, 1, 2
|
|
jp PrintNum
|
|
; 5f6b
|
|
|
|
Continue_DisplayPokedexNumCaught: ; 5f6b
|
|
ld a, [wStatusFlags]
|
|
bit 0, a ; Pokedex
|
|
ret z
|
|
push hl
|
|
ld hl, PokedexCaught
|
|
if NUM_POKEMON % 8
|
|
ld b, NUM_POKEMON / 8 + 1
|
|
else
|
|
ld b, NUM_POKEMON / 8
|
|
endc
|
|
call CountSetBits
|
|
pop hl
|
|
ld de, wd265
|
|
lb bc, 1, 3
|
|
jp PrintNum
|
|
; 5f84
|
|
|
|
Continue_DisplayGameTime: ; 5f84
|
|
ld de, GameTimeHours
|
|
lb bc, 2, 3
|
|
call PrintNum
|
|
ld [hl], "<COLON>"
|
|
inc hl
|
|
ld de, GameTimeMinutes
|
|
lb bc, PRINTNUM_LEADINGZEROS | 1, 2
|
|
jp PrintNum
|
|
; 5f99
|
|
|
|
|
|
OakSpeech: ; 0x5f99
|
|
farcall InitClock
|
|
call RotateFourPalettesLeft
|
|
call ClearTileMap
|
|
|
|
ld de, MUSIC_ROUTE_30
|
|
call PlayMusic
|
|
|
|
call RotateFourPalettesRight
|
|
call RotateThreePalettesRight
|
|
xor a
|
|
ld [CurPartySpecies], a
|
|
ld a, POKEMON_PROF
|
|
ld [TrainerClass], a
|
|
call Intro_PrepTrainerPic
|
|
|
|
ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
|
|
call GetSGBLayout
|
|
call Intro_RotatePalettesLeftFrontpic
|
|
|
|
ld hl, OakText1
|
|
call PrintText
|
|
call RotateThreePalettesRight
|
|
call ClearTileMap
|
|
|
|
ld a, WOOPER
|
|
ld [CurSpecies], a
|
|
ld [CurPartySpecies], a
|
|
call GetBaseData
|
|
|
|
hlcoord 6, 4
|
|
call PrepMonFrontpic
|
|
|
|
xor a
|
|
ld [TempMonDVs], a
|
|
ld [TempMonDVs + 1], a
|
|
|
|
ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
|
|
call GetSGBLayout
|
|
call Intro_WipeInFrontpic
|
|
|
|
ld hl, OakText2
|
|
call PrintText
|
|
ld hl, OakText4
|
|
call PrintText
|
|
call RotateThreePalettesRight
|
|
call ClearTileMap
|
|
|
|
xor a
|
|
ld [CurPartySpecies], a
|
|
ld a, POKEMON_PROF
|
|
ld [TrainerClass], a
|
|
call Intro_PrepTrainerPic
|
|
|
|
ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
|
|
call GetSGBLayout
|
|
call Intro_RotatePalettesLeftFrontpic
|
|
|
|
ld hl, OakText5
|
|
call PrintText
|
|
call RotateThreePalettesRight
|
|
call ClearTileMap
|
|
|
|
xor a
|
|
ld [CurPartySpecies], a
|
|
farcall DrawIntroPlayerPic
|
|
|
|
ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
|
|
call GetSGBLayout
|
|
call Intro_RotatePalettesLeftFrontpic
|
|
|
|
ld hl, OakText6
|
|
call PrintText
|
|
call NamePlayer
|
|
ld hl, OakText7
|
|
call PrintText
|
|
ret
|
|
|
|
OakText1: ; 0x6045
|
|
text_jump _OakText1
|
|
db "@"
|
|
|
|
OakText2: ; 0x604a
|
|
text_jump _OakText2
|
|
start_asm
|
|
ld a, WOOPER
|
|
call PlayCry
|
|
call WaitSFX
|
|
ld hl, OakText3
|
|
ret
|
|
|
|
OakText3: ; 0x605b
|
|
text_jump _OakText3
|
|
db "@"
|
|
|
|
OakText4: ; 0x6060
|
|
text_jump _OakText4
|
|
db "@"
|
|
|
|
OakText5: ; 0x6065
|
|
text_jump _OakText5
|
|
db "@"
|
|
|
|
OakText6: ; 0x606a
|
|
text_jump _OakText6
|
|
db "@"
|
|
|
|
OakText7: ; 0x606f
|
|
text_jump _OakText7
|
|
db "@"
|
|
|
|
NamePlayer: ; 0x6074
|
|
farcall MovePlayerPicRight
|
|
farcall ShowPlayerNamingChoices
|
|
ld a, [wMenuCursorY]
|
|
dec a
|
|
jr z, .NewName
|
|
call StorePlayerName
|
|
farcall ApplyMonOrTrainerPals
|
|
farcall MovePlayerPicLeft
|
|
ret
|
|
|
|
.NewName:
|
|
ld b, 1
|
|
ld de, PlayerName
|
|
farcall NamingScreen
|
|
|
|
call RotateThreePalettesRight
|
|
call ClearTileMap
|
|
|
|
call LoadFontsExtra
|
|
call WaitBGMap
|
|
|
|
xor a
|
|
ld [CurPartySpecies], a
|
|
farcall DrawIntroPlayerPic
|
|
|
|
ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
|
|
call GetSGBLayout
|
|
call RotateThreePalettesLeft
|
|
|
|
ld hl, PlayerName
|
|
ld de, .Chris
|
|
ld a, [wPlayerGender]
|
|
bit 0, a
|
|
jr z, .Male
|
|
ld de, .Kris
|
|
.Male:
|
|
call InitName
|
|
ret
|
|
|
|
.Chris:
|
|
db "CHRIS@@@@@@"
|
|
.Kris:
|
|
db "KRIS@@@@@@@"
|
|
; 60e9
|
|
|
|
Function60e9: ; Unreferenced
|
|
call LoadMenuDataHeader
|
|
call VerticalMenu
|
|
ld a, [wMenuCursorY]
|
|
dec a
|
|
call CopyNameFromMenu
|
|
call CloseWindow
|
|
ret
|
|
; 60fa
|
|
|
|
StorePlayerName: ; 60fa
|
|
ld a, "@"
|
|
ld bc, NAME_LENGTH
|
|
ld hl, PlayerName
|
|
call ByteFill
|
|
ld hl, PlayerName
|
|
ld de, StringBuffer2
|
|
call CopyName2
|
|
ret
|
|
; 610f
|
|
|
|
ShrinkPlayer: ; 610f
|
|
|
|
ld a, [hROMBank]
|
|
push af
|
|
|
|
ld a, 0 << 7 | 32 ; fade out
|
|
ld [MusicFade], a
|
|
ld de, MUSIC_NONE
|
|
ld a, e
|
|
ld [MusicFadeID], a
|
|
ld a, d
|
|
ld [MusicFadeID + 1], a
|
|
|
|
ld de, SFX_ESCAPE_ROPE
|
|
call PlaySFX
|
|
pop af
|
|
rst Bankswitch
|
|
|
|
ld c, 8
|
|
call DelayFrames
|
|
|
|
ld hl, Shrink1Pic
|
|
ld b, BANK(Shrink1Pic)
|
|
call ShrinkFrame
|
|
|
|
ld c, 8
|
|
call DelayFrames
|
|
|
|
ld hl, Shrink2Pic
|
|
ld b, BANK(Shrink2Pic)
|
|
call ShrinkFrame
|
|
|
|
ld c, 8
|
|
call DelayFrames
|
|
|
|
hlcoord 6, 5
|
|
ld b, 7
|
|
ld c, 7
|
|
call ClearBox
|
|
|
|
ld c, 3
|
|
call DelayFrames
|
|
|
|
call Intro_PlacePlayerSprite
|
|
call LoadFontsExtra
|
|
|
|
ld c, 50
|
|
call DelayFrames
|
|
|
|
call RotateThreePalettesRight
|
|
call ClearTileMap
|
|
ret
|
|
; 616a
|
|
|
|
Intro_RotatePalettesLeftFrontpic: ; 616a
|
|
ld hl, IntroFadePalettes
|
|
ld b, IntroFadePalettesEnd - IntroFadePalettes
|
|
.loop
|
|
ld a, [hli]
|
|
call DmgToCgbBGPals
|
|
ld c, 10
|
|
call DelayFrames
|
|
dec b
|
|
jr nz, .loop
|
|
ret
|
|
; 617c
|
|
|
|
IntroFadePalettes: ; 0x617c
|
|
db %01010100
|
|
db %10101000
|
|
db %11111100
|
|
db %11111000
|
|
db %11110100
|
|
db %11100100
|
|
IntroFadePalettesEnd
|
|
; 6182
|
|
|
|
Intro_WipeInFrontpic: ; 6182
|
|
ld a, $77
|
|
ld [hWX], a
|
|
call DelayFrame
|
|
ld a, %11100100
|
|
call DmgToCgbBGPals
|
|
.loop
|
|
call DelayFrame
|
|
ld a, [hWX]
|
|
sub $8
|
|
cp -1
|
|
ret z
|
|
ld [hWX], a
|
|
jr .loop
|
|
; 619c
|
|
|
|
Intro_PrepTrainerPic: ; 619c
|
|
ld de, vTiles2
|
|
farcall GetTrainerPic
|
|
xor a
|
|
ld [hGraphicStartTile], a
|
|
hlcoord 6, 4
|
|
lb bc, 7, 7
|
|
predef PlaceGraphic
|
|
ret
|
|
; 61b4
|
|
|
|
ShrinkFrame: ; 61b4
|
|
ld de, vTiles2
|
|
ld c, $31
|
|
predef DecompressPredef
|
|
xor a
|
|
ld [hGraphicStartTile], a
|
|
hlcoord 6, 4
|
|
lb bc, 7, 7
|
|
predef PlaceGraphic
|
|
ret
|
|
; 61cd
|
|
|
|
Intro_PlacePlayerSprite: ; 61cd
|
|
|
|
farcall GetPlayerIcon
|
|
ld c, $c
|
|
ld hl, vTiles0
|
|
call Request2bpp
|
|
|
|
ld hl, Sprites
|
|
ld de, .sprites
|
|
ld a, [de]
|
|
inc de
|
|
|
|
ld c, a
|
|
.loop
|
|
ld a, [de]
|
|
inc de
|
|
ld [hli], a
|
|
ld a, [de]
|
|
inc de
|
|
ld [hli], a
|
|
ld a, [de]
|
|
inc de
|
|
ld [hli], a
|
|
|
|
ld b, 0
|
|
ld a, [wPlayerGender]
|
|
bit 0, a
|
|
jr z, .male
|
|
ld b, 1
|
|
.male
|
|
ld a, b
|
|
|
|
ld [hli], a
|
|
dec c
|
|
jr nz, .loop
|
|
ret
|
|
; 61fe
|
|
|
|
.sprites ; 61fe
|
|
db 4
|
|
db 9 * 8 + 4, 9 * 8, 0
|
|
db 9 * 8 + 4, 10 * 8, 1
|
|
db 10 * 8 + 4, 9 * 8, 2
|
|
db 10 * 8 + 4, 10 * 8, 3
|
|
; 620b
|
|
|
|
|
|
CrystalIntroSequence: ; 620b
|
|
callfar Copyright_GFPresents
|
|
jr c, StartTitleScreen
|
|
farcall CrystalIntro
|
|
|
|
StartTitleScreen: ; 6219
|
|
ld a, [rSVBK]
|
|
push af
|
|
ld a, $5
|
|
ld [rSVBK], a
|
|
|
|
call .TitleScreen
|
|
call DelayFrame
|
|
.loop
|
|
call RunTitleScreen
|
|
jr nc, .loop
|
|
|
|
call ClearSprites
|
|
call ClearBGPalettes
|
|
|
|
pop af
|
|
ld [rSVBK], a
|
|
|
|
ld hl, rLCDC
|
|
res rLCDC_SPRITE_SIZE, [hl] ; 8x8
|
|
call ClearScreen
|
|
call WaitBGMap2
|
|
xor a
|
|
ld [hLCDCPointer], a
|
|
ld [hSCX], a
|
|
ld [hSCY], a
|
|
ld a, $7
|
|
ld [hWX], a
|
|
ld a, $90
|
|
ld [hWY], a
|
|
ld b, SCGB_DIPLOMA
|
|
call GetSGBLayout
|
|
call UpdateTimePals
|
|
ld a, [wIntroSceneFrameCounter]
|
|
cp $5
|
|
jr c, .ok
|
|
xor a
|
|
.ok
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, .dw
|
|
add hl, de
|
|
add hl, de
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
jp hl
|
|
; 626a
|
|
|
|
.dw
|
|
dw _MainMenu
|
|
dw DeleteSaveData
|
|
dw CrystalIntroSequence
|
|
dw CrystalIntroSequence
|
|
dw ResetClock
|
|
; 6274
|
|
|
|
|
|
.TitleScreen: ; 6274
|
|
farcall _TitleScreen
|
|
ret
|
|
; 627b
|
|
|
|
RunTitleScreen: ; 627b
|
|
ld a, [wJumptableIndex]
|
|
bit 7, a
|
|
jr nz, .done_title
|
|
call TitleScreenScene
|
|
farcall SuicuneFrameIterator
|
|
call DelayFrame
|
|
and a
|
|
ret
|
|
|
|
.done_title
|
|
scf
|
|
ret
|
|
; 6292
|
|
|
|
Function6292: ; 6292 ; unreferenced
|
|
ld a, [hVBlankCounter]
|
|
and $7
|
|
ret nz
|
|
ld hl, LYOverrides + $5f
|
|
ld a, [hl]
|
|
dec a
|
|
ld bc, 2 * SCREEN_WIDTH
|
|
call ByteFill
|
|
ret
|
|
; 62a3
|
|
|
|
TitleScreenScene: ; 62a3
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, .scenes
|
|
add hl, de
|
|
add hl, de
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
jp hl
|
|
; 62af
|
|
|
|
.scenes
|
|
dw TitleScreenEntrance
|
|
dw TitleScreenTimer
|
|
dw TitleScreenMain
|
|
dw TitleScreenEnd
|
|
; 62b7
|
|
|
|
.NextScene: ; Unreferenced
|
|
ld hl, wJumptableIndex
|
|
inc [hl]
|
|
ret
|
|
; 62bc
|
|
|
|
|
|
TitleScreenEntrance: ; 62bc
|
|
|
|
; Animate the logo:
|
|
; Move each line by 4 pixels until our count hits 0.
|
|
ld a, [hSCX]
|
|
and a
|
|
jr z, .done
|
|
sub 4
|
|
ld [hSCX], a
|
|
|
|
; Lay out a base (all lines scrolling together).
|
|
ld e, a
|
|
ld hl, LYOverrides
|
|
ld bc, 8 * 10 ; logo height
|
|
call ByteFill
|
|
|
|
; Reversed signage for every other line's position.
|
|
; This is responsible for the interlaced effect.
|
|
ld a, e
|
|
xor $ff
|
|
inc a
|
|
|
|
ld b, 8 * 10 / 2 ; logo height / 2
|
|
ld hl, LYOverrides + 1
|
|
.loop
|
|
ld [hli], a
|
|
inc hl
|
|
dec b
|
|
jr nz, .loop
|
|
|
|
farcall AnimateTitleCrystal
|
|
ret
|
|
|
|
.done
|
|
; Next scene
|
|
ld hl, wJumptableIndex
|
|
inc [hl]
|
|
xor a
|
|
ld [hLCDCPointer], a
|
|
|
|
; Play the title screen music.
|
|
ld de, MUSIC_TITLE
|
|
call PlayMusic
|
|
|
|
ld a, $88
|
|
ld [hWY], a
|
|
ret
|
|
; 62f6
|
|
|
|
|
|
TitleScreenTimer: ; 62f6
|
|
|
|
; Next scene
|
|
ld hl, wJumptableIndex
|
|
inc [hl]
|
|
|
|
; Start a timer
|
|
ld hl, wTitleScreenTimer
|
|
ld de, 73 * 60 + 36
|
|
ld [hl], e
|
|
inc hl
|
|
ld [hl], d
|
|
ret
|
|
; 6304
|
|
|
|
TitleScreenMain: ; 6304
|
|
|
|
; Run the timer down.
|
|
ld hl, wTitleScreenTimer
|
|
ld e, [hl]
|
|
inc hl
|
|
ld d, [hl]
|
|
ld a, e
|
|
or d
|
|
jr z, .end
|
|
|
|
dec de
|
|
ld [hl], d
|
|
dec hl
|
|
ld [hl], e
|
|
|
|
; Save data can be deleted by pressing Up + B + Select.
|
|
call GetJoypad
|
|
ld hl, hJoyDown
|
|
ld a, [hl]
|
|
and D_UP + B_BUTTON + SELECT
|
|
cp D_UP + B_BUTTON + SELECT
|
|
jr z, .delete_save_data
|
|
|
|
; To bring up the clock reset dialog:
|
|
|
|
; Hold Down + B + Select to initiate the sequence.
|
|
ld a, [hClockResetTrigger]
|
|
cp $34
|
|
jr z, .check_clock_reset
|
|
|
|
ld a, [hl]
|
|
and D_DOWN + B_BUTTON + SELECT
|
|
cp D_DOWN + B_BUTTON + SELECT
|
|
jr nz, .check_start
|
|
|
|
ld a, $34
|
|
ld [hClockResetTrigger], a
|
|
jr .check_start
|
|
|
|
; Keep Select pressed, and hold Left + Up.
|
|
; Then let go of Select.
|
|
.check_clock_reset
|
|
bit SELECT_F, [hl]
|
|
jr nz, .check_start
|
|
|
|
xor a
|
|
ld [hClockResetTrigger], a
|
|
|
|
ld a, [hl]
|
|
and D_LEFT + D_UP
|
|
cp D_LEFT + D_UP
|
|
jr z, .clock_reset
|
|
|
|
; Press Start or A to start the game.
|
|
.check_start
|
|
ld a, [hl]
|
|
and START | A_BUTTON
|
|
jr nz, .incave
|
|
ret
|
|
|
|
.incave
|
|
ld a, 0
|
|
jr .done
|
|
|
|
.delete_save_data
|
|
ld a, 1
|
|
|
|
.done
|
|
ld [wIntroSceneFrameCounter], a
|
|
|
|
; Return to the intro sequence.
|
|
ld hl, wJumptableIndex
|
|
set 7, [hl]
|
|
ret
|
|
|
|
.end
|
|
; Next scene
|
|
ld hl, wJumptableIndex
|
|
inc [hl]
|
|
|
|
; Fade out the title screen music
|
|
xor a
|
|
ld [MusicFadeID], a
|
|
ld [MusicFadeID + 1], a
|
|
ld hl, MusicFade
|
|
ld [hl], 8 ; 1 second
|
|
|
|
ld hl, wTitleScreenTimer
|
|
inc [hl]
|
|
ret
|
|
|
|
.clock_reset
|
|
ld a, 4
|
|
ld [wIntroSceneFrameCounter], a
|
|
|
|
; Return to the intro sequence.
|
|
ld hl, wJumptableIndex
|
|
set 7, [hl]
|
|
ret
|
|
; 6375
|
|
|
|
TitleScreenEnd: ; 6375
|
|
|
|
; Wait until the music is done fading.
|
|
|
|
ld hl, wTitleScreenTimer
|
|
inc [hl]
|
|
|
|
ld a, [MusicFade]
|
|
and a
|
|
ret nz
|
|
|
|
ld a, 2
|
|
ld [wIntroSceneFrameCounter], a
|
|
|
|
; Back to the intro.
|
|
ld hl, wJumptableIndex
|
|
set 7, [hl]
|
|
ret
|
|
; 6389
|
|
|
|
DeleteSaveData: ; 6389
|
|
farcall _DeleteSaveData
|
|
jp Init
|
|
; 6392
|
|
|
|
ResetClock: ; 6392
|
|
farcall _ResetClock
|
|
jp Init
|
|
; 639b
|
|
|
|
Function639b: ; unreferenced
|
|
; If bit 0 or 1 of [wTitleScreenTimer] is set, we don't need to be here.
|
|
ld a, [wTitleScreenTimer]
|
|
and $3
|
|
ret nz
|
|
ld bc, SpriteAnim10
|
|
ld hl, SPRITEANIMSTRUCT_FRAME
|
|
add hl, bc ; over-the-top compicated way to load wc3ae into hl
|
|
ld l, [hl]
|
|
ld h, 0
|
|
add hl, hl
|
|
add hl, hl
|
|
ld de, .Data63ca
|
|
add hl, de
|
|
; If bit 2 of [wTitleScreenTimer] is set, get the second dw; else, get the first dw
|
|
ld a, [wTitleScreenTimer]
|
|
and %00000100
|
|
srl a
|
|
srl a
|
|
ld e, a
|
|
ld d, 0
|
|
add hl, de
|
|
add hl, de
|
|
ld a, [hli]
|
|
and a
|
|
ret z
|
|
ld e, a
|
|
ld d, [hl]
|
|
ld a, SPRITE_ANIM_INDEX_GS_TITLE_TRAIL
|
|
call _InitSpriteAnimStruct
|
|
ret
|
|
; 63ca
|
|
|
|
.Data63ca: ; 63ca
|
|
; frame 0 y, x; frame 1 y, x
|
|
db 11 * 8 + 4, 10 * 8, 0 * 8, 0 * 8
|
|
db 11 * 8 + 4, 13 * 8, 11 * 8 + 4, 11 * 8
|
|
db 11 * 8 + 4, 13 * 8, 11 * 8 + 4, 15 * 8
|
|
db 11 * 8 + 4, 17 * 8, 11 * 8 + 4, 15 * 8
|
|
db 0 * 8, 0 * 8, 11 * 8 + 4, 15 * 8
|
|
db 0 * 8, 0 * 8, 11 * 8 + 4, 11 * 8
|
|
; 63e2
|
|
|
|
Copyright: ; 63e2
|
|
call ClearTileMap
|
|
call LoadFontsExtra
|
|
ld de, CopyrightGFX
|
|
ld hl, vTiles2 tile $60
|
|
lb bc, BANK(CopyrightGFX), $1d
|
|
call Request2bpp
|
|
hlcoord 2, 7
|
|
ld de, CopyrightString
|
|
jp PlaceString
|
|
; 63fd
|
|
|
|
CopyrightString: ; 63fd
|
|
; ©1995-2001 Nintendo
|
|
db $60, $61, $62, $63, $64, $65, $66
|
|
db $67, $68, $69, $6a, $6b, $6c
|
|
|
|
; ©1995-2001 Creatures inc.
|
|
next $60, $61, $62, $63, $64, $65, $66
|
|
db $6d, $6e, $6f, $70, $71, $72, $7a, $7b, $7c
|
|
|
|
; ©1995-2001 GAME FREAK inc.
|
|
next $60, $61, $62, $63, $64, $65, $66
|
|
db $73, $74, $75, $76, $77, $78, $79, $7a, $7b, $7c
|
|
|
|
db "@"
|
|
; 642e
|
|
|
|
GameInit:: ; 642e
|
|
farcall TryLoadSaveData
|
|
call ClearWindowData
|
|
call ClearBGPalettes
|
|
call ClearTileMap
|
|
ld a, HIGH(vBGMap0)
|
|
ld [hBGMapAddress + 1], a
|
|
xor a ; LOW(vBGMap0)
|
|
ld [hBGMapAddress], a
|
|
ld [hJoyDown], a
|
|
ld [hSCX], a
|
|
ld [hSCY], a
|
|
ld a, $90
|
|
ld [hWY], a
|
|
call WaitBGMap
|
|
jp CrystalIntroSequence
|
|
; 6454
|