ref: 60e21a86638cad5fd25133cda1c545461304d902
parent: 97c511cd2f271252cbc9e9746668081422231ca5
author: mid-kid <esteve.varela@gmail.com>
date: Wed Mar 14 09:38:36 EDT 2018
Move init_gender and intro_menu to menus They are actually some kind of menus, and as such make sense there.
--- a/engine/init_gender.asm
+++ /dev/null
@@ -1,111 +1,0 @@
-InitCrystalData: ; 48000
- ld a, $1
- ld [wd474], a
- xor a
- ld [wd473], a
- ld [wPlayerGender], a
- ld [wd475], a
- ld [wd476], a
- ld [wd477], a
- ld [wd478], a
- ld [wd002], a
- ld [wd003], a
- ; could have done "ld a, [wd479] \ and %11111100", saved four operations
- ld a, [wd479]
- res 0, a
- ld [wd479], a
- ld a, [wd479]
- res 1, a
- ld [wd479], a
- ret
-; 4802f
-
-INCLUDE "mobile/mobile_12.asm"
-
-InitGender: ; 48dcb (12:4dcb)
- call InitGenderScreen
- call LoadGenderScreenPal
- call LoadGenderScreenLightBlueTile
- call WaitBGMap2
- call SetPalettes
- ld hl, TextJump_AreYouABoyOrAreYouAGirl
- call PrintText
- ld hl, .MenuHeader
- call LoadMenuHeader
- call WaitBGMap2
- call VerticalMenu
- call CloseWindow
- ld a, [wMenuCursorY]
- dec a
- ld [wPlayerGender], a
- ld c, 10
- call DelayFrames
- ret
-; 48dfc (12:4dfc)
-
-.MenuHeader: ; 0x48dfc
- db MENU_BACKUP_TILES ; flags
- menu_coords 6, 4, 12, 9
- dw .MenuData
- db 1 ; default option
-; 0x48e04
-
-.MenuData: ; 0x48e04
- db STATICMENU_CURSOR | STATICMENU_WRAP | STATICMENU_DISABLE_B ; flags
- db 2 ; items
- db "Boy@"
- db "Girl@"
-; 0x48e0f
-
-TextJump_AreYouABoyOrAreYouAGirl: ; 0x48e0f
- ; Are you a boy? Or are you a girl?
- text_jump Text_AreYouABoyOrAreYouAGirl
- db "@"
-; 0x48e14
-
-InitGenderScreen: ; 48e14 (12:4e14)
- ld a, $10
- ld [wMusicFade], a
- ld a, MUSIC_NONE
- ld [wMusicFadeID], a
- ld a, $0
- ld [wMusicFadeID + 1], a
- ld c, 8
- call DelayFrames
- call ClearBGPalettes
- call InitCrystalData
- call LoadFontsExtra
- hlcoord 0, 0
- ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
- ld a, $0
- call ByteFill
- hlcoord 0, 0, wAttrMap
- ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
- xor a
- call ByteFill
- ret
-
-LoadGenderScreenPal: ; 48e47 (12:4e47)
- ld hl, .Palette
- ld de, wBGPals1
- ld bc, 1 palettes
- ld a, BANK(wBGPals1)
- call FarCopyWRAM
- farcall ApplyPals
- ret
-; 48e5c (12:4e5c)
-
-.Palette: ; 48e5c
-INCLUDE "gfx/new_game/gender_screen.pal"
-; 48e64
-
-LoadGenderScreenLightBlueTile: ; 48e64 (12:4e64)
- ld de, .LightBlueTile
- ld hl, vTiles2 tile $00
- lb bc, BANK(.LightBlueTile), 1
- call Get2bpp
- ret
-; 48e71 (12:4e71)
-
-.LightBlueTile: ; 48e71
-INCBIN "gfx/new_game/gender_screen.2bpp"
--- a/engine/intro_menu.asm
+++ /dev/null
@@ -1,1418 +1,0 @@
-_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
-
-; unused
- 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 [wDefaultSpawnpoint], 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, wVirtualOAM
- ld bc, wOptions - wVirtualOAM
- 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 [wPlayerID], a
-
- ld a, [rLY]
- ld [hSecondsBackup], a
- call DelayFrame
- ld a, [hRandomAdd]
- ld [wPlayerID + 1], a
-
- call Random
- ld [wSecretID], a
- call DelayFrame
- call Random
- ld [wSecretID + 1], a
-
- ld hl, wPartyCount
- 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, wNumItems
- call .InitList
-
- ld hl, wNumKeyItems
- call .InitList
-
- ld hl, wNumBalls
- call .InitList
-
- ld hl, wPCItems
- 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 [wMonType], a
-
- ld [wJohtoBadges], a
- ld [wKantoBadges], a
-
- ld [wCoins], a
- ld [wCoins + 1], a
-
-if START_MONEY >= $10000
- ld a, HIGH(START_MONEY >> 8)
-endc
- ld [wMoney], a
- ld a, HIGH(START_MONEY) ; mid
- ld [wMoney + 1], a
- ld a, LOW(START_MONEY)
- ld [wMoney + 2], a
-
- xor a
- ld [wWhichMomItem], a
-
- ld hl, wMomItemTriggerBalance
- 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, wRivalName
- call .Copy
-
- ld hl, .Mom
- ld de, wMomsName
- call .Copy
-
- ld hl, .Red
- ld de, wRedsName
- call .Copy
-
- ld hl, .Green
- ld de, wGreensName
-
-.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, [wCurDay]
- 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 LoadStandardMenuHeader
- 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 [wMusicFade], a
- ld a, LOW(MUSIC_NONE)
- ld [wMusicFadeID], a
- ld a, HIGH(MUSIC_NONE)
- ld [wMusicFadeID + 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 [wDefaultSpawnpoint], a
- call PostCreditsSpawn
- jp FinishContinueFunction
-; 5de2
-
-SpawnAfterRed: ; 5de2
- ld a, SPAWN_MT_SILVER
- ld [wDefaultSpawnpoint], 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 [wMusicFade], a
- ld a, LOW(MUSIC_MOBILE_ADAPTER_MENU)
- ld [wMusicFadeID], a
- ld a, HIGH(MUSIC_MOBILE_ADAPTER_MENU)
- ld [wMusicFadeID + 1], a
- ld c, 20
- call DelayFrames
- ld c, $1
- farcall InitMobileProfile ; mobile
- farcall _SaveData
- ld a, 8
- ld [wMusicFade], a
- ld a, LOW(MUSIC_NONE)
- ld [wMusicFadeID], a
- ld a, HIGH(MUSIC_NONE)
- ld [wMusicFadeID + 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 GAMETIMERPAUSE_TIMER_PAUSED_F, [hl]
- res GAMETIMERPAUSE_MOBILE_7_F, [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, .MenuHeader_Dex
- ld a, [wStatusFlags]
- bit STATUSFLAGS_POKEDEX_F, a
- jr nz, .show_menu
- ld hl, .MenuHeader_NoDex
-
-.show_menu
- call _OffsetMenuHeader
- call MenuBox
- call PlaceVerticalMenuItems
- ret
-; 5ed9
-
-.MenuHeader_Dex: ; 5ed9
- db MENU_BACKUP_TILES ; flags
- menu_coords 0, 0, 15, 9
- dw .MenuData_Dex
- db 1 ; default option
-; 5ee1
-
-.MenuData_Dex: ; 5ee1
- db 0 ; flags
- db 4 ; items
- db "PLAYER@"
- db "BADGES@"
- db "#DEX@"
- db "TIME@"
-; 5efb
-
-.MenuHeader_NoDex: ; 5efb
- db MENU_BACKUP_TILES ; flags
- menu_coords 0, 0, 15, 9
- dw .MenuData_NoDex
- db 1 ; default option
-; 5f03
-
-.MenuData_NoDex: ; 5f03
- db 0 ; 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 STATUSFLAGS_POKEDEX_F, a
- ret z
- push hl
- ld hl, wPokedexCaught
-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, wGameTimeHours
- lb bc, 2, 3
- call PrintNum
- ld [hl], "<COLON>"
- inc hl
- ld de, wGameTimeMinutes
- 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 [wCurPartySpecies], a
- ld a, POKEMON_PROF
- ld [wTrainerClass], 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 [wCurSpecies], a
- ld [wCurPartySpecies], a
- call GetBaseData
-
- hlcoord 6, 4
- call PrepMonFrontpic
-
- xor a
- ld [wTempMonDVs], a
- ld [wTempMonDVs + 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 [wCurPartySpecies], a
- ld a, POKEMON_PROF
- ld [wTrainerClass], 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 [wCurPartySpecies], 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 PlayMonCry
- 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, wPlayerName
- farcall NamingScreen
-
- call RotateThreePalettesRight
- call ClearTileMap
-
- call LoadFontsExtra
- call WaitBGMap
-
- xor a
- ld [wCurPartySpecies], a
- farcall DrawIntroPlayerPic
-
- ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
- call GetSGBLayout
- call RotateThreePalettesLeft
-
- ld hl, wPlayerName
- ld de, .Chris
- ld a, [wPlayerGender]
- bit PLAYERGENDER_FEMALE_F, a
- jr z, .Male
- ld de, .Kris
-.Male:
- call InitName
- ret
-
-.Chris:
- db "CHRIS@@@@@@"
-.Kris:
- db "KRIS@@@@@@@"
-; 60e9
-
-Unreferenced_Function60e9:
- call LoadMenuHeader
- call VerticalMenu
- ld a, [wMenuCursorY]
- dec a
- call CopyNameFromMenu
- call CloseWindow
- ret
-; 60fa
-
-StorePlayerName: ; 60fa
- ld a, "@"
- ld bc, NAME_LENGTH
- ld hl, wPlayerName
- call ByteFill
- ld hl, wPlayerName
- ld de, wStringBuffer2
- call CopyName2
- ret
-; 610f
-
-ShrinkPlayer: ; 610f
-
- ld a, [hROMBank]
- push af
-
- ld a, 32 ; fade time
- ld [wMusicFade], a
- ld de, MUSIC_NONE
- ld a, e
- ld [wMusicFadeID], a
- ld a, d
- ld [wMusicFadeID + 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, IntroFadePalettes.End - 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
-.End
-; 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, 7 * 7
- predef DecompressGet2bpp
- 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, wVirtualOAMSprite00
- ld de, .sprites
- ld a, [de]
- inc de
-
- ld c, a
-.loop
- ld a, [de]
- inc de
- ld [hli], a ; y
- ld a, [de]
- inc de
- ld [hli], a ; x
- ld a, [de]
- inc de
- ld [hli], a ; tile id
-
- ld b, PAL_OW_RED
- ld a, [wPlayerGender]
- bit PLAYERGENDER_FEMALE_F, a
- jr z, .male
- ld b, PAL_OW_BLUE
-.male
- ld a, b
-
- ld [hli], a
- dec c
- jr nz, .loop
- ret
-; 61fe
-
-.sprites ; 61fe
- db 4
- ; y pxl, x pxl, tile offset
- 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, BANK(wBGPals1)
- 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
-
-Unreferenced_Function6292: ; 6292
- ld a, [hVBlankCounter]
- and $7
- ret nz
- ld hl, wLYOverrides + $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
-
-.Unreferenced_NextScene:
- 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, wLYOverrides
- 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, wLYOverrides + 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 [wMusicFadeID], a
- ld [wMusicFadeID + 1], a
- ld hl, wMusicFade
- 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, [wMusicFade]
- 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
-
-Unreferenced_Function639b:
- ; If bit 0 or 1 of [wTitleScreenTimer] is set, we don't need to be here.
- ld a, [wTitleScreenTimer]
- and %00000011
- ret nz
- ld bc, wSpriteAnim10
- 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), 29
- 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
--- /dev/null
+++ b/engine/menus/init_gender.asm
@@ -1,0 +1,111 @@
+InitCrystalData: ; 48000
+ ld a, $1
+ ld [wd474], a
+ xor a
+ ld [wd473], a
+ ld [wPlayerGender], a
+ ld [wd475], a
+ ld [wd476], a
+ ld [wd477], a
+ ld [wd478], a
+ ld [wd002], a
+ ld [wd003], a
+ ; could have done "ld a, [wd479] \ and %11111100", saved four operations
+ ld a, [wd479]
+ res 0, a
+ ld [wd479], a
+ ld a, [wd479]
+ res 1, a
+ ld [wd479], a
+ ret
+; 4802f
+
+INCLUDE "mobile/mobile_12.asm"
+
+InitGender: ; 48dcb (12:4dcb)
+ call InitGenderScreen
+ call LoadGenderScreenPal
+ call LoadGenderScreenLightBlueTile
+ call WaitBGMap2
+ call SetPalettes
+ ld hl, TextJump_AreYouABoyOrAreYouAGirl
+ call PrintText
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ call WaitBGMap2
+ call VerticalMenu
+ call CloseWindow
+ ld a, [wMenuCursorY]
+ dec a
+ ld [wPlayerGender], a
+ ld c, 10
+ call DelayFrames
+ ret
+; 48dfc (12:4dfc)
+
+.MenuHeader: ; 0x48dfc
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 6, 4, 12, 9
+ dw .MenuData
+ db 1 ; default option
+; 0x48e04
+
+.MenuData: ; 0x48e04
+ db STATICMENU_CURSOR | STATICMENU_WRAP | STATICMENU_DISABLE_B ; flags
+ db 2 ; items
+ db "Boy@"
+ db "Girl@"
+; 0x48e0f
+
+TextJump_AreYouABoyOrAreYouAGirl: ; 0x48e0f
+ ; Are you a boy? Or are you a girl?
+ text_jump Text_AreYouABoyOrAreYouAGirl
+ db "@"
+; 0x48e14
+
+InitGenderScreen: ; 48e14 (12:4e14)
+ ld a, $10
+ ld [wMusicFade], a
+ ld a, MUSIC_NONE
+ ld [wMusicFadeID], a
+ ld a, $0
+ ld [wMusicFadeID + 1], a
+ ld c, 8
+ call DelayFrames
+ call ClearBGPalettes
+ call InitCrystalData
+ call LoadFontsExtra
+ hlcoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ ld a, $0
+ call ByteFill
+ hlcoord 0, 0, wAttrMap
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ xor a
+ call ByteFill
+ ret
+
+LoadGenderScreenPal: ; 48e47 (12:4e47)
+ ld hl, .Palette
+ ld de, wBGPals1
+ ld bc, 1 palettes
+ ld a, BANK(wBGPals1)
+ call FarCopyWRAM
+ farcall ApplyPals
+ ret
+; 48e5c (12:4e5c)
+
+.Palette: ; 48e5c
+INCLUDE "gfx/new_game/gender_screen.pal"
+; 48e64
+
+LoadGenderScreenLightBlueTile: ; 48e64 (12:4e64)
+ ld de, .LightBlueTile
+ ld hl, vTiles2 tile $00
+ lb bc, BANK(.LightBlueTile), 1
+ call Get2bpp
+ ret
+; 48e71 (12:4e71)
+
+.LightBlueTile: ; 48e71
+INCBIN "gfx/new_game/gender_screen.2bpp"
--- /dev/null
+++ b/engine/menus/intro_menu.asm
@@ -1,0 +1,1418 @@
+_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
+
+; unused
+ 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 [wDefaultSpawnpoint], 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, wVirtualOAM
+ ld bc, wOptions - wVirtualOAM
+ 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 [wPlayerID], a
+
+ ld a, [rLY]
+ ld [hSecondsBackup], a
+ call DelayFrame
+ ld a, [hRandomAdd]
+ ld [wPlayerID + 1], a
+
+ call Random
+ ld [wSecretID], a
+ call DelayFrame
+ call Random
+ ld [wSecretID + 1], a
+
+ ld hl, wPartyCount
+ 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, wNumItems
+ call .InitList
+
+ ld hl, wNumKeyItems
+ call .InitList
+
+ ld hl, wNumBalls
+ call .InitList
+
+ ld hl, wPCItems
+ 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 [wMonType], a
+
+ ld [wJohtoBadges], a
+ ld [wKantoBadges], a
+
+ ld [wCoins], a
+ ld [wCoins + 1], a
+
+if START_MONEY >= $10000
+ ld a, HIGH(START_MONEY >> 8)
+endc
+ ld [wMoney], a
+ ld a, HIGH(START_MONEY) ; mid
+ ld [wMoney + 1], a
+ ld a, LOW(START_MONEY)
+ ld [wMoney + 2], a
+
+ xor a
+ ld [wWhichMomItem], a
+
+ ld hl, wMomItemTriggerBalance
+ 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, wRivalName
+ call .Copy
+
+ ld hl, .Mom
+ ld de, wMomsName
+ call .Copy
+
+ ld hl, .Red
+ ld de, wRedsName
+ call .Copy
+
+ ld hl, .Green
+ ld de, wGreensName
+
+.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, [wCurDay]
+ 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 LoadStandardMenuHeader
+ 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 [wMusicFade], a
+ ld a, LOW(MUSIC_NONE)
+ ld [wMusicFadeID], a
+ ld a, HIGH(MUSIC_NONE)
+ ld [wMusicFadeID + 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 [wDefaultSpawnpoint], a
+ call PostCreditsSpawn
+ jp FinishContinueFunction
+; 5de2
+
+SpawnAfterRed: ; 5de2
+ ld a, SPAWN_MT_SILVER
+ ld [wDefaultSpawnpoint], 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 [wMusicFade], a
+ ld a, LOW(MUSIC_MOBILE_ADAPTER_MENU)
+ ld [wMusicFadeID], a
+ ld a, HIGH(MUSIC_MOBILE_ADAPTER_MENU)
+ ld [wMusicFadeID + 1], a
+ ld c, 20
+ call DelayFrames
+ ld c, $1
+ farcall InitMobileProfile ; mobile
+ farcall _SaveData
+ ld a, 8
+ ld [wMusicFade], a
+ ld a, LOW(MUSIC_NONE)
+ ld [wMusicFadeID], a
+ ld a, HIGH(MUSIC_NONE)
+ ld [wMusicFadeID + 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 GAMETIMERPAUSE_TIMER_PAUSED_F, [hl]
+ res GAMETIMERPAUSE_MOBILE_7_F, [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, .MenuHeader_Dex
+ ld a, [wStatusFlags]
+ bit STATUSFLAGS_POKEDEX_F, a
+ jr nz, .show_menu
+ ld hl, .MenuHeader_NoDex
+
+.show_menu
+ call _OffsetMenuHeader
+ call MenuBox
+ call PlaceVerticalMenuItems
+ ret
+; 5ed9
+
+.MenuHeader_Dex: ; 5ed9
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 0, 0, 15, 9
+ dw .MenuData_Dex
+ db 1 ; default option
+; 5ee1
+
+.MenuData_Dex: ; 5ee1
+ db 0 ; flags
+ db 4 ; items
+ db "PLAYER@"
+ db "BADGES@"
+ db "#DEX@"
+ db "TIME@"
+; 5efb
+
+.MenuHeader_NoDex: ; 5efb
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 0, 0, 15, 9
+ dw .MenuData_NoDex
+ db 1 ; default option
+; 5f03
+
+.MenuData_NoDex: ; 5f03
+ db 0 ; 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 STATUSFLAGS_POKEDEX_F, a
+ ret z
+ push hl
+ ld hl, wPokedexCaught
+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, wGameTimeHours
+ lb bc, 2, 3
+ call PrintNum
+ ld [hl], "<COLON>"
+ inc hl
+ ld de, wGameTimeMinutes
+ 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 [wCurPartySpecies], a
+ ld a, POKEMON_PROF
+ ld [wTrainerClass], 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 [wCurSpecies], a
+ ld [wCurPartySpecies], a
+ call GetBaseData
+
+ hlcoord 6, 4
+ call PrepMonFrontpic
+
+ xor a
+ ld [wTempMonDVs], a
+ ld [wTempMonDVs + 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 [wCurPartySpecies], a
+ ld a, POKEMON_PROF
+ ld [wTrainerClass], 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 [wCurPartySpecies], 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 PlayMonCry
+ 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, wPlayerName
+ farcall NamingScreen
+
+ call RotateThreePalettesRight
+ call ClearTileMap
+
+ call LoadFontsExtra
+ call WaitBGMap
+
+ xor a
+ ld [wCurPartySpecies], a
+ farcall DrawIntroPlayerPic
+
+ ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
+ call GetSGBLayout
+ call RotateThreePalettesLeft
+
+ ld hl, wPlayerName
+ ld de, .Chris
+ ld a, [wPlayerGender]
+ bit PLAYERGENDER_FEMALE_F, a
+ jr z, .Male
+ ld de, .Kris
+.Male:
+ call InitName
+ ret
+
+.Chris:
+ db "CHRIS@@@@@@"
+.Kris:
+ db "KRIS@@@@@@@"
+; 60e9
+
+Unreferenced_Function60e9:
+ call LoadMenuHeader
+ call VerticalMenu
+ ld a, [wMenuCursorY]
+ dec a
+ call CopyNameFromMenu
+ call CloseWindow
+ ret
+; 60fa
+
+StorePlayerName: ; 60fa
+ ld a, "@"
+ ld bc, NAME_LENGTH
+ ld hl, wPlayerName
+ call ByteFill
+ ld hl, wPlayerName
+ ld de, wStringBuffer2
+ call CopyName2
+ ret
+; 610f
+
+ShrinkPlayer: ; 610f
+
+ ld a, [hROMBank]
+ push af
+
+ ld a, 32 ; fade time
+ ld [wMusicFade], a
+ ld de, MUSIC_NONE
+ ld a, e
+ ld [wMusicFadeID], a
+ ld a, d
+ ld [wMusicFadeID + 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, IntroFadePalettes.End - 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
+.End
+; 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, 7 * 7
+ predef DecompressGet2bpp
+ 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, wVirtualOAMSprite00
+ ld de, .sprites
+ ld a, [de]
+ inc de
+
+ ld c, a
+.loop
+ ld a, [de]
+ inc de
+ ld [hli], a ; y
+ ld a, [de]
+ inc de
+ ld [hli], a ; x
+ ld a, [de]
+ inc de
+ ld [hli], a ; tile id
+
+ ld b, PAL_OW_RED
+ ld a, [wPlayerGender]
+ bit PLAYERGENDER_FEMALE_F, a
+ jr z, .male
+ ld b, PAL_OW_BLUE
+.male
+ ld a, b
+
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ret
+; 61fe
+
+.sprites ; 61fe
+ db 4
+ ; y pxl, x pxl, tile offset
+ 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, BANK(wBGPals1)
+ 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
+
+Unreferenced_Function6292: ; 6292
+ ld a, [hVBlankCounter]
+ and $7
+ ret nz
+ ld hl, wLYOverrides + $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
+
+.Unreferenced_NextScene:
+ 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, wLYOverrides
+ 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, wLYOverrides + 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 [wMusicFadeID], a
+ ld [wMusicFadeID + 1], a
+ ld hl, wMusicFade
+ 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, [wMusicFade]
+ 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
+
+Unreferenced_Function639b:
+ ; If bit 0 or 1 of [wTitleScreenTimer] is set, we don't need to be here.
+ ld a, [wTitleScreenTimer]
+ and %00000011
+ ret nz
+ ld bc, wSpriteAnim10
+ 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), 29
+ 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
--- a/main.asm
+++ b/main.asm
@@ -6,7 +6,7 @@
INCLUDE "engine/routines/placewaitingtext.asm"
INCLUDE "engine/routines/loadpushoam.asm"
INCLUDE "engine/overworld/map_objects.asm"
-INCLUDE "engine/intro_menu.asm"
+INCLUDE "engine/menus/intro_menu.asm"
INCLUDE "engine/overworld/init_map.asm"
INCLUDE "engine/pokemon/learn.asm"
INCLUDE "engine/routines/checknickerrors.asm"
@@ -191,7 +191,7 @@
SECTION "Crystal Features 1", ROMX
-INCLUDE "engine/init_gender.asm"
+INCLUDE "engine/menus/init_gender.asm"
INCLUDE "engine/gfx/drawkrispackgfx.asm"
INCLUDE "engine/events/move_tutor.asm"
INCLUDE "engine/gfx/crystal_layouts.asm"