1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
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 <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](../blob/master/data/maps/landmarks.asm), so we have to use "`NationalParkRadioName`".)
Now we're done!

|