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.
- Define a channel constant
- Define the music for the channel
- Define the frequency and availability for the channel
- Give the channel a name and text routine
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
...
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
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.
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!