Add a new radio channel - pret/pokecrystal GitHub Wiki

This tutorial teaches you how to add a new radio channel. (Radio channels with text coming soon!)

For this tutorial we're going to add a channel that plays the National Park music.

Contents

  1. Define a channel constant
  2. Define the music for the channel
  3. Define the frequency and availability for the channel
  4. Give the channel a name and text routine

1. Define a channel constant

Edit constants/radio_constants.asm:

 ; radio channel ids
 ; indexes for:
 ; - RadioChannelSongs (see data/radio/channel_music.asm)
 ; - PlayRadioShow/RadioJumptable (see engine/pokegear/radio.asm)
 ; - RadioChannels (see engine/pokegear/radio.asm)
 	const_def
 	const OAKS_POKEMON_TALK      ; 00
 	const POKEDEX_SHOW           ; 01
 	const POKEMON_MUSIC          ; 02
 	const LUCKY_CHANNEL          ; 03
 	const BUENAS_PASSWORD        ; 04
 	const PLACES_AND_PEOPLE      ; 05
 	const LETS_ALL_SING          ; 06
 	const ROCKET_RADIO           ; 07
 	const POKE_FLUTE_RADIO       ; 08
 	const UNOWN_RADIO            ; 09
 	const EVOLUTION_RADIO        ; 0a
+	const NATIONAL_PARK_RADIO
 	...

2. Define the music for the channel

Edit data/radio/channel_music.asm:

 RadioChannelSongs:
 ; entries correspond to radio channel ids
 	dw MUSIC_POKEMON_TALK
 	dw MUSIC_POKEMON_CENTER
 	dw MUSIC_TITLE
 	dw MUSIC_GAME_CORNER
 	dw MUSIC_BUENAS_PASSWORD
 	dw MUSIC_VIRIDIAN_CITY
 	dw MUSIC_BICYCLE
 	dw MUSIC_ROCKET_OVERTURE
 	dw MUSIC_POKE_FLUTE_CHANNEL
 	dw MUSIC_RUINS_OF_ALPH_RADIO
 	dw MUSIC_LAKE_OF_RAGE_ROCKET_RADIO
+	dw MUSIC_NATIONAL_PARK

3. Define the frequency and availability for the channel

Edit engine/pokegear/pokegear.asm:

 RadioChannels:
 ; entries correspond to constants/radio_constants.asm

 ; frequency value given here = 4 × ingame_frequency − 2
 	dbw 16, .PKMNTalkAndPokedexShow
 	dbw 28, .PokemonMusic
 	dbw 32, .LuckyChannel
 	dbw 40, .BuenasPassword
 	dbw 52, .RuinsOfAlphRadio
+	dbw 58, .NationalPark
 	dbw 64, .PlacesAndPeople
 	dbw 72, .LetsAllSing
 	dbw 78, .PokeFluteRadio
 	dbw 80, .EvolutionRadio
 	db -1

 ...

 .RuinsOfAlphRadio:
 	ld a, [wPokegearMapPlayerIconLandmark]
 	cp RUINS_OF_ALPH
 	jr nz, .NoSignal
 	jp LoadStation_UnownRadio
+
+.NationalPark:
+	call .InJohto
+	jr nc, .NoSignal
+	jp LoadStation_NationalPark

 .PlacesAndPeople:
 	call .InJohto
 	jr c, .NoSignal
 	ld a, [wPokegearFlags]
 	bit POKEGEAR_EXPN_CARD_F, a
 	jr z, .NoSignal
 	jp LoadStation_PlacesAndPeople

Here we want the National Park channel to be at frequency 15, and 15×4−2=58, so that's its frequency value.

Note how the routine determines when the channel is available. As long as you're in Johto, the National Park channel will play on frequency 15. Most Kanto channels have two requirements: that you're not in Johto (so you must be in Kanto), and that you have the Expn Card. The .PlacesAndPeople channel is an example of that. You can even invent other conditions, like how the Ruins of Alph channel is only available when you're actually in the Ruins of Alph.

Anyway, we haven't defined LoadStation_NationalPark, so let's do that next.

4. Give the channel a name and text routine

Continue to edit engine/pokegear/pokegear.asm:

 LoadStation_UnownRadio:
 	ld a, UNOWN_RADIO
 	ld [wCurRadioLine], a
 	xor a
 	ld [wNumRadioLinesPrinted], a
 	ld a, BANK(PlayRadioShow)
 	ld hl, PlayRadioShow
 	call Radio_BackUpFarCallParams
 	ld de, UnownStationName
 	ret
+
+LoadStation_NationalPark:
+	ld a, NATIONAL_PARK_RADIO
+	ld [wCurRadioLine], a
+	xor a
+	ld [wNumRadioLinesPrinted], a
+	ld a, BANK(PlayRadioShow)
+	ld hl, PlayRadioShow
+	call Radio_BackUpFarCallParams
+	ld de, NationalParkRadioName
+	ret

 ...

 OaksPKMNTalkName:     db "OAK's <PK><MN> Talk@"
 PokedexShowName:      db "#DEX Show@"
 PokemonMusicName:     db "#MON Music@"
 LuckyChannelName:     db "Lucky Channel@"
 UnownStationName:     db "?????@"
+NationalParkRadioName: db "National Park@"

 PlacesAndPeopleName:  db "Places & People@"
 LetsAllSingName:      db "Let's All Sing!@"
 PokeFluteStationName: db "# FLUTE@"

Since this channel will just play music, not print any text, we can give it a simple definition like the other music-only channels.

(Note that the label "NationalParkName" already exists, for the name of the National Park location in data/maps/landmarks.asm, so we have to use "NationalParkRadioName".)

Now we're done!

Screenshot

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