summaryrefslogtreecommitdiff
path: root/New-type-(Fairy).md
diff options
context:
space:
mode:
Diffstat (limited to 'New-type-(Fairy).md')
-rw-r--r--New-type-(Fairy).md182
1 files changed, 182 insertions, 0 deletions
diff --git a/New-type-(Fairy).md b/New-type-(Fairy).md
new file mode 100644
index 0000000..23aef99
--- /dev/null
+++ b/New-type-(Fairy).md
@@ -0,0 +1,182 @@
+This tutorial is for how to add a new type for Pokémon or moves. As an example, we'll add the Fairy type from Gen 7.
+
+In short, we need to update all of these:
+
+- [constants/type_constants.asm](../../blob/master/constants/type_constants.asm)
+- `TypeNames` in [data/types/names.asm](../../blob/master/data/types/names.asm)
+- `TypeMatchups` in [data/types/type_matchups.asm](../../blob/master/data/types/type_matchups.asm)
+- `PokedexTypeSearchConversionTable` in [data/types/search_types.asm](../../blob/master/data/types/search_types.asm)
+- `PokedexTypeSearchStrings` in [data/types/search_strings.asm](../../blob/master/data/types/search_strings.asm)
+- `TypeBoostItems` in [data/types/type_boost_items.asm](../../blob/master/data/types/type_boost_items.asm)
+
+
+## 1. Add a `FAIRY_T` constant
+
+Gen 2 was before the physical/special split, so the types after `SPECIAL` count as special, and the rest count as physical. Fairy moves are mostly special, so we'll add it there.
+
+Edit [constants/type_constants.asm](../../blob/master/constants/type_constants.asm):
+
+```diff
+SPECIAL EQU const_value
+ const FIRE
+ const WATER
+ const GRASS
+ const ELECTRIC
+ const PSYCHIC
+ const ICE
+ const DRAGON
+ const DARK
++ const FAIRY_T
+TYPES_END EQU const_value
+```
+
+Note that we have to call it `FAIRY_T` because `FAIRY` is already used for an egg group.
+
+
+## 2. Update `TypeNames`
+
+Edit [data/types/names.asm](../../blob/master/data/types/names.asm):
+
+```diff
+TypeNames: ; 5097b
+; entries correspond to types (see constants/type_constants.asm)
+ dw Normal
+ ...
+ dw Dark
++ dw Fairy
+
+Normal: db "NORMAL@"
+...
+Dark: db "DARK@"
++Fairy: db "FAIRY@"
+```
+
+
+## 3. Update `TypeMatchups`
+
+Edit [data/types/type_matchups.asm](../../blob/master/data/types/type_matchups.asm):
+
+```diff
+TypeMatchups: ; 34bb1
+ ; attacker, defender, *=
+ db NORMAL, ROCK, NOT_VERY_EFFECTIVE
+ db NORMAL, STEEL, NOT_VERY_EFFECTIVE
+ ...
++ db FIGHTING, FAIRY_T, NOT_VERY_EFFECTIVE
++ db POISON, FAIRY_T, SUPER_EFFECTIVE
++ db BUG, FAIRY_T, NOT_VERY_EFFECTIVE
++ db DRAGON, FAIRY_T, NO_EFFECT
++ db DARK, FAIRY_T, NOT_VERY_EFFECTIVE
++ db STEEL, FAIRY_T, SUPER_EFFECTIVE
++ db FAIRY_T, POISON, NOT_VERY_EFFECTIVE
++ db FAIRY_T, DRAGON, SUPER_EFFECTIVE
++ db FAIRY_T, DARK, SUPER_EFFECTIVE
++ db FAIRY_T, STEEL, NOT_VERY_EFFECTIVE
+
+ db -2 ; end
+
+; Foresight removes Ghost's immunities.
+ db NORMAL, GHOST, NO_EFFECT
+ db FIGHTING, GHOST, NO_EFFECT
+
+ db -1 ; end (with Foresight)
+```
+
+
+## 4. Update `PokedexTypeSearchConversionTable` and `PokedexTypeSearchStrings`
+
+These tables are used for the Pokédex's type search feature.
+
+Edit [data/types/search_types.asm](../../blob/master/data/types/search_types.asm):
+
+```diff
+PokedexTypeSearchConversionTable: ; 410f6
+; entries correspond with PokedexTypeSearchStrings (see data/types/search_strings.asm)
+ db NORMAL
+ ...
+ db STEEL
++ db FAIRY_T
+; 41107
+```
+
+Edit [data/types/search_strings.asm](../../blob/master/data/types/search_strings.asm):
+
+```diff
+PokedexTypeSearchStrings: ; 40fe4
+; entries correspond with PokedexTypeSearchConversionTable (see data/types/search_types.asm)
+ db " ---- @"
+ db " NORMAL @"
+ ...
+ db " STEEL @"
++ db " FAIRY @"
+; 41086
+```
+
+
+## 5. Update Pokémon types
+
+Edit the type entries in [data/pokemon/base_stats/](../../blob/master/data/pokemon/base_stats/):
+
+- [azumarill.asm](../../blob/master/data/pokemon/base_stats/azumarill.asm): `db WATER, WATER` → `db WATER, FAIRY_T`
+- [clefable.asm](../../blob/master/data/pokemon/base_stats/clefable.asm): `db NORMAL, NORMAL` → `db FAIRY_T, FAIRY_T`
+- [clefairy.asm](../../blob/master/data/pokemon/base_stats/clefairy.asm): `db NORMAL, NORMAL` → `db FAIRY_T, FAIRY_T`
+- [cleffa.asm](../../blob/master/data/pokemon/base_stats/cleffa.asm): `db NORMAL, NORMAL` → `db FAIRY_T, FAIRY_T`
+- [granbull.asm](../../blob/master/data/pokemon/base_stats/granbull.asm): `db NORMAL, NORMAL` → `db FAIRY_T, FAIRY_T`
+- [igglybuff.asm](../../blob/master/data/pokemon/base_stats/igglybuff.asm): `db NORMAL, NORMAL` → `db NORMAL, FAIRY_T`
+- [jigglypuff.asm](../../blob/master/data/pokemon/base_stats/jigglypuff.asm): `db NORMAL, NORMAL` → `db NORMAL, FAIRY_T`
+- [marill.asm](../../blob/master/data/pokemon/base_stats/marill.asm): `db WATER, WATER` → `db WATER, FAIRY_T`
+- [mr__mime.asm](../../blob/master/data/pokemon/base_stats/mr__mime.asm): `db PSYCHIC, PSYCHIC` → `db PSYCHIC, FAIRY_T`
+- [snubbull.asm](../../blob/master/data/pokemon/base_stats/snubbull.asm): `db NORMAL, NORMAL` → `db FAIRY_T, FAIRY_T`
+- [togepi.asm](../../blob/master/data/pokemon/base_stats/togepi.asm): `db NORMAL, NORMAL` → `db FAIRY_T, FAIRY_T`
+- [togetic.asm](../../blob/master/data/pokemon/base_stats/togetic.asm): `db NORMAL, FLYING` → `db FAIRY_T, FLYING`
+- [wigglytuff.asm](../../blob/master/data/pokemon/base_stats/wigglytuff.asm): `db NORMAL, NORMAL` → `db NORMAL, FAIRY_T`
+
+
+## 6. Update move types
+
+Edit the type columns in [data/moves/moves.asm](../../blob/master/data/moves/moves.asm):
+
+- `CHARM`: `NORMAL` → `FAIRY_T`
+- `SWEET_KISS`: `NORMAL` → `FAIRY_T`
+- `MOONLIGHT`: `NORMAL` → `FAIRY_T`
+
+
+## 5. Change `POLKADOT_BOW` to boost `FAIRY_T` moves
+
+At this point we're technically done: all the canon aspects of the Fairy type are implemented. (If you want to add new Fairy-type Pokémon or moves, check out different tutorials.) But there's no held type-boosting item for it, and Gen 2 happens to have the unavailable `POLKADOT_BOW` item that boosts Normal moves like `PINK_BOW`, so let's change it to boost Fairy moves instead.
+
+Edit [data/types/type_boost_items.asm](../../blob/master/data/types/type_boost_items.asm):
+
+```diff
+TypeBoostItems: ; 35703
+- db HELD_NORMAL_BOOST, NORMAL ; PINK_BOW/POLKADOT_BOW
++ db HELD_NORMAL_BOOST, NORMAL ; PINK_BOW
+ ...
+ db HELD_STEEL_BOOST, STEEL ; METAL_COAT
++ db HELD_FAIRY_BOOST, FAIRY_T ; POLKADOT_BOW
+ db -1
+; 35726
+```
+
+But we still need to define `HELD_FAIRY_BOOST` and apply it to `POLKADOT_BOW`. So edit [constants/item_data_constants.asm](../../blob/master/constants/item_data_constants.asm):
+
+```diff
+const_value set 50
+ const HELD_NORMAL_BOOST
+ ...
+ const HELD_STEEL_BOOST
++ const HELD_FAIRY_BOOST
+```
+
+And [data/items/attributes.asm](../../blob/master/data/items/attributes.asm):
+
+```diff
+ItemAttributes: ; 67c1
+; entries correspond to constants/item_constants.asm
+...
+; POLKADOT_BOW
+- item_attribute 100, HELD_NORMAL_BOOST, 10, CANT_SELECT, ITEM, ITEMMENU_NOUSE, ITEMMENU_NOUSE
++ item_attribute 100, HELD_FAIRY_BOOST, 10, CANT_SELECT, ITEM, ITEMMENU_NOUSE, ITEMMENU_NOUSE
+```
+
+*Now* we're done! If you're just varying the original Crystal game, note that you can get three Pink Bows (one from Tuscany on Tuesdays, one from Mary after clearing Team Rocket from Radio Tower, and one from Picnicker Tiffany if you get her phone number), so one of those can be replaced with a Fairy-boosting Pink Bow. You'll also need damaging Fairy moves like Moonblast and Dazzling Gleam, so look up how to add those.