This tutorial is for how to add a new fishing rod. As an example, we'll add a Master Rod, even better than a Super Rod.
## Contents
1. [Create the new Rod item](#1-create-the-new-rod-item)
2. [Define the item effect](#2-define-the-item-effect)
3. [Define wild data for the new Rod](#3-define-wild-data-for-the-new-rod)
4. [Update the code that loads the wild data](#4-update-the-code-that-loads-the-wild-data)
## 1. Create the new Rod item
Follow [the tutorial to add a new item](Add-a-new-item) to create the Master Rod. Replace `ITEM_88` with `MASTER_ROD`, and give it a name, description, and attributes (`0, HELD_NONE, 0, CANT_TOSS, KEY_ITEM, ITEMMENU_CLOSE, ITEMMENU_NOUSE`). (`ITEM_88` is not in `TimeCapsule_CatchRateItems`.)
## 2. Define the item effect
Edit [engine/items/item_effects.asm](../blob/master/engine/items/item_effects.asm):
```diff
ItemEffects:
; entries correspond to item ids
dw PokeBallEffect ; MASTER_BALL
...
dw NoEffect ; ITEM_87
- dw NoEffect ; ITEM_88
+ dw MasterRodEffect ; MASTER_ROD
dw NoEffect ; ITEM_89
...
dw NoEffect ; ITEM_B3
...
OldRodEffect:
ld e, $0
jr UseRod
GoodRodEffect:
ld e, $1
jr UseRod
SuperRodEffect:
ld e, $2
jr UseRod
+
+MasterRodEffect:
+ ld e, $3
+ jr UseRod
UseRod:
farcall FishFunction
ret
```
Pretty simple; we just observe how the other three Rods work, and follow their pattern.
## 3. Define wild data for the new Rod
Edit [data/wild/fish.asm](../blob/master/data/wild/fish.asm):
```diff
time_group EQUS "0," ; use the nth TimeFishGroups entry
fishgroup: MACRO
-; chance, old rod, good rod, super rod
- dbwww \1, \2, \3, \4
+; chance, old rod, good rod, super rod, master rod
+ db \1
+ dw \2, \3, \4, \5
ENDM
FishGroups:
; entries correspond to FISHGROUP_* constants
- fishgroup 50 percent + 1, .Shore_Old, .Shore_Good, .Shore_Super
- ...
- fishgroup 50 percent + 1, .Qwilfish_NoSwarm_Old, .Qwilfish_NoSwarm_Good, .Qwilfish_NoSwarm_Super
+ fishgroup 50 percent + 1, .Shore_Old, .Shore_Good, .Shore_Super, .Shore_Master
+ ...
+ fishgroup 50 percent + 1, .Qwilfish_NoSwarm_Old, .Qwilfish_NoSwarm_Good, .Qwilfish_NoSwarm_Super, .Qwilfish_NoSwarm_Master
...
.Remoraid_Old:
db 70 percent + 1, MAGIKARP, 10
db 85 percent + 1, MAGIKARP, 10
db 100 percent, POLIWAG, 10
.Remoraid_Good:
db 35 percent, MAGIKARP, 20
db 70 percent, POLIWAG, 20
db 90 percent + 1, POLIWAG, 20
db 100 percent, time_group 6
.Remoraid_Super:
db 40 percent, POLIWAG, 40
db 70 percent, time_group 7
db 90 percent + 1, MAGIKARP, 40
db 100 percent, REMORAID, 40
+
+.Shore_Master:
+.Ocean_Master:
+.Lake_Master:
+.Pond_Master:
+.WhirlIslands_Master:
+ db 20 percent, OMASTAR, 60
+ db 40 percent, KABUTOPS, 60
+ db 70 percent, OCTILLERY, 60
+ db 90 percent + 1, LAPRAS, 60
+ db 100 percent, KINGDRA, 60
+
+.Gyarados_Master:
+ db 40 percent, MAGIKARP, 60
+ db 70 percent, GYARADOS, 60
+ db 90 percent + 1, GYARADOS, 60
+ db 100 percent, GYARADOS, 60
+
+.Dratini_Master:
+.Dratini_2_Master:
+ db 40 percent, GYARADOS, 60
+ db 70 percent, KINGDRA, 60
+ db 90 percent + 1, DRAGONAIR, 60
+ db 100 percent, DRAGONITE, 60
+
+.Qwilfish_Master:
+.Qwilfish_Swarm_Master:
+.Qwilfish_NoSwarm_Master:
+ db 40 percent, TENTACRUEL, 60
+ db 70 percent, QWILFISH, 60
+ db 90 percent + 1, QWILFISH, 60
+ db 100 percent, QWILFISH, 60
+
+.Remoraid_Master:
+.Remoraid_Swarm_Master:
+ db 40 percent, TENTACRUEL, 60
+ db 70 percent, REMORAID, 60
+ db 90 percent + 1, REMORAID, 60
+ db 100 percent, OCTILLERY, 60
```
Here we've modified the `fishgroup` macro to take four pointers instead of three; added new pointers to the end of each `fishgroup` line for the Master Rod; and declared the actual data for the new Master Rod pointers.
Notice the format of the wild data. Each line has the format "db chance, species, level" or "db chance, time_group index", with the chances increasing up to 100%. A random byte from 0% to 100% is generated, and compared with the chances to determine your encounter.
## 4. Update the code that loads the wild data
Edit [constants/pokemon_data_constants.asm](../blob/master/constants/pokemon_data_constants.asm):
```diff
-FISHGROUP_DATA_LENGTH EQU 1 + 2 * 3
+FISHGROUP_DATA_LENGTH EQU 1 + 2 * 4
```
If you're using an older copy of pokecrystal and `FISHGROUP_DATA_LENGTH` does not exist, then edit [engine/events/fish.asm](../blob/master/engine/events/fish.asm) instead:
```diff
Fish:
; Using a fishing rod.
; Fish for monsters with rod e in encounter group d.
; Return monster e at level d.
push af
push bc
push hl
ld b, e
call GetFishGroupIndex
ld hl, FishGroups
-rept 7
+rept 9
add hl, de
endr
call .Fish
pop hl
pop bc
pop af
ret
```
Either way, this allows the `FishGroups` table to be indexed by Rods from 0 to 3, instead of 0 to 2. (Remember how we defined `MasterRodEffect`.)
We're done!
