Name the rival during the intro - pret/pokecrystal GitHub Wiki

Generation 2 made it so that the player's rival gets named early on in the game, unlike the Generation 1 games, which had it as part of the intro lecture. The goal of this tutorial is to port the latter sequence to Crystal, where the rival would have three predefined names, and the option to give him a unique name.

Contents

  1. Update the intro sequence
  2. Add the new intro dialogue

1. Update the intro sequence

Edit engine/menus/intro_menu.asm:

	ld hl, OakText6
	call PrintText
	call NamePlayer
	ld hl, OakText7
	call PrintText
+	call RotateThreePalettesRight
+	call ClearTilemap
+
+	xor a
+	ld [wCurPartySpecies], a
+	ld a, RIVAL1
+	ld [wTrainerClass], a
+	call Intro_PrepTrainerPic
+
+	ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
+	call GetSGBLayout
+	call Intro_RotatePalettesLeftFrontpic
+
+	ld hl, OakText8
+	call PrintText
+	call NameRivalIntro
+	ld hl, OakText9
+	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, OakText10
+	call PrintText
	ret

We want to assign some new text entries to Prof.Oak for the expanded intro sequence. We'll go about adding the text later, now let's stick to defining the new strings we'll be needing:

OakText7:
	text_far _OakText7
	text_end

+OakText8:
+	text_far _OakText8
+	text_end
+
+OakText9:
+	text_far _OakText9
+	text_end
+
+OakText10:
+	text_far _OakText10
+	text_end

Now let's add the remainder of the code:

.Chris:
	db "CHRIS@@@@@@"
.Kris:
	db "KRIS@@@@@@@"

+NameRivalIntro:
+	farcall MovePlayerPicRight
+	call ShowRivalNamingChoices
+	ld a, [wMenuCursorY]
+	dec a
+	jr z, .NewName
+	call StoreRivalName
+	farcall ApplyMonOrTrainerPals
+	farcall MovePlayerPicLeft
+	ret
+
+.NewName:
+	ld b, NAME_RIVAL
+	ld de, wRivalName
+	farcall NamingScreen
+
+	call RotateThreePalettesRight
+	call ClearTilemap
+
+	call LoadFontsExtra
+	call WaitBGMap
+
+	xor a
+	ld [wCurPartySpecies], a
+	ld a, RIVAL1
+	ld [wTrainerClass], a
+	call Intro_PrepTrainerPic
+
+	ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
+	call GetSGBLayout
+	call RotateThreePalettesLeft
+
+	ld hl, wRivalName
+	ld de, RivalNames
+	call InitName
+	ret
+
+.RivalName:
+	db "SILVER@@@@@"
+
+ShowRivalNamingChoices:
+	ld hl, RivalNameMenuHeaderIntro
+	call LoadMenuHeader
+	call VerticalMenu
+	ld a, [wMenuCursorY]
+	dec a
+	call CopyNameFromMenu
+	call CloseWindow
+	ret
+
+RivalNameMenuHeaderIntro:
+	db MENU_BACKUP_TILES ; flags
+	menu_coords 0, 0, 10, TEXTBOX_Y - 1
+	dw .Names
+	db 1 ; default option
+	db 0 ; ????
+
+.Names:
+	db STATICMENU_CURSOR | STATICMENU_PLACE_TITLE | STATICMENU_DISABLE_B ; flags
+	db 5 ; items
+	db "NEW NAME@"
+RivalNames:
+	db "SILVER@"
+	db "KAMON@"
+	db "OSCAR@"
+	db "MAX@"
+	db 2 ; title indent
+	db " NAME @" ; title
StorePlayerName:
	ld a, "@"
	ld bc, NAME_LENGTH
	ld hl, wPlayerName
	call ByteFill
	ld hl, wPlayerName
	ld de, wStringBuffer2
	call CopyName2
	ret
	
+StoreRivalName:
+	ld a, "@"
+	ld bc, NAME_LENGTH
+	ld hl, wRivalName
+	call ByteFill
+	ld hl, wRivalName
+	ld de, wStringBuffer2
+	call CopyName2
+	ret

2. Add the new intro dialogue

Now let's add what Prof.Oak will be saying when it'll be time to give the rival a name. Edit data/text/common_3.asm:

_OakText6::
	text "Now, what did you"
	line "say your name was?"
	prompt

_OakText7::
+	text "Right! So your"
+	line "name is <PLAYER>!"
+	prompt
+
+_OakText8::
+	text "That boy has been"
+	line "hanging around my"
+	cont "lab lately."
+
+	para "Do you know him?"
+	line "What's his name?"
+	prompt
+
+_OakText9::
+	text "Oh, so his name is"
+	line "<RIVAL> then!"
+	prompt
+
+_OakText10::
	text "<PLAYER>, are you"
	line "ready?"

	para "Your very own"
	line "#MON story is"
	cont "about to unfold."
	para "You'll face fun"
	line "times and tough"
	cont "challenges."
	para "A world of dreams"
	line "and adventures"
	para "with #MON"
	line "awaits! Let's go!"
	para "I'll be seeing you"
	line "later!"
	done

And now we're all set!

Of course, this tutorial assumes that your hack will feature a new story. Otherwise, the only other changes required would be rewriting the officer cutscene in maps/ElmsLab.asm, and updating the rival's post-battle dialogue in maps/CherrygroveCity.asm, since it uses ??? instead of <RIVAL>.

image image

⚠️ **GitHub.com Fallback** ⚠️