Use different starter rosters for each version - pret/pokered GitHub Wiki

Red and Blue share the same starter roster, but what if you wanted a different roster for each version?

In this tutorial we will replace the starters only in blue version.

Let's start by editing the pokemon constants:

-DEF STARTER1 EQU CHARMANDER
-DEF STARTER2 EQU SQUIRTLE
-DEF STARTER3 EQU BULBASAUR
+IF DEF(_BLUE)
+	DEF STARTER1 EQU VULPIX
+	DEF STARTER1_MIDDLE EQU VULPIX
+	DEF STARTER1_FINAL EQU NINETALES
+
+	DEF STARTER2 EQU POLIWAG
+	DEF STARTER2_MIDDLE EQU POLIWHIRL
+	DEF STARTER2_FINAL EQU POLIWRATH
+
+	DEF STARTER3 EQU ODDISH
+	DEF STARTER3_MIDDLE EQU GLOOM
+	DEF STARTER3_FINAL EQU VILEPLUME
+ENDC
+IF DEF(_RED)
+	DEF STARTER1 EQU CHARMANDER
+	DEF STARTER1_MIDDLE EQU CHARMELEON
+	DEF STARTER1_FINAL EQU CHARIZARD
+
+	DEF STARTER2 EQU SQUIRTLE
+	DEF STARTER2_MIDDLE EQU WARTORTLE
+	DEF STARTER2_FINAL EQU BLASTOISE
+
+	DEF STARTER3 EQU BULBASAUR
+	DEF STARTER3_MIDDLE EQU IVYSAUR
+	DEF STARTER3_FINAL EQU VENUSAUR
+ENDC

We separated the STARTER1, STARTER2 and STARTER3 definitions for red and blue. We also added new constants for the starters' evolutions to use them in the rival's teams. Fire types are really unlucky in Kanto, there is no other fire line with 3 members so we're using Vulpix as the middle fire stage in blue.

Next apply this tutorial to ensure that your starters' dex entries are visible in the starter selection scene.

Next let's edit Oak's parties as well as the rival's parties in data/trainers/parties.asm:

 Rival1Data:
-	db 5, SQUIRTLE, 0
-	db 5, BULBASAUR, 0
-	db 5, CHARMANDER, 0
+	db 5, STARTER2, 0
+	db 5, STARTER3, 0
+	db 5, STARTER1, 0
 ; Route 22
-	db $FF, 9, PIDGEY, 8, SQUIRTLE, 0
-	db $FF, 9, PIDGEY, 8, BULBASAUR, 0
-	db $FF, 9, PIDGEY, 8, CHARMANDER, 0
+	db $FF, 9, PIDGEY, 8, STARTER2, 0
+	db $FF, 9, PIDGEY, 8, STARTER3, 0
+	db $FF, 9, PIDGEY, 8, STARTER1, 0
 ; Cerulean City
-	db $FF, 18, PIDGEOTTO, 15, ABRA, 15, RATTATA, 17, SQUIRTLE, 0
-	db $FF, 18, PIDGEOTTO, 15, ABRA, 15, RATTATA, 17, BULBASAUR, 0
-	db $FF, 18, PIDGEOTTO, 15, ABRA, 15, RATTATA, 17, CHARMANDER, 0
+	db $FF, 18, PIDGEOTTO, 15, ABRA, 15, RATTATA, 17, STARTER2, 0
+	db $FF, 18, PIDGEOTTO, 15, ABRA, 15, RATTATA, 17, STARTER3, 0
+	db $FF, 18, PIDGEOTTO, 15, ABRA, 15, RATTATA, 17, STARTER1, 0
 
 ProfOakData:
 ; Unused
-	db $FF, 66, TAUROS, 67, EXEGGUTOR, 68, ARCANINE, 69, BLASTOISE, 70, GYARADOS, 0
-	db $FF, 66, TAUROS, 67, EXEGGUTOR, 68, ARCANINE, 69, VENUSAUR, 70, GYARADOS, 0
-	db $FF, 66, TAUROS, 67, EXEGGUTOR, 68, ARCANINE, 69, CHARIZARD, 70, GYARADOS, 0
+	db $FF, 66, TAUROS, 67, EXEGGUTOR, 68, ARCANINE, 69, STARTER2_FINAL, 70, GYARADOS, 0
+	db $FF, 66, TAUROS, 67, EXEGGUTOR, 68, ARCANINE, 69, STARTER3_FINAL, 70, GYARADOS, 0
+	db $FF, 66, TAUROS, 67, EXEGGUTOR, 68, ARCANINE, 69, STARTER1_FINAL, 70, GYARADOS, 0
 Rival2Data:
 ; SS Anne 2F
-	db $FF, 19, PIDGEOTTO, 16, RATICATE, 18, KADABRA, 20, WARTORTLE, 0
-	db $FF, 19, PIDGEOTTO, 16, RATICATE, 18, KADABRA, 20, IVYSAUR, 0
-	db $FF, 19, PIDGEOTTO, 16, RATICATE, 18, KADABRA, 20, CHARMELEON, 0
+	db $FF, 19, PIDGEOTTO, 16, RATICATE, 18, KADABRA, 20, STARTER2_MIDDLE, 0
+	db $FF, 19, PIDGEOTTO, 16, RATICATE, 18, KADABRA, 20, STARTER3_MIDDLE, 0
+	db $FF, 19, PIDGEOTTO, 16, RATICATE, 18, KADABRA, 20, STARTER1_MIDDLE, 0
 ; Pokémon Tower 2F
-	db $FF, 25, PIDGEOTTO, 23, GROWLITHE, 22, EXEGGCUTE, 20, KADABRA, 25, WARTORTLE, 0
-	db $FF, 25, PIDGEOTTO, 23, GYARADOS, 22, GROWLITHE, 20, KADABRA, 25, IVYSAUR, 0
-	db $FF, 25, PIDGEOTTO, 23, EXEGGCUTE, 22, GYARADOS, 20, KADABRA, 25, CHARMELEON, 0
+	db $FF, 25, PIDGEOTTO, 23, GROWLITHE, 22, EXEGGCUTE, 20, KADABRA, 25, STARTER2_MIDDLE, 0
+	db $FF, 25, PIDGEOTTO, 23, GYARADOS, 22, GROWLITHE, 20, KADABRA, 25, STARTER3_MIDDLE, 0
+	db $FF, 25, PIDGEOTTO, 23, EXEGGCUTE, 22, GYARADOS, 20, KADABRA, 25, STARTER1_MIDDLE, 0
 ; Silph Co. 7F
-	db $FF, 37, PIDGEOT, 38, GROWLITHE, 35, EXEGGCUTE, 35, ALAKAZAM, 40, BLASTOISE, 0
-	db $FF, 37, PIDGEOT, 38, GYARADOS, 35, GROWLITHE, 35, ALAKAZAM, 40, VENUSAUR, 0
-	db $FF, 37, PIDGEOT, 38, EXEGGCUTE, 35, GYARADOS, 35, ALAKAZAM, 40, CHARIZARD, 0
+	db $FF, 37, PIDGEOT, 38, GROWLITHE, 35, EXEGGCUTE, 35, ALAKAZAM, 40, STARTER2_FINAL, 0
+	db $FF, 37, PIDGEOT, 38, GYARADOS, 35, GROWLITHE, 35, ALAKAZAM, 40, STARTER3_FINAL, 0
+	db $FF, 37, PIDGEOT, 38, EXEGGCUTE, 35, GYARADOS, 35, ALAKAZAM, 40, STARTER1_FINAL, 0
 ; Route 22
-	db $FF, 47, PIDGEOT, 45, RHYHORN, 45, GROWLITHE, 47, EXEGGCUTE, 50, ALAKAZAM, 53, BLASTOISE, 0
-	db $FF, 47, PIDGEOT, 45, RHYHORN, 45, GYARADOS, 47, GROWLITHE, 50, ALAKAZAM, 53, VENUSAUR, 0
-	db $FF, 47, PIDGEOT, 45, RHYHORN, 45, EXEGGCUTE, 47, GYARADOS, 50, ALAKAZAM, 53, CHARIZARD, 0
+	db $FF, 47, PIDGEOT, 45, RHYHORN, 45, GROWLITHE, 47, EXEGGCUTE, 50, ALAKAZAM, 53, STARTER2_FINAL, 0
+	db $FF, 47, PIDGEOT, 45, RHYHORN, 45, GYARADOS, 47, GROWLITHE, 50, ALAKAZAM, 53, STARTER3_FINAL, 0
+	db $FF, 47, PIDGEOT, 45, RHYHORN, 45, EXEGGCUTE, 47, GYARADOS, 50, ALAKAZAM, 53, STARTER1_FINAL, 0
 
 Rival3Data:
-	db $FF, 61, PIDGEOT, 59, ALAKAZAM, 61, RHYDON, 61, ARCANINE, 63, EXEGGUTOR, 65, BLASTOISE, 0
-	db $FF, 61, PIDGEOT, 59, ALAKAZAM, 61, RHYDON, 61, GYARADOS, 63, ARCANINE, 65, VENUSAUR, 0
-	db $FF, 61, PIDGEOT, 59, ALAKAZAM, 61, RHYDON, 61, EXEGGUTOR, 63, GYARADOS, 65, CHARIZARD, 0
+	db $FF, 61, PIDGEOT, 59, ALAKAZAM, 61, RHYDON, 61, ARCANINE, 63, EXEGGUTOR, 65, STARTER2_FINAL, 0
+	db $FF, 61, PIDGEOT, 59, ALAKAZAM, 61, RHYDON, 61, GYARADOS, 63, ARCANINE, 65, STARTER3_FINAL, 0
+	db $FF, 61, PIDGEOT, 59, ALAKAZAM, 61, RHYDON, 61, EXEGGUTOR, 63, GYARADOS, 65, STARTER1_FINAL, 0

Note that we didn't edit other trainers' parties that have starter stages in them since we don't want them to change.

Edit text/OaksLab.asm to have dynamic names:

 _OaksLabYouWantCharmanderText::
 	text "So! You want the"
 	line "fire #MON,"
-	cont "CHARMANDER?"
-	done
+	cont "@"
+	text_ram wNameBuffer
+	text "?@"
+	text_end
 
 _OaksLabYouWantSquirtleText::
 	text "So! You want the"
 	line "water #MON,"
-	cont "SQUIRTLE?"
-	done
+	cont "@"
+	text_ram wNameBuffer
+	text "?@"
+	text_end
 
 _OaksLabYouWantBulbasaurText::
 	text "So! You want the"
 	line "plant #MON,"
-	cont "BULBASAUR?"
-	done
+	cont "@"
+	text_ram wNameBuffer
+	text "?@"
+	text_end

The name was already loaded by the dex entry so you can just reuse it.

Lastly, remove the useless call to GetMonName in scripts/OaksLab.asm:

 	jr nz, OaksLabMonChoiceEnd
 	ld a, [wCurPartySpecies]
 	ld [wPlayerStarter], a
-	ld [wNamedObjectIndex], a
-	call GetMonName
 	ld a, [wSpriteIndex]
 	cp OAKSLAB_CHARMANDER_POKE_BALL
 	jr nz, .not_charmander

This call is not needed since the dex entry already loaded the name.

And voila, you're done.