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](#1-define-a-channel-constant) 2. [Define the music for the channel](#2-define-the-music-for-the-channel) 3. [Define the frequency and availability for the channel](#3-define-the-frequency-and-availability-for-the-channel) 4. [Give the channel a name and text routine](#4-give-the-channel-a-name-and-text-routine) ## 1. Define a channel constant Edit [constants/radio_constants.asm](../blob/master/constants/radio_constants.asm): ```diff ; 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](../blob/master/data/radio/channel_music.asm): ```diff 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](../blob/master/engine/pokegear/pokegear.asm): ```diff 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](../blob/master/engine/pokegear/pokegear.asm): ```diff 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 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](../blob/master/data/maps/landmarks.asm), so we have to use "`NationalParkRadioName`".) Now we're done! ![Screenshot](screenshots/national-park-radio.png)