summaryrefslogtreecommitdiff
path: root/Add-a-new-radio-channel.md
blob: 805b7a148079e10715e2522d3b7cf8ee020c67fb (plain)
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!

![Screenshot](screenshots/national-park-radio.png)