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! ![Screenshot](screenshots/master-rod.png)