shithub: pokecrystal

Download patch

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"