summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorentrpntr <entrpntr@gmail.com>2020-05-11 16:06:49 -0400
committerentrpntr <entrpntr@gmail.com>2020-05-11 16:06:49 -0400
commitf2d087165f870dbf55794064dedff4116596258d (patch)
treebec8f8649a4d4e0e1ee420fba569d2dfa7c27958
parent6de1f826f638e5eb4f0177334c9682e1246fa9f5 (diff)
Clean up engine/menus/intro_menu.asm.
-rw-r--r--constants/sprite_anim_constants.asm1
-rw-r--r--data/player_names.asm24
-rw-r--r--data/text/common_2.asm2
-rw-r--r--engine/menus/intro_menu.asm1077
-rw-r--r--engine/menus/main_menu.asm251
-rw-r--r--engine/movie/title.asm189
-rwxr-xr-xengine/overworld/map_objects.asm8
-rw-r--r--main.asm10
-rw-r--r--wram.asm7
9 files changed, 808 insertions, 761 deletions
diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm
index e11f5079..72042b7d 100644
--- a/constants/sprite_anim_constants.asm
+++ b/constants/sprite_anim_constants.asm
@@ -21,6 +21,7 @@ NUM_SPRITE_ANIM_STRUCTS EQU 10 ; see wSpriteAnimationStructs
; SpriteAnimSeqData indexes (see data/sprite_anims/sequences.asm)
SPRITE_ANIM_INDEX_PARTY_MON EQU $00
+SPRITE_ANIM_INDEX_GS_TITLE_TRAIL EQU $0f
SPRITE_ANIM_INDEX_SLOTS_GOLEM EQU $18
SPRITE_ANIM_INDEX_SLOTS_CHANSEY EQU $19
SPRITE_ANIM_INDEX_SLOTS_EGG EQU $1a
diff --git a/data/player_names.asm b/data/player_names.asm
new file mode 100644
index 00000000..69108f0c
--- /dev/null
+++ b/data/player_names.asm
@@ -0,0 +1,24 @@
+NameMenuHeader:
+ db STATICMENU_NO_TOP_SPACING
+ menu_coords 0, 0, 10, TEXTBOX_Y - 1
+ dw .Names
+ db 1
+
+.Names:
+ db STATICMENU_CURSOR | STATICMENU_PLACE_TITLE | STATICMENU_DISABLE_B ; flags
+ db 5 ; items
+ db "NEW NAME@"
+PlayerNameArray:
+IF DEF(_GOLD)
+ db "GOLD@"
+ db "HIRO@"
+ db "TAYLOR@"
+ db "KARL@"
+ELIF DEF(_SILVER)
+ db "SILVER@"
+ db "KAMON@"
+ db "OSCAR@"
+ db "MAX@"
+ENDC
+ db 2
+ db "NAME@" ; title
diff --git a/data/text/common_2.asm b/data/text/common_2.asm
index 6b7804e6..931605fd 100644
--- a/data/text/common_2.asm
+++ b/data/text/common_2.asm
@@ -1138,7 +1138,7 @@ _MayRegisterItemText::
line "on SELECT Button."
done
-_ClockTimeUnknownText::
+_MainMenuTimeUnknownText::
text "Clock time unknown"
done
diff --git a/engine/menus/intro_menu.asm b/engine/menus/intro_menu.asm
index c690590e..414c733f 100644
--- a/engine/menus/intro_menu.asm
+++ b/engine/menus/intro_menu.asm
@@ -1,271 +1,25 @@
-MainMenu_:
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- ld de, MUSIC_MAIN_MENU
- ld a, e
- ld [wMapMusic], a
- call PlayMusic
-.asm_5a60
- xor a
- ld [wDisableTextAcceleration], a
- call Function5bf7
- ld b, $8
- call GetSGBLayout
- ld hl, wGameTimerPause
- res 0, [hl]
- call Function5ae4
- ld [wWhichIndexSet], a
- call Function5b27
- ld hl, .MenuDataHeader
- call LoadMenuHeader
- call Function5b0a
- call CloseWindow
- jr c, .asm_5a94
- call ClearTilemap
- ld a, [wMenuSelection]
- ld hl, .Jumptable
- rst JumpTable
- jr .asm_5a60
-
-.asm_5a94
- jp StartTitleScreen
-
-.MenuDataHeader:
- db $40
- db 00, 00
- db 07, 14
- dw .MenuData2
- db 1
-
-.MenuData2:
- db $80
- db 0
- dw MainMenuItems
- dw PlaceMenuStrings
- dw .Strings
-
-.Strings:
- db "CONTINUE@"
- db "NEW GAME@"
- db "OPTION@"
- db "MYSTERY GIFT@"
-
-.Jumptable:
- dw MainMenu_Continue ; 5dd9
- dw MainMenu_NewGame ; 5c1e
- dw MainMenu_Options ; 5c17
- dw MainMenu_MysteryGift ; 5c07
-
-CONTINUE EQU 0
-NEW_GAME EQU 1
-OPTION EQU 2
-MYSTERY_GIFT EQU 3
-
-MainMenuItems:
- db 2
- db NEW_GAME
- db OPTION
- db -1
-
- db 3
- db CONTINUE
- db NEW_GAME
- db OPTION
- db -1
-
- db 4
- db CONTINUE
- db NEW_GAME
- db OPTION
- db MYSTERY_GIFT
- db -1
-
-Function5ae4: ; 5ae4 (1:5ae4)
- nop
- nop
- nop
- ld a, [wSaveFileExists]
- and a
- jr nz, .asm_5af0
- ld a, $0
- ret
-
-.asm_5af0
- ldh a, [hCGB]
- cp $1
- ld a, $1
- ret nz
- ld a, $0
- call OpenSRAM
- ld a, [$abe5]
- cp $ff
- call CloseSRAM
- ld a, $1
- ret z
- ld a, $2
- ret
-
-Function5b0a: ; 5b0a (1:5b0a)
- call SetUpMenu
-.asm_5b0d
- call Function5b27
- call GetScrollingMenuJoypad
- ld a, [wMenuJoypad]
- cp $2
- jr z, .asm_5b25
- cp $1
- jr z, .asm_5b20
- jr .asm_5b0d
-
-.asm_5b20
- call PlayClickSFX
- and a
- ret
-
-.asm_5b25
- scf
- ret
-
-Function5b27: ; 5b27 (1:5b27)
- ld a, [wSaveFileExists]
- and a
- ret z
- xor a
- ldh [hBGMapMode], a
- call Function5b45
- ld hl, wOptions
- ld a, [hl]
- push af
- set 4, [hl]
- call Function5b5b
- pop af
- ld [wOptions], a
- ld a, $1
- ldh [hBGMapMode], a
- ret
-
-Function5b45: ; 5b45 (1:5b45)
- call CheckRTCStatus
- and $80
- jr nz, .asm_5b57
- hlcoord 0, 12
- ld b, $4
- ld c, $d
- call Textbox
- ret
-
-.asm_5b57
- call SpeechTextbox
- ret
-
-Function5b5b: ; 5b5b (1:5b5b)
- ld a, [wSaveFileExists]
- and a
- ret z
- call CheckRTCStatus
- and $80
- jp nz, Function5b9c
- call UpdateTime
- hlcoord 1, 13
- ld bc, IncGradGBPalTable_11 + 1
- call ClearBox
- call GetWeekday
- ld b, a
- decoord 1, 14
- call Function5bb8
- decoord 4, 16
- ldh a, [hHours]
- ld c, a
- farcall PrintHour
- ld [hl], $9c
- inc hl
- ld de, hMinutes
- lb bc, PRINTNUM_LEADINGZEROS | 1, 2
- call PrintNum
- ret
-
-.min
- db "min.@"
-
-Function5b9c: ; 5b9c (1:5b9c)
- hlcoord 1, 14
- ld de, .TimeNotSet
- call PlaceString
- ret
-
-.TimeNotSet
- db "TIME NOT SET@"
-
-.UnusedText
- text_far _ClockTimeUnknownText
- db "@"
-
-Function5bb8: ; 5bb8 (1:5bb8)
- 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
-
-.Days:
- db "SUN@"
- db "MON@"
- db "TUES@"
- db "WEDNES@"
- db "THURS@"
- db "FRI@"
- db "SATUR@"
-.Day:
- db "DAY@"
-
-Function5bf7: ; 5bf7 (1:5bf7)
- xor a
- ldh [hMapAnims], a
- call ClearTilemap
- call LoadFontsExtra
- call LoadStandardFont
- call ClearWindowData
- ret
-
-MainMenu_MysteryGift:
- call UpdateTime
- farcall DoMysteryGiftIfDayHasPassed
- farcall DoMysteryGift
- ret
-
-MainMenu_Options:
- farcall OptionsMenu
- ret
-
MainMenu_NewGame:
xor a
ld [wDebugFlags], a
- call Function5c3a
- call Function5bf7
+ call ResetWRAM
+ call ClearTilemapEtc
call OakSpeech
call InitializeWorld
- ld a, $0
+
+ ld a, SPAWN_HOME
ld [wDefaultSpawnpoint], a
- ld a, $f1
+
+ ld a, MAPSETUP_WARP
ldh [hMapEntryMethod], a
jp FinishContinueFunction
-Function5c3a: ; 5c3a (1:5c3a)
+ResetWRAM:
xor a
ldh [hBGMapMode], a
- call Function5c41
+ call _ResetWRAM
ret
-Function5c41: ; 5c41 (1:5c41)
+_ResetWRAM:
ld hl, wVirtualOAM
ld bc, wOptions - wVirtualOAM
xor a
@@ -295,7 +49,7 @@ Function5c41: ; 5c41 (1:5c41)
ld [wCurBox], a
ld [wSavedAtLeastOnce], a
- call Function5d1a
+ call SetDefaultBoxNames
ld a, BANK(sBoxCount)
call OpenSRAM
@@ -305,10 +59,13 @@ Function5c41: ; 5c41 (1:5c41)
ld hl, wNumItems
call .InitList
+
ld hl, wNumKeyItems
call .InitList
+
ld hl, wNumBalls
call .InitList
+
ld hl, wNumPCItems
call .InitList
@@ -316,7 +73,7 @@ Function5c41: ; 5c41 (1:5c41)
ld [wRoamMon1Species], a
ld [wRoamMon2Species], a
ld [wRoamMon3Species], a
- ld a, $ff
+ ld a, -1
ld [wRoamMon1MapGroup], a
ld [wRoamMon2MapGroup], a
ld [wRoamMon3MapGroup], a
@@ -345,26 +102,26 @@ Function5c41: ; 5c41 (1:5c41)
ld [wCoins], a
ld [wCoins + 1], a
-IF START_MONEY / $10000
- ld a, START_MONEY / $10000
-ENDC
+if START_MONEY >= $10000
+ ld a, HIGH(START_MONEY >> 8)
+endc
ld [wMoney], a
- ld a, START_MONEY / $100 % $100
+ ld a, HIGH(START_MONEY) ; mid
ld [wMoney + 1], a
- ld a, START_MONEY % $100
+ ld a, LOW(START_MONEY)
ld [wMoney + 2], a
xor a
- ld [wd961], a
+ ld [wWhichMomItem], a
ld hl, wMomItemTriggerBalance
- ld [hl], 2300 / $10000
+ ld [hl], HIGH(MOM_MONEY >> 8)
inc hl
- ld [hl], 2300 / $100 % $100
+ ld [hl], HIGH(MOM_MONEY) ; mid
inc hl
- ld [hl], 2300 % $100
+ ld [hl], LOW(MOM_MONEY)
- call Function5d5d
+ call InitializeNPCNames
farcall InitDecorations
@@ -374,16 +131,17 @@ ENDC
ret
.InitList:
+; 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
-Function5d1a: ; 5d1a (1:5d1a)
+SetDefaultBoxNames:
ld hl, wBoxNames
- ld c, $0
-.asm_5d1f
+ ld c, 0
+.loop
push hl
ld de, .Box
call CopyName2
@@ -391,11 +149,12 @@ Function5d1a: ; 5d1a (1:5d1a)
ld a, c
inc a
cp 10
- jr c, .asm_5d32
+ jr c, .less
sub 10
ld [hl], "1"
inc hl
-.asm_5d32
+
+.less
add "0"
ld [hli], a
ld [hl], "@"
@@ -405,36 +164,42 @@ Function5d1a: ; 5d1a (1:5d1a)
inc c
ld a, c
cp NUM_BOXES
- jr c, .asm_5d1f
+ jr c, .loop
ret
-.Box db "BOX@"
+.Box:
+ db "BOX@"
-InitializeMagikarpHouse: ; 5d47 (1:5d47)
+InitializeMagikarpHouse:
ld hl, wBestMagikarpLengthFeet
- ld a, 3
+ ld a, $3
ld [hli], a
- ld a, 6
+ ld a, $6
ld [hli], a
ld de, .Ralph
call CopyName2
ret
-.Ralph db "RALPH@"
+.Ralph:
+ db "RALPH@"
-Function5d5d: ; 5d5d (1:5d5d)
+InitializeNPCNames:
ld hl, .Rival
ld de, wRivalName
- call .CopyName
+ call .Copy
+
ld hl, .Mom
ld de, wMomsName
- call .CopyName
+ call .Copy
+
ld hl, .Red
ld de, wRedsName
- call .CopyName
+ call .Copy
+
ld hl, .Green
ld de, wGreensName
-.CopyName:
+
+.Copy:
ld bc, NAME_LENGTH
call CopyBytes
ret
@@ -444,14 +209,14 @@ Function5d5d: ; 5d5d (1:5d5d)
.Green: db "GREEN@"
.Mom: db "MOM@"
-InitializeWorld: ; 5d97 (1:5d97)
+InitializeWorld:
call ShrinkPlayer
farcall SpawnPlayer
farcall _InitializeStartDay
ret
-LoadOrRegenerateLuckyIDNumber: ; 5da7 (1:5da7)
- ld a, 0
+LoadOrRegenerateLuckyIDNumber:
+ ld a, BANK(sLuckyIDNumber)
call OpenSRAM
ld a, [wCurDay]
inc a
@@ -461,13 +226,14 @@ LoadOrRegenerateLuckyIDNumber: ; 5da7 (1:5da7)
ld a, [sLuckyIDNumber + 1]
ld c, a
ld a, [sLuckyIDNumber]
- jr z, .asm_5dc9
+ jr z, .skip
ld a, b
ld [sLuckyNumberDay], a
call Random
ld c, a
call Random
-.asm_5dc9
+
+.skip
ld [wLuckyIDNumber], a
ld [sLuckyIDNumber], a
ld a, c
@@ -477,7 +243,7 @@ LoadOrRegenerateLuckyIDNumber: ; 5da7 (1:5da7)
MainMenu_Continue:
farcall TryLoadSaveFile
- jr c, .asm_5e41
+ jr c, .FailToLoad
call LoadStandardMenuHeader
call DisplaySaveInfoOnContinue
ld a, $1
@@ -485,22 +251,22 @@ MainMenu_Continue:
ld c, 20
call DelayFrames
call ConfirmContinue
- jr nc, .asm_5dfa
+ jr nc, .Check1Pass
call CloseWindow
- jr .asm_5e41
+ jr .FailToLoad
-.asm_5dfa
+.Check1Pass:
call Continue_CheckRTC_RestartClock
- jr nc, .asm_5e04
+ jr nc, .Check2Pass
call CloseWindow
- jr .asm_5e41
+ jr .FailToLoad
-.asm_5e04
+.Check2Pass:
ld a, $8
ld [wMusicFade], a
- ld a, MUSIC_NONE % $100
+ ld a, LOW(MUSIC_NONE)
ld [wMusicFadeID], a
- ld a, MUSIC_NONE / $100
+ ld a, HIGH(MUSIC_NONE)
ld [wMusicFadeID + 1], a
call ClearBGPalettes
call CloseWindow
@@ -508,94 +274,95 @@ MainMenu_Continue:
ld c, 20
call DelayFrames
farcall JumpRoamMons
- farcall MysteryGift_CopyReceivedDecosToPC
+ farcall MysteryGift_CopyReceivedDecosToPC ; Mystery Gift
farcall ClockContinue
- ld a, [wd1db]
- cp $1
- jr z, .asm_5e42
- ld a, $f2
+ ld a, [wSpawnAfterChampion]
+ cp SPAWN_LANCE
+ jr z, .SpawnAfterE4
+ ld a, MAPSETUP_CONTINUE
ldh [hMapEntryMethod], a
jp FinishContinueFunction
-.asm_5e41
+.FailToLoad:
ret
-.asm_5e42
- ld a, $e
+.SpawnAfterE4:
+ ld a, SPAWN_NEW_BARK
ld [wDefaultSpawnpoint], a
call PostCreditsSpawn
jp FinishContinueFunction
-SpawnAfterRed: ; 5e4d (1:5e4d)
- ld a, $1a
+SpawnAfterRed:
+ ld a, SPAWN_MT_SILVER
ld [wDefaultSpawnpoint], a
-PostCreditsSpawn: ; 5e52 (1:5e52)
+
+PostCreditsSpawn:
xor a
- ld [wd1db], a
- ld a, $f1
+ ld [wSpawnAfterChampion], a
+ ld a, MAPSETUP_WARP
ldh [hMapEntryMethod], a
ret
-ConfirmContinue: ; 5e5b (1:5e5b)
+ConfirmContinue:
+.loop
call DelayFrame
call GetJoypad
ld hl, hJoyPressed
- bit 0, [hl]
- jr nz, .asm_5e6e
- bit 1, [hl]
- jr z, ConfirmContinue
+ bit A_BUTTON_F, [hl]
+ jr nz, .PressA
+ bit B_BUTTON_F, [hl]
+ jr z, .loop
scf
ret
-.asm_5e6e
+.PressA:
ret
-Continue_CheckRTC_RestartClock: ; 5e6f (1:5e6f)
+Continue_CheckRTC_RestartClock:
call CheckRTCStatus
- and $80
- jr z, .asm_5e82
- ld a, $8
- ld hl, $4021
- rst FarCall
+ and %10000000 ; Day count exceeded 16383
+ jr z, .pass
+ farcall RestartClock
ld a, c
and a
- jr z, .asm_5e82
+ jr z, .pass
scf
ret
-.asm_5e82
+.pass
xor a
ret
-FinishContinueFunction: ; 5e84 (1:5e84)
+FinishContinueFunction:
+.loop
xor a
ld [wDontPlayMapMusicOnReload], a
ld hl, wGameTimerPause
- set 0, [hl]
+ set GAMETIMERPAUSE_TIMER_PAUSED_F, [hl]
farcall OverworldLoop
- ld a, [wd1db]
- cp $2
- jr z, .asm_5e9d
+ ld a, [wSpawnAfterChampion]
+ cp SPAWN_RED
+ jr z, .AfterRed
jp Reset
-.asm_5e9d
+.AfterRed:
call SpawnAfterRed
- jr FinishContinueFunction
+ jr .loop
-DisplaySaveInfoOnContinue: ; 5ea2 (1:5ea2)
+DisplaySaveInfoOnContinue:
call CheckRTCStatus
- and $80
- jr z, .asm_5eb0
+ and %10000000
+ jr z, .clock_ok
lb de, 4, 8
call DisplayContinueDataWithRTCError
ret
-.asm_5eb0
+.clock_ok
lb de, 4, 8
call DisplayNormalContinueData
ret
-DisplayNormalContinueData: ; 5eb7 (1:5eb7)
+DisplayNormalContinueData:
call Continue_LoadMenuHeader
call Continue_DisplayBadgesDex
call Continue_PrintGameTime
@@ -603,7 +370,7 @@ DisplayNormalContinueData: ; 5eb7 (1:5eb7)
call UpdateSprites
ret
-DisplayContinueDataWithRTCError: ; 5ec7 (1:5ec7)
+DisplayContinueDataWithRTCError:
call Continue_LoadMenuHeader
call Continue_DisplayBadgesDex
call Continue_UnknownGameTime
@@ -611,51 +378,50 @@ DisplayContinueDataWithRTCError: ; 5ec7 (1:5ec7)
call UpdateSprites
ret
-Continue_LoadMenuHeader: ; 5ed7 (1:5ed7)
+Continue_LoadMenuHeader:
xor a
ldh [hBGMapMode], a
- ld hl, .MenuDataHeader_Dex
+ ld hl, .MenuHeader_Dex
ld a, [wStatusFlags]
bit STATUSFLAGS_POKEDEX_F, a
- jr nz, .asm_5ee7
- ld hl, .MenuDataHeader_NoDex
-.asm_5ee7
+ jr nz, .show_menu
+ ld hl, .MenuHeader_NoDex
+
+.show_menu
call _OffsetMenuHeader
call MenuBox
call PlaceVerticalMenuItems
ret
-.MenuDataHeader_Dex:
- db $40
- db 00, 00
- db 09, 15
- dw .MenuData2_Dex
- db 1
+.MenuHeader_Dex:
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 0, 0, 15, 9
+ dw .MenuData_Dex
+ db 1 ; default option
-.MenuData2_Dex
- db $00
- db 4
+.MenuData_Dex:
+ db 0 ; flags
+ db 4 ; items
db "PLAYER <PLAYER>@"
db "BADGES@"
db "#DEX@"
db "TIME@"
-.MenuDataHeader_NoDex:
- db $40
- db 00, 00
- db 09, 15
- dw .MenuData2_NoDex
- db 1
+.MenuHeader_NoDex:
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 0, 0, 15, 9
+ dw .MenuData_NoDex
+ db 1 ; default option
-.MenuData2_NoDex
- db $00
- db 4
+.MenuData_NoDex:
+ db 0 ; flags
+ db 4 ; items
db "PLAYER <PLAYER>@"
db "BADGES@"
db " @"
db "TIME@"
-Continue_DisplayBadgesDex: ; 5f36 (1:5f36)
+Continue_DisplayBadgesDex:
call MenuBoxCoord2Tile
push hl
decoord 13, 4, 0
@@ -669,13 +435,13 @@ Continue_DisplayBadgesDex: ; 5f36 (1:5f36)
pop hl
ret
-Continue_PrintGameTime: ; 5f4c (1:5f4c)
+Continue_PrintGameTime:
decoord 9, 8, 0
add hl, de
call Continue_DisplayGameTime
ret
-Continue_UnknownGameTime: ; 5f54 (1:5f54)
+Continue_UnknownGameTime:
decoord 9, 8, 0
add hl, de
ld de, .three_question_marks
@@ -685,46 +451,45 @@ Continue_UnknownGameTime: ; 5f54 (1:5f54)
.three_question_marks
db " ???@"
-Continue_DisplayBadgeCount: ; 5f64 (1:5f64)
+Continue_DisplayBadgeCount:
push hl
ld hl, wJohtoBadges
- ld b, $2
+ ld b, 2
call CountSetBits
pop hl
- ld de, wd151
+ ld de, wNumSetBits
lb bc, 1, 2
jp PrintNum
-Continue_DisplayPokedexNumCaught: ; 5f77 (1:5f77)
+Continue_DisplayPokedexNumCaught:
ld a, [wStatusFlags]
bit STATUSFLAGS_POKEDEX_F, a
ret z
push hl
ld hl, wPokedexCaught
-IF NUM_POKEMON % 8
+if NUM_POKEMON % 8
ld b, NUM_POKEMON / 8 + 1
-ELSE
+else
ld b, NUM_POKEMON / 8
-ENDC
+endc
call CountSetBits
pop hl
- ld de, wd151
+ ld de, wNumSetBits
lb bc, 1, 3
jp PrintNum
-Continue_DisplayGameTime: ; 5f90 (1:5f90)
+Continue_DisplayGameTime:
ld de, wGameTimeHours
lb bc, 2, 3
call PrintNum
- ld [hl], $6d
+ ld [hl], "<COLON>"
inc hl
ld de, wGameTimeMinutes
lb bc, PRINTNUM_LEADINGZEROS | 1, 2
jp PrintNum
-OakSpeech: ; 5fa5 (1:5fa5)
- farcall InitClock ; What time is it?
-
+OakSpeech:
+ farcall InitClock
call RotateFourPalettesLeft
call ClearTilemap
@@ -733,7 +498,6 @@ OakSpeech: ; 5fa5 (1:5fa5)
call RotateFourPalettesRight
call RotateThreePalettesRight
-
xor a
ld [wCurPartySpecies], a
ld a, POKEMON_PROF
@@ -742,12 +506,10 @@ OakSpeech: ; 5fa5 (1:5fa5)
ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
call GetSGBLayout
-
- call Intro_FadeInFrontpic
+ call Intro_RotatePalettesLeftFrontpic
ld hl, OakText1
call PrintText
-
call RotateThreePalettesRight
call ClearTilemap
@@ -755,6 +517,7 @@ OakSpeech: ; 5fa5 (1:5fa5)
ld [wCurSpecies], a
ld [wCurPartySpecies], a
call GetBaseData
+
hlcoord 6, 4
hlcoord 6, 4 ; TriHard
call PrepMonFrontpic
@@ -762,17 +525,15 @@ OakSpeech: ; 5fa5 (1:5fa5)
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
@@ -784,12 +545,10 @@ OakSpeech: ; 5fa5 (1:5fa5)
ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
call GetSGBLayout
-
- call Intro_FadeInFrontpic
+ call Intro_RotatePalettesLeftFrontpic
ld hl, OakText5
call PrintText
-
call RotateThreePalettesRight
call ClearTilemap
@@ -801,21 +560,18 @@ OakSpeech: ; 5fa5 (1:5fa5)
ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
call GetSGBLayout
-
- call Intro_FadeInFrontpic
+ call Intro_RotatePalettesLeftFrontpic
ld hl, OakText6
call PrintText
-
call NamePlayer
-
ld hl, OakText7
call PrintText
ret
OakText1:
text_far _OakText1
- db "@"
+ text_end
OakText2:
text_far _OakText2
@@ -823,33 +579,33 @@ OakText2:
ld a, MARILL
call PlayMonCry
call WaitSFX
- ld hl, OakText3 ; $606c
+ ld hl, OakText3
ret
OakText3:
text_far _OakText3
- db "@"
+ text_end
OakText4:
text_far _OakText4
- db "@"
+ text_end
OakText5:
text_far _OakText5
- db "@"
+ text_end
OakText6:
text_far _OakText6
- db "@"
+ text_end
OakText7:
text_far _OakText7
- db "@"
+ text_end
-NamePlayer: ; 6085 (1:6085)
+NamePlayer:
call MovePlayerPicRight
- ld hl, .PlayerNamingChoices ; $60d9
- call SelectPresetName
+ ld hl, NameMenuHeader
+ call ShowPlayerNamingChoices
ld a, [wMenuCursorY]
dec a
jr z, .NewName
@@ -859,54 +615,35 @@ NamePlayer: ; 6085 (1:6085)
call MovePlayerPicLeft
ret
-.NewName
- ld b, $1
+.NewName:
+ ld b, NAME_PLAYER
ld de, wPlayerName
farcall NamingScreen
+
call RotateThreePalettesRight
call ClearTilemap
+
call LoadFontsExtra
call WaitBGMap
+
xor a
ld [wCurPartySpecies], a
ld a, CAL
ld [wTrainerClass], a
call Intro_PrepTrainerPic
+
ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
call GetSGBLayout
call RotateThreePalettesLeft
+
ld hl, wPlayerName
- ld de, .GoldSilver
+ ld de, PlayerNameArray
call InitName
ret
-.PlayerNamingChoices:
- db $40
- db 00, 00
- db 11, 10
- dw .MenuData2
- db 1
-
-.MenuData2:
- db $91
- db 5
- db "NEW NAME@"
-.GoldSilver:
-IF DEF(_GOLD)
- db "GOLD@"
- db "HIRO@"
- db "TAYLOR@"
- db "KARL@"
-ENDC
-IF DEF(_SILVER)
- db "SILVER@"
- db "KAMON@"
- db "OSCAR@"
- db "MAX@"
-ENDC
- db 2, "NAME@"
+INCLUDE "data/player_names.asm"
-SelectPresetName: ; 6108 (1:6108)
+ShowPlayerNamingChoices:
call LoadMenuHeader
call VerticalMenu
ld a, [wMenuCursorY]
@@ -915,17 +652,17 @@ SelectPresetName: ; 6108 (1:6108)
call CloseWindow
ret
-StorePlayerName: ; 6119 (1:6119)
+StorePlayerName:
ld hl, wStringBuffer2
ld bc, NAME_LENGTH
call CopyBytes
ret
-ShrinkPlayer: ; 6123 (1:6123)
+ShrinkPlayer:
ldh a, [hROMBank]
push af
- ld a, 0 << 7 | 32 ; fade out
+ ld a, 32 ; fade time
ld [wMusicFade], a
ld de, MUSIC_NONE
ld a, e
@@ -973,17 +710,17 @@ ShrinkPlayer: ; 6123 (1:6123)
call ClearTilemap
ret
-MovePlayerPicRight: ; 617e (1:617e)
+MovePlayerPicRight:
hlcoord 6, 4
ld de, $1
jr MovePlayerPic
-MovePlayerPicLeft: ; 6186 (1:6186)
+MovePlayerPicLeft:
hlcoord 13, 4
ld de, -1
MovePlayerPic:
ld c, $8
-.asm_618e
+.loop
push bc
push hl
push de
@@ -1000,49 +737,48 @@ MovePlayerPic:
add hl, de
pop bc
dec c
- jr nz, .asm_618e
+ jr nz, .loop
ret
-Intro_FadeInFrontpic: ; 61ad (1:61ad)
+Intro_RotatePalettesLeftFrontpic:
ld hl, IntroFadePalettes
- ld b, $6
-.asm_61b2
+ ld b, IntroFadePalettes.End - IntroFadePalettes
+.loop
ld a, [hli]
call DmgToCgbBGPals
- ld c, $a
+ ld c, 10
call DelayFrames
dec b
- jr nz, .asm_61b2
+ jr nz, .loop
ret
IntroFadePalettes:
- db %01010100
- db %10101000
- db %11111100
- db %11111000
- db %11110100
- db %11100100
-
-Intro_WipeInFrontpic: ; 61c5 (1:61c5)
+ dc 1, 1, 1, 0
+ dc 2, 2, 2, 0
+ dc 3, 3, 3, 0
+ dc 3, 3, 2, 0
+ dc 3, 3, 1, 0
+ dc 3, 2, 1, 0
+.End
+
+Intro_WipeInFrontpic:
ld a, $77
ldh [hWX], a
call DelayFrame
- ld a, $e4
+ ld a, %11100100
call DmgToCgbBGPals
-.asm_61d1
+.loop
call DelayFrame
ldh a, [hWX]
sub $8
- cp $ff
+ cp -1
ret z
ldh [hWX], a
- jr .asm_61d1
+ jr .loop
-Intro_PrepTrainerPic: ; 61df, 61e0 (1:61df, 1:61e0)
- ld de, $9000
- ld a, $14
- ld hl, $58a0
- rst FarCall
+Intro_PrepTrainerPic:
+ ld de, vTiles2
+ farcall GetTrainerPic
xor a
ldh [hGraphicStartTile], a
hlcoord 6, 4
@@ -1050,9 +786,9 @@ Intro_PrepTrainerPic: ; 61df, 61e0 (1:61df, 1:61e0)
predef PlaceGraphic
ret
-ShrinkFrame: ; 61f7 (1:61f7)
- ld de, $9000
- ld c, $31
+ShrinkFrame:
+ ld de, vTiles2
+ ld c, 7 * 7
predef DecompressGet2bpp
xor a
ldh [hGraphicStartTile], a
@@ -1061,67 +797,75 @@ ShrinkFrame: ; 61f7 (1:61f7)
predef PlaceGraphic
ret
-Intro_PlaceChrisSprite: ; 6210 (1:6210)
+Intro_PlaceChrisSprite:
ld de, ChrisSpriteGFX
lb bc, BANK(ChrisSpriteGFX), 12
- ld hl, $8000
+ ld hl, vTiles0
call Request2bpp
- ld hl, wVirtualOAM
- ld de, .OAMData
+
+ ld hl, wVirtualOAMSprite00
+ ld de, .sprites
ld a, [de]
inc de
+
ld c, a
-.asm_6225
+.loop
ld a, [de]
inc de
- ld [hli], a
+ ld [hli], a ; y
ld a, [de]
inc de
- ld [hli], a
+ ld [hli], a ; x
ld a, [de]
inc de
- ld [hli], a
- xor a
+ ld [hli], a ; tile id
+ xor a ; PAL_OW_RED
ld [hli], a
dec c
- jr nz, .asm_6225
+ jr nz, .loop
ret
-.OAMData
+.sprites
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
-IntroSequence: ; 6241 (1:6241)
+IntroSequence:
callfar Copyright_GFPresents
jr c, StartTitleScreen
callfar GoldSilverIntro
+
+ ; fallthrough
+
StartTitleScreen:
- call InitTitleScreen
+ call TitleScreen
call DelayFrame
-.asm_6255
- call TitleScreenFrame
- jr nc, .asm_6255
+.loop
+ call RunTitleScreen
+ jr nc, .loop
+
call ClearSprites
call ClearBGPalettes
+
ld hl, rLCDC
- res 2, [hl]
+ res rLCDC_SPRITE_SIZE, [hl] ; 8x8
call ClearTilemap
xor a
ldh [hLCDCPointer], a
- ld b, $8
+ ld b, SCGB_DIPLOMA
call GetSGBLayout
call UpdateTimePals
- ld a, [wce64]
+ ld a, [wIntroSceneFrameCounter]
cp $5
- jr c, .asm_627b
+ jr c, .ok
xor a
-.asm_627b
+.ok
ld e, a
- ld d, $0
- ld hl, .Jumptable
+ ld d, 0
+ ld hl, .dw
add hl, de
add hl, de
ld a, [hli]
@@ -1129,208 +873,21 @@ StartTitleScreen:
ld l, a
jp hl
-.Jumptable
- dw MainMenu_
+.dw
+ dw MainMenu
dw DeleteSaveData
dw IntroSequence
dw IntroSequence
dw ResetClock
-InitTitleScreen: ; 6291 (1:6291)
- call ClearBGPalettes
- xor a
- ld [wTimeOfDayPal], a
- ld de, MUSIC_NONE
- call PlayMusic
- call ClearTilemap
- call DisableLCD
- call ClearSprites
- xor a
- ldh [hBGMapMode], a
- ldh [hMapAnims], a
- ldh [hSCY], a
- ldh [hSCX], a
- ld hl, $8000
- ld bc, $2000
- xor a
- call ByteFill
- farcall ClearSpriteAnims
-
- ld hl, TitleScreenGFX1
- ld de, $9000
- ld a, BANK(TitleScreenGFX1)
- call FarDecompress
-
- ld hl, TitleScreenGFX2
- ld de, $8800
- ld a, BANK(TitleScreenGFX2)
- call FarDecompress
-
- ld hl, TitleScreenGFX4
- ld de, $8000
- ld a, BANK(TitleScreenGFX4)
- call FarDecompress
-
- ld hl, TitleScreenGFX3
- ld de, $8f80
- ld bc, $80
- ld a, BANK(TitleScreenGFX3)
- call FarCopyBytes
-
- call Function636e
- call Function63b6
- ld hl, wSpriteAnimDict
- xor a
- ld [hli], a
- ld [hl], a
- ld hl, rLCDC
- set 2, [hl]
- call EnableLCD
- xor a
- ld hl, wce63
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hl], a
- ld de, $6058
- ld a, $2c ; HO-OH
- call InitSpriteAnimStruct
- ld hl, wSpriteAnim1
- ld de, wSpriteAnim10
- ld bc, $a
- call CopyBytes
- ld hl, wSpriteAnim1
- ld [hl], $0
- ld hl, wLYOverrides
- ld bc, $90
- xor a
- call ByteFill
- ld a, $43
- ldh [hLCDCPointer], a
- ld b, $c
- call GetSGBLayout
- call Function6341
- ld de, MUSIC_TITLE
- call PlayMusic
- ret
-
-Function6341: ; 6341 (1:6341)
- ldh a, [hCGB]
- and a
- jr nz, .asm_6365
- ldh a, [hSGB]
- and a
- jr nz, .asm_6358
- ld a, $d8
- ldh [rBGP], a
-IF DEF(_GOLD)
- ld a, $ff
- ldh [rOBP0], a
- ld a, $f8
-ENDC
-IF DEF(_SILVER)
- ld a, $f0
- ldh [rOBP0], a
- ld a, $f0
-ENDC
- ldh [rOBP1], a
- ret
+INCLUDE "engine/movie/title.asm"
-.asm_6358
- ld a, $e4
- ldh [rBGP], a
-IF DEF(_GOLD)
- ld a, $ff
- ldh [rOBP0], a
- ld a, $e4
-ENDC
-IF DEF(_SILVER)
- ld a, $f0
- ldh [rOBP0], a
- ld a, $e0
-ENDC
- ldh [rOBP1], a
- ret
-
-.asm_6365
- ld a, $e4
- call DmgToCgbBGPals
-IF DEF(_SILVER)
- ld a, $e0
-ENDC
- call DmgToCgbObjPal0
- ret
-
-Function636e: ; 636e (1:636e)
- ldh a, [hCGB]
- and a
- ret z
- ld a, $1
- ldh [rVBK], a
- ld hl, $9800
- ld bc, $240
- xor a
- call ByteFill
- ld hl, $9800
- ld bc, $714
- ld a, $1
- call Function63a6
- ld hl, $98c5
- ld bc, $10a
- ld a, $3
- call Function63a6
- ld hl, $9980
- ld bc, $a0
- ld a, $4
- call ByteFill
- ld a, $0
- ldh [rVBK], a
- ret
-
-Function63a6: ; 63a6 (1:63a6)
- push bc
- push hl
-.asm_63a8
- ld [hli], a
- dec c
- jr nz, .asm_63a8
- pop hl
- ld bc, $20
- add hl, bc
- pop bc
- dec b
- jr nz, Function63a6
- ret
-
-Function63b6: ; 63b6 (1:63b6)
- ld hl, GSIntroTilemap ; $4616
- ld de, $9800
-.asm_63bc
- ld a, BANK(GSIntroTilemap) ; $26
- call GetFarByte
- cp $ff
- jr z, .asm_63ca
- inc hl
- ld [de], a
- inc de
- jr .asm_63bc
-
-.asm_63ca
- ldh a, [hCGB]
- and a
- ret nz
- ld hl, $9960
- ld bc, $20
- ld a, $50
- call ByteFill
- ret
-
-TitleScreenFrame: ; 63da (1:63da)
+RunTitleScreen:
call Function63fe
- ld a, [wce63]
+ ld a, [wJumptableIndex]
bit 7, a
- jr nz, .asm_63fc
- call Function640f
+ jr nz, .done_title
+ call TitleScreenScene
ld a, $1
ldh [hOAMUpdate], a
farcall PlaySpriteAnimations
@@ -1341,11 +898,11 @@ TitleScreenFrame: ; 63da (1:63da)
and a
ret
-.asm_63fc
+.done_title
scf
ret
-Function63fe: ; 63fe (1:63fe)
+Function63fe:
IF DEF(_GOLD)
ldh a, [hVBlankCounter]
and $7
@@ -1354,14 +911,14 @@ ENDC
ld hl, wLYOverrides + $5f
ld a, [hl]
dec a
- ld bc, $28
+ ld bc, 2 * SCREEN_WIDTH
call ByteFill
ret
-Function640f: ; 640f (1:640f)
+TitleScreenScene:
ld e, a
- ld d, $0
- ld hl, .Jumptable ; $641b
+ ld d, 0
+ ld hl, .scenes
add hl, de
add hl, de
ld a, [hli]
@@ -1369,129 +926,154 @@ Function640f: ; 640f (1:640f)
ld l, a
jp hl
-.Jumptable
- dw Function6426
- dw Function6434
- dw Function648b
+.scenes
+ dw TitleScreenTimer
+ dw TitleScreenMain
+ dw TitleScreenEnd
-Function6421:
- ld hl, wce63
+.Unreferenced_NextScene:
+ ld hl, wJumptableIndex
inc [hl]
ret
-Function6426:
- ld hl, wce63
+TitleScreenTimer:
+; Next scene
+ ld hl, wJumptableIndex
inc [hl]
- ld hl, wce65
+
+; Start a timer
+ ld hl, wTitleScreenTimer
IF DEF(_GOLD)
- ld de, $13c0
-ENDC
-IF DEF(_SILVER)
- ld de, $1140
+ ld de, 84 * 60 + 16
+ELIF DEF(_SILVER)
+ ld de, 73 * 60 + 36
ENDC
ld [hl], e
inc hl
ld [hl], d
ret
-Function6434:
- ld hl, wce65
+TitleScreenMain:
+; Run the timer down.
+ ld hl, wTitleScreenTimer
ld e, [hl]
inc hl
ld d, [hl]
ld a, e
or d
- jr z, .asm_646b
+ 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, .asm_6460
+ jr z, .delete_save_data
+
+; Clock can be reset by pressing Down + B + Select.
ld a, [hl]
and D_DOWN + B_BUTTON + SELECT
cp D_DOWN + B_BUTTON + SELECT
- jr z, .asm_6480
+ jr z, .clock_reset
ld a, [hl]
and START | A_BUTTON
- jr nz, .asm_645c
+ jr nz, .incave
ret
-.asm_645c
- ld a, $0
- jr .asm_6462
+.incave
+ ld a, 0
+ jr .done
-.asm_6460
- ld a, $1
-.asm_6462
- ld [wce64], a
- ld hl, wce63
+.delete_save_data
+ ld a, 1
+
+.done
+ ld [wIntroSceneFrameCounter], a
+
+; Return to the intro sequence.
+ ld hl, wJumptableIndex
set 7, [hl]
ret
-.asm_646b
- ld hl, wce63
+.end
+; Next scene
+ ld hl, wJumptableIndex
inc [hl]
+
+; Fade out the title screen music
xor a ; MUSIC_NONE
ld [wMusicFadeID], a
ld [wMusicFadeID + 1], a
ld hl, wMusicFade
- ld [hl], $8
- ld hl, wce65
+ ld [hl], 8 ; 1 second
+
+ ld hl, wTitleScreenTimer
inc [hl]
ret
-.asm_6480
- ld a, $4
- ld [wce64], a
- ld hl, wce63
+.clock_reset
+ ld a, 4
+ ld [wIntroSceneFrameCounter], a
+
+; Return to the intro sequence.
+ ld hl, wJumptableIndex
set 7, [hl]
ret
-Function648b:
- ld hl, wce65
+TitleScreenEnd:
+; Wait until the music is done fading.
+
+ ld hl, wTitleScreenTimer
inc [hl]
+
ld a, [wMusicFade]
and a
ret nz
- ld a, $2
- ld [wce64], a
- ld hl, wce63
+
+ ld a, 2
+ ld [wIntroSceneFrameCounter], a
+
+; Back to the intro.
+ ld hl, wJumptableIndex
set 7, [hl]
ret
DeleteSaveData:
- farcall DeleteSaveData_
+ farcall _DeleteSaveData
jp Init
ResetClock:
- farcall ResetClock_
+ farcall _ResetClock
jp Init
-Function64b1: ; 64b1 (1:64b1)
- ld a, [wce65]
- and $3
+Function64b1:
+ ; If bit 0 or 1 of [wTitleScreenTimer] is set, we don't need to be here.
+ ld a, [wTitleScreenTimer]
+ and %00000011
ret nz
IF DEF(_GOLD)
- ld bc, wSpriteAnim10Index
- ld hl, $a
+ ld bc, wSpriteAnim10
+ ld hl, SPRITEANIMSTRUCT_FRAME
add hl, bc
ld l, [hl]
- ld h, $0
+ ld h, 0
add hl, hl
add hl, hl
ld de, .Data_64e0
add hl, de
- ld a, [wce65]
- and $4
+ ; 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
+ ld d, 0
add hl, de
add hl, de
ld a, [hli]
@@ -1499,23 +1081,22 @@ IF DEF(_GOLD)
ret z
ld e, a
ld d, [hl]
-ENDC
-
-IF DEF(_SILVER)
+ELIF DEF(_SILVER)
ld de, $7c58
ENDC
- ld a, $f
+ ld a, SPRITE_ANIM_INDEX_GS_TITLE_TRAIL
call InitSpriteAnimStruct
ret
IF DEF(_GOLD)
.Data_64e0:
- db $5c, $50, $00, $00
- db $5c, $68, $5c, $58
- db $5c, $68, $5c, $78
- db $5c, $88, $5c, $78
- db $00, $00, $5c, $78
- db $00, $00, $5c, $58
+; 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
ENDC
Copyright:
@@ -1538,9 +1119,7 @@ CopyrightString:
db $73, $74, $75, $76, $77, $78, $79, $71, $72
db "@"
-GameInit:: ; 6545 (1:6545)
+GameInit::
call ClearWindowData
- ld a, $5
- ld hl, $4f60
- rst FarCall
+ farcall TryLoadSaveData
jp IntroSequence
diff --git a/engine/menus/main_menu.asm b/engine/menus/main_menu.asm
new file mode 100644
index 00000000..97ac8ed6
--- /dev/null
+++ b/engine/menus/main_menu.asm
@@ -0,0 +1,251 @@
+MainMenu:
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ ld de, MUSIC_MAIN_MENU
+ ld a, e
+ ld [wMapMusic], a
+ call PlayMusic
+.loop
+ xor a
+ ld [wDisableTextAcceleration], a
+ call ClearTilemapEtc
+ ld b, SCGB_DIPLOMA
+ call GetSGBLayout
+ ld hl, wGameTimerPause
+ res GAMETIMERPAUSE_TIMER_PAUSED_F, [hl]
+ call MainMenu_GetWhichMenu
+ ld [wWhichIndexSet], a
+ call MainMenu_PrintCurrentTimeAndDay
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ call MainMenuJoypadLoop
+ call CloseWindow
+ jr c, .quit
+ call ClearTilemap
+ ld a, [wMenuSelection]
+ ld hl, .Jumptable
+ rst JumpTable
+ jr .loop
+
+.quit
+ jp StartTitleScreen
+
+.MenuHeader:
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 0, 0, 14, 7
+ dw .MenuData
+ db 1 ; default option
+
+.MenuData:
+ db STATICMENU_CURSOR ; flags
+ db 0 ; items
+ dw MainMenuItems
+ dw PlaceMenuStrings
+ dw .Strings
+
+.Strings:
+ db "CONTINUE@"
+ db "NEW GAME@"
+ db "OPTION@"
+ db "MYSTERY GIFT@"
+
+.Jumptable:
+ dw MainMenu_Continue
+ dw MainMenu_NewGame
+ dw MainMenu_Options
+ dw MainMenu_MysteryGift
+
+CONTINUE EQU 0
+NEW_GAME EQU 1
+OPTION EQU 2
+MYSTERY_GIFT EQU 3
+
+MainMenuItems:
+
+NewGameMenu:
+ db 2
+ db NEW_GAME
+ db OPTION
+ db -1
+
+ContinueMenu:
+ db 3
+ db CONTINUE
+ db NEW_GAME
+ db OPTION
+ db -1
+
+MysteryMenu:
+ db 4
+ db CONTINUE
+ db NEW_GAME
+ db OPTION
+ db MYSTERY_GIFT
+ db -1
+
+MainMenu_GetWhichMenu:
+ nop
+ nop
+ nop
+ ld a, [wSaveFileExists]
+ and a
+ jr nz, .next
+ ld a, $0 ; New Game
+ ret
+
+.next
+ ldh a, [hCGB]
+ cp $1
+ ld a, $1
+ ret nz
+ ld a, BANK(sNumDailyMysteryGiftPartnerIDs)
+ call OpenSRAM
+ ld a, [sNumDailyMysteryGiftPartnerIDs]
+ cp -1
+ call CloseSRAM
+ ld a, $1 ; Continue
+ ret z
+ ld a, $2 ; New Game
+ ret
+
+MainMenuJoypadLoop:
+ call SetUpMenu
+.loop
+ call MainMenu_PrintCurrentTimeAndDay
+ call GetScrollingMenuJoypad
+ ld a, [wMenuJoypad]
+ cp B_BUTTON
+ jr z, .b_button
+ cp A_BUTTON
+ jr z, .a_button
+ jr .loop
+
+.a_button
+ call PlayClickSFX
+ and a
+ ret
+
+.b_button
+ scf
+ ret
+
+MainMenu_PrintCurrentTimeAndDay:
+ ld a, [wSaveFileExists]
+ and a
+ ret z
+ xor a
+ ldh [hBGMapMode], a
+ call .PlaceBox
+ ld hl, wOptions
+ ld a, [hl]
+ push af
+ set NO_TEXT_SCROLL, [hl]
+ call .PlaceTime
+ pop af
+ ld [wOptions], a
+ ld a, $1
+ ldh [hBGMapMode], a
+ ret
+
+.PlaceBox:
+ call CheckRTCStatus
+ and $80
+ jr nz, .TimeFail
+ hlcoord 0, 12
+ ld b, 4
+ ld c, 13
+ call Textbox
+ ret
+
+.TimeFail:
+ call SpeechTextbox
+ ret
+
+.PlaceTime:
+ ld a, [wSaveFileExists]
+ and a
+ ret z
+ call CheckRTCStatus
+ and %10000000 ; Day count exceeded 16383
+ jp nz, .PrintTimeNotSet
+ call UpdateTime
+ hlcoord 1, 13
+ ld bc, IncGradGBPalTable_11 + 1
+ call ClearBox
+ call GetWeekday
+ ld b, a
+ decoord 1, 14
+ call .PlaceCurrentDay
+ decoord 4, 16
+ ldh a, [hHours]
+ ld c, a
+ farcall PrintHour
+ ld [hl], ":"
+ inc hl
+ ld de, hMinutes
+ lb bc, PRINTNUM_LEADINGZEROS | 1, 2
+ call PrintNum
+ ret
+
+.min
+; unused
+ db "min.@"
+
+.PrintTimeNotSet:
+ hlcoord 1, 14
+ ld de, .TimeNotSet
+ call PlaceString
+ ret
+
+.TimeNotSet:
+ db "TIME NOT SET@"
+
+.MainMenuTimeUnknownText:
+ text_far _MainMenuTimeUnknownText
+ text_end
+
+.PlaceCurrentDay:
+ 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
+
+.Days:
+ db "SUN@"
+ db "MON@"
+ db "TUES@"
+ db "WEDNES@"
+ db "THURS@"
+ db "FRI@"
+ db "SATUR@"
+.Day:
+ db "DAY@"
+
+ClearTilemapEtc:
+ xor a
+ ldh [hMapAnims], a
+ call ClearTilemap
+ call LoadFontsExtra
+ call LoadStandardFont
+ call ClearWindowData
+ ret
+
+MainMenu_MysteryGift:
+ call UpdateTime
+ farcall DoMysteryGiftIfDayHasPassed
+ farcall DoMysteryGift
+ ret
+
+MainMenu_Options:
+ farcall OptionsMenu
+ ret
diff --git a/engine/movie/title.asm b/engine/movie/title.asm
new file mode 100644
index 00000000..d35cb703
--- /dev/null
+++ b/engine/movie/title.asm
@@ -0,0 +1,189 @@
+TitleScreen:
+ call ClearBGPalettes
+ xor a
+ ld [wTimeOfDayPal], a
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call ClearTilemap
+ call DisableLCD
+ call ClearSprites
+ xor a
+ ldh [hBGMapMode], a
+ ldh [hMapAnims], a
+ ldh [hSCY], a
+ ldh [hSCX], a
+
+ ld hl, $8000
+ ld bc, $2000
+ xor a
+ call ByteFill
+ farcall ClearSpriteAnims
+
+ ld hl, TitleScreenGFX1
+ ld de, vTiles2
+ ld a, BANK(TitleScreenGFX1)
+ call FarDecompress
+
+ ld hl, TitleScreenGFX2
+ ld de, vTiles1
+ ld a, BANK(TitleScreenGFX2)
+ call FarDecompress
+
+ ld hl, TitleScreenGFX4
+ ld de, vTiles0
+ ld a, BANK(TitleScreenGFX4)
+ call FarDecompress
+
+ ld hl, TitleScreenGFX3
+ ld de, vTiles1 tile $78
+ ld bc, 8 tiles
+ ld a, BANK(TitleScreenGFX3)
+ call FarCopyBytes
+
+ call Function636e
+ call Function63b6
+ ld hl, wSpriteAnimDict
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ld hl, rLCDC
+ set 2, [hl]
+ call EnableLCD
+ xor a
+ ld hl, wce63
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ld de, $6058
+ ld a, $2c ; HO-OH
+ call InitSpriteAnimStruct
+ ld hl, wSpriteAnim1
+ ld de, wSpriteAnim10
+ ld bc, $a
+ call CopyBytes
+ ld hl, wSpriteAnim1
+ ld [hl], $0
+ ld hl, wLYOverrides
+ ld bc, $90
+ xor a
+ call ByteFill
+
+; Let LCD Stat know we're messing around with SCX
+ ld a, LOW(rSCX)
+ ldh [hLCDCPointer], a
+ ld b, $c
+ call GetSGBLayout
+ call Function6341
+ ld de, MUSIC_TITLE
+ call PlayMusic
+ ret
+
+Function6341:
+ ldh a, [hCGB]
+ and a
+ jr nz, .asm_6365
+ ldh a, [hSGB]
+ and a
+ jr nz, .asm_6358
+ ld a, $d8
+ ldh [rBGP], a
+IF DEF(_GOLD)
+ ld a, $ff
+ ldh [rOBP0], a
+ ld a, $f8
+ELIF DEF(_SILVER)
+ ld a, $f0
+ ldh [rOBP0], a
+ ld a, $f0
+ENDC
+ ldh [rOBP1], a
+ ret
+
+.asm_6358
+ ld a, $e4
+ ldh [rBGP], a
+IF DEF(_GOLD)
+ ld a, $ff
+ ldh [rOBP0], a
+ ld a, $e4
+ELIF DEF(_SILVER)
+ ld a, $f0
+ ldh [rOBP0], a
+ ld a, $e0
+ENDC
+ ldh [rOBP1], a
+ ret
+
+.asm_6365
+ ld a, $e4
+ call DmgToCgbBGPals
+IF DEF(_SILVER)
+ ld a, $e0
+ENDC
+ call DmgToCgbObjPal0
+ ret
+
+Function636e:
+ ldh a, [hCGB]
+ and a
+ ret z
+ ld a, $1
+ ldh [rVBK], a
+ ld hl, $9800
+ ld bc, $240
+ xor a
+ call ByteFill
+ ld hl, $9800
+ ld bc, $714
+ ld a, $1
+ call Function63a6
+ ld hl, $98c5
+ ld bc, $10a
+ ld a, $3
+ call Function63a6
+ ld hl, $9980
+ ld bc, $a0
+ ld a, $4
+ call ByteFill
+ ld a, $0
+ ldh [rVBK], a
+ ret
+
+Function63a6:
+ push bc
+ push hl
+.asm_63a8
+ ld [hli], a
+ dec c
+ jr nz, .asm_63a8
+ pop hl
+ ld bc, $20
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, Function63a6
+ ret
+
+Function63b6:
+ ld hl, GSIntroTilemap ; $4616
+ ld de, $9800
+.asm_63bc
+ ld a, BANK(GSIntroTilemap) ; $26
+ call GetFarByte
+ cp $ff
+ jr z, .asm_63ca
+ inc hl
+ ld [de], a
+ inc de
+ jr .asm_63bc
+
+.asm_63ca
+ ldh a, [hCGB]
+ and a
+ ret nz
+ ld hl, $9960
+ ld bc, $20
+ ld a, $50
+ call ByteFill
+ ret
diff --git a/engine/overworld/map_objects.asm b/engine/overworld/map_objects.asm
index a03a0171..62b1df41 100755
--- a/engine/overworld/map_objects.asm
+++ b/engine/overworld/map_objects.asm
@@ -402,7 +402,7 @@ UpdatePlayerStep:
set PLAYERSTEP_CONTINUE_F, [hl]
ret
-Function4732:
+Unreferenced_Function4732:
push bc
ld e, a
ld d, 0
@@ -1518,14 +1518,14 @@ StepType05:
ld [hl], a
call IncrementObjectStructField1c
StepType04:
- call Stubbed_Function4fb2
+ call Stubbed_Function4f5a
ld hl, OBJECT_DIRECTION_WALKING
add hl, bc
ld [hl], STANDING
ret
NPCStep:
- call Stubbed_Function4fb2
+ call Stubbed_Function4f5a
call AddStepVector
ld hl, OBJECT_STEP_DURATION
add hl, bc
@@ -1747,7 +1747,7 @@ StepType17:
dw .null
.null
-Stubbed_Function4fb2:
+Stubbed_Function4f5a:
ret
ld hl, OBJECT_1D
add hl, bc
diff --git a/main.asm b/main.asm
index 7ccd3f32..65b0ef5f 100644
--- a/main.asm
+++ b/main.asm
@@ -6,6 +6,7 @@ SECTION "bank1", ROMX
INCLUDE "engine/link/place_waiting_text.asm"
INCLUDE "engine/gfx/load_push_oam.asm"
INCLUDE "engine/overworld/map_objects.asm"
+INCLUDE "engine/menus/main_menu.asm"
INCLUDE "engine/menus/intro_menu.asm"
INCLUDE "engine/overworld/init_map.asm"
INCLUDE "engine/pokemon/learn.asm"
@@ -180,7 +181,10 @@ TilesetDarkCaveColl::
SECTION "bank8", ROMX
- dr $20000, $20181
+RestartClock_GetWraparoundTime::
+ dr $20000, $20021
+RestartClock::
+ dr $20021, $20181
TilesetTowerGFX::
dr $20181, $205b1
TilesetTowerMeta::
@@ -498,9 +502,9 @@ SaveMenu_CopyTilemapAtOnce::
dr $8c000, $8c0b9
PhoneRing_CopyTilemapAtOnce::
dr $8c0b9, $8c17a
-ResetClock_::
+_ResetClock::
dr $8c17a, $8c310
-DeleteSaveData_::
+_DeleteSaveData::
dr $8c310, $8c355
DummyPredef35::
DummyPredef36::
diff --git a/wram.asm b/wram.asm
index 027db95e..d95af439 100644
--- a/wram.asm
+++ b/wram.asm
@@ -1892,7 +1892,7 @@ wd13f:: ds 1 ; d13f
wCurBaseDataEnd::
wd140:: ds 1 ; d140
-wCurDamage:: ds 2 ; d141
+wCurDamage:: dw ; d141
wd143:: ds 1 ; d143
wd144:: ds 1 ; d144
wMornEncounterRate:: db ; d145
@@ -2050,7 +2050,7 @@ wRedsName:: ds NAME_LENGTH ; d1c4
wGreensName:: ds NAME_LENGTH ; d1cf
wSavedAtLeastOnce:: ds 1 ; d1da
-wd1db:: ds 1 ; d1db
+wSpawnAfterChampion:: ds 1 ; d1db
wStartDay:: db ; d1dc
wStartHour:: db ; d1dd
wStartMinute:: db ; d1de
@@ -2098,7 +2098,6 @@ UNION
ds 18
wPlayerData1End::
wPlayerData2::
- ds 1
NEXTU
wObject11Struct:: object_struct wObject11
wObject12Struct:: object_struct wObject12
@@ -2579,7 +2578,7 @@ wDecoLeftOrnament:: db ; d95e
wDecoRightOrnament:: db ; d95f
wDecoBigDoll:: db ; d960
-wd961:: ds 1 ; d961
+wWhichMomItem:: ds 1 ; d961
wd962:: ds 1 ; d962
wMomItemTriggerBalance:: ds 3 ; d963