Pikachu is evolving!

For defining evolutions for particular species, see Defining a species.

This page describes Pokémon evolution. It details the different evolution methods available by default, and explains how to create new evolution methods.

Evolution methods

Pokémon can evolve in a variety of different ways, such as gaining a level or gaining a new owner, or if it just really likes you. Nearly all evolution methods that exist in the Pokémon games have been coded into Essentials. You can even invent a few new methods of your own.

The evolution paths for a species are listed in the PBS file "pokemon.txt" as a series of comma-separated triplets. Each triplet describes one evolution branch, and contains the following information:

  1. The internal name of the species to evolve into.
  2. The name of the evolution method used.
  3. A special parameter the evolution method may use, such as a level number or item's internal name.

Each evolution method is checked in the order they are listed in the PBS file "pokemon.txt". If the Pokémon being checked can evolve through several different methods, and fulfils the criteria for more than one of them at the same time (e.g. Eevee can fulfil both happiness and location at the same time), it will evolve using the first listed method and ignore all the others.

The code for all evolution methods is in the script section Pokemon_Evolution. The code is modular, however, and can be placed in another script section, e.g. to help you keep track of new things you've added. Note that some of the existing evolution methods are unused by default.

Levelling-up evolution methods

Most evolution methods are checked when a Pokémon levels up. They have a "levelUpCheck" proc defined. They are:

Method Parameter Description
Level Level The Pokémon will evolve if its level is greater than or equal to the parameter.
LevelMale Level The Pokémon will evolve if it is male and its level is greater than or equal to the parameter.
LevelFemale Level The Pokémon will evolve if it is female and its level is greater than or equal to the parameter.
LevelDay Level The Pokémon will evolve if its level is greater than or equal to the parameter and it is currently daytime.
LevelNight Level The Pokémon will evolve if its level is greater than or equal to the parameter and it is currently night-time.
LevelMorning Level The Pokémon will evolve if its level is greater than or equal to the parameter and it is currently the morning.
LevelAfternoon Level The Pokémon will evolve if its level is greater than or equal to the parameter and it is currently the afternoon.
LevelEvening Level The Pokémon will evolve if its level is greater than or equal to the parameter and it is currently the evening.
LevelNoWeather Level The Pokémon will evolve if its level is greater than or equal to the parameter and the overworld weather is clear (i.e. there is no weather).
LevelSun Level The Pokémon will evolve if its level is greater than or equal to the parameter and the overworld weather is strong sunlight.
LevelRain Level The Pokémon will evolve if its level is greater than or equal to the parameter and the overworld weather is rain, heavy rain or stormy.
LevelSnow Level The Pokémon will evolve if its level is greater than or equal to the parameter and the overworld weather is snow or a blizzard.
LevelSandstorm Level The Pokémon will evolve if its level is greater than or equal to the parameter and the overworld weather is a sandstorm.
LevelCycling Level The Pokémon will evolve if its level is greater than or equal to the parameter and the player is currently cycling.
LevelSurfing Level The Pokémon will evolve if its level is greater than or equal to the parameter and the player is currently surfing.
LevelDiving Level The Pokémon will evolve if its level is greater than or equal to the parameter and the player is currently diving.
LevelDarkness Level The Pokémon will evolve if its level is greater than or equal to the parameter and the player is currently in a map that has a darkness circle (regardless of whether Flash has expanded it).
LevelDarkInParty Level The Pokémon will evolve if its level is greater than or equal to the parameter and the player has a Dark-type Pokémon in their party.
AttackGreater Level The Pokémon will evolve if its level is greater than or equal to the parameter and its Attack stat is greater than its Defense stat.
AtkDefEqual Level The Pokémon will evolve if its level is greater than or equal to the parameter and its Attack stat is equal to its Defense stat.
DefenseGreater Level The Pokémon will evolve if its level is greater than or equal to the parameter and its Attack stat is lower than its Defense stat.
Silcoon Level The Pokémon will evolve if its level is greater than or equal to the parameter and the last digit of the upper half of its decimalised personal ID number is between 0 and 4 inclusive.
Cascoon Level The Pokémon will evolve if its level is greater than or equal to the parameter and the last digit of the upper half of its decimalised personal ID number is between 5 and 9 inclusive.
Ninjask Level Identical to "Level".
Shedinja - Has an "afterEvolution" proc which is checked after a Pokémon evolves. If there is an empty space in the player's party and there is a regular Poké Ball in the Bag, the Pokémon that just evolved is duplicated and the copy is turned into the species given for this method (e.g. Shedinja). The Poké Ball is consumed.
Happiness - The Pokémon will evolve if its happiness is 220 or higher. This number is hardcoded.
HappinessMale - The Pokémon will evolve if it is male and its happiness is 220 or higher. This number is hardcoded.
HappinessFemale - The Pokémon will evolve if it is female and its happiness is 220 or higher. This number is hardcoded.
HappinessDay - The Pokémon will evolve if its happiness is 220 or higher (this number is hardcoded) and it is currently daytime.
HappinessNight - The Pokémon will evolve if its happiness is 220 or higher (this number is hardcoded) and it is currently night-time.
HappinessMove Move The Pokémon will evolve if its happiness is 220 or higher (this number is hardcoded) and it knows the move given in the parameter.
HappinessMoveType Type The Pokémon will evolve if its happiness is 220 or higher (this number is hardcoded) and it knows any move of the type given in the parameter.
HappinessHoldItem Item The Pokémon will evolve if its happiness is 220 or higher (this number is hardcoded) and it is holding the item given in the parameter. The item is consumed.
MaxHappiness - The Pokémon will evolve if its happiness is 255. This number is hardcoded.
Beauty Number The Pokémon will evolve if its beauty is equal to or higher than the parameter.
HoldItem Item The Pokémon will evolve if it is holding the item given in the parameter. The item is consumed.
HoldItemMale Item The Pokémon will evolve if it is male and is holding the item given in the parameter. The item is consumed.
HoldItemFemale Item The Pokémon will evolve if it is female and is holding the item given in the parameter. The item is consumed.
DayHoldItem Item The Pokémon will evolve if it is holding the item given in the parameter and it is currently daytime. The item is consumed.
NightHoldItem Item The Pokémon will evolve if it is holding the item given in the parameter and it is currently night-time. The item is consumed.
HoldItemHappiness Item The Pokémon will evolve if its happiness is 220 or higher (this number is hardcoded) and it is holding the item given in the parameter. The item is consumed.
HasMove Move The Pokémon will evolve if it knows the move given in the parameter.
HasMoveType Type The Pokémon will evolve if it knows any move of the type given in the parameter.
HasInParty Species The Pokémon will evolve if the player's party contains a Pokémon whose species is given in the parameter.
Location Number The Pokémon will evolve if the player is currently in a map whose ID number is given in the parameter.
Region Number The Pokémon will evolve if the player is currently in a map that is part of a region whose ID number is given in the parameter.

Using an item evolution methods

These evolution methods are checked when an item (typically an evolution stone) is used on a Pokémon. They have an "itemCheck" proc defined. Evolutions triggered this way cannot be cancelled. They are:

Method Parameter Description
Item Item The Pokémon will evolve if the item used is given in the parameter.
ItemMale Item The Pokémon will evolve if it is male and the item used is given in the parameter.
ItemFemale Item The Pokémon will evolve if it is female and the item used is given in the parameter.
ItemDay Item The Pokémon will evolve if it is currently daytime and the item used is given in the parameter.
ItemNight Item The Pokémon will evolve if it is currently night-time and the item used is given in the parameter.
ItemHappiness Item The Pokémon will evolve if its happiness is 220 or higher (this number is hardcoded) and the item used is given in the parameter.

Trade evolution methods

These evolution methods are checked when a Pokémon is received in a trade. They have a "tradeCheck" proc defined. Evolutions triggered this way cannot be cancelled. They are:

Method Parameter Description
Trade - The Pokémon will evolve.
TradeMale - The Pokémon will evolve if it is male.
TradeFemale - The Pokémon will evolve if it is female.
TradeDay - The Pokémon will evolve if it is currently daytime.
TradeNight - The Pokémon will evolve if it is currently night-time.
TradeItem Item The Pokémon will evolve if it is holding the item given in the parameter. The item is consumed.
TradeSpecies Species The Pokémon will evolve if the other Pokémon that was traded away was the species given in the parameter and wasn't holding an Everstone.

Examples

Evolutions = IVYSAUR,Level,16

The evolution path of Bulbasaur. It has only one evolution method, which is evolving through level up at Level 16 (or higher) into Ivysaur.

Evolutions = TOGETIC,Happiness,

The evolution path of Togepi. It has only one evolution method, which is evolving when happy enough into Togetic. Note the comma at the end of this line - the third entry of this triplet is still included, even though it is blank. Every evolution path must be a triplet (i.e. contain two commas).

Evolutions = VAPOREON,Item,WATERSTONE,JOLTEON,Item,THUNDERSTONE,FLAREON,Item,FIRESTONE,LEAFEON,Location,28,GLACEON,Location,34,SYLVEON,HappinessMoveType,FAIRY,ESPEON,HappinessDay,,UMBREON,HappinessNight,

The evolution paths of Eevee. It has eight evolution methods, as follows:

  • Use a Water Stone on it to evolve into Vaporeon.
  • Use a Thunder Stone on it to evolve into Jolteon.
  • Use a Fire Stone on it to evolve into Flareon.
  • Level up on map 28 into Leafeon.
  • Level up on map 34 into Glaceon.
  • Level up when happy enough and knowing a Fairy-type move into Sylveon.
  • Level up when happy enough during the day to evolve into Espeon.
  • Level up when happy enough during the night to evolve into Umbreon.

Note the order in which these are listed. They are checked in order, so evolving into Leafeon/Glaceon takes priority over evolving into Sylveon, which in turn takes priority over evolving into Espeon/Umbreon.

Evolutions = NINJASK,Ninjask,20,SHEDINJA,Shedinja,

The evolution paths of Nincada. It uses the twin evolution methods of "Ninjask" and "Shedinja":

  • "Ninjask" evolves the Nincada into a Ninjask at/above Level 20, just like "Level" does.
  • "Shedinja" immediately duplicates the Ninjask (if there is an empty spot in the player's party and a spare Poké Ball), and turns the duplicate into a Shedinja.

Note that these methods are named after members of the Nincada family only because they are the only Pokémon that exhibit this behaviour. Fakemon can use these methods just as easily.

Creating a new evolution method

The evolution methods are defined at the top of the script section Pokemon_Evolution, as follows:

  None              = 0
  Level             = 1
  LevelMale         = 2
  LevelFemale       = 3
  LevelDay          = 4
  LevelNight        = 5
  LevelMorning      = 6
  LevelAfternoon    = 7
  LevelEvening      = 8
  LevelNoWeather    = 9
  LevelSun          = 10
  LevelRain         = 11
  LevelSnow         = 12
  LevelSandstorm    = 13
  LevelCycling      = 14
  LevelSurfing      = 15
  LevelDiving       = 16
  LevelDarkness     = 17
  LevelDarkInParty  = 18
  AttackGreater     = 19
  AtkDefEqual       = 20
  DefenseGreater    = 21
  Silcoon           = 22
  Cascoon           = 23
  Ninjask           = 24
  Shedinja          = 25
  Happiness         = 26
  HappinessMale     = 27
  HappinessFemale   = 28
  HappinessDay      = 29
  HappinessNight    = 30
  HappinessMove     = 31
  HappinessMoveType = 32
  HappinessHoldItem = 33
  MaxHappiness      = 34
  Beauty            = 35
  HoldItem          = 36
  HoldItemMale      = 37
  HoldItemFemale    = 38
  DayHoldItem       = 39
  NightHoldItem     = 40
  HoldItemHappiness = 41
  HasMove           = 42
  HasMoveType       = 43
  HasInParty        = 44
  Location          = 45
  Region            = 46
  Item              = 47
  ItemMale          = 48
  ItemFemale        = 49
  ItemDay           = 50
  ItemNight         = 51
  ItemHappiness     = 52
  Trade             = 53
  TradeMale         = 54
  TradeFemale       = 55
  TradeDay          = 56
  TradeNight        = 57
  TradeItem         = 58
  TradeSpecies      = 59

  def self.maxValue; return 59; end

Each evolution method is defined with a number (e.g. Level=1, HasMove=42, TradeItem=58). The method just below this list returns the highest number. When adding a new evolution method, an XXX = Y line should be added to define it, and def self.maxValue should be modified to change the number it returns.

The rest of the definition of an evolution method is modular. Here are some examples:

PBEvolution.register(:Level, {
  "levelUpCheck" => proc { |pkmn, parameter|
    next pkmn.level >= parameter
  }
})
PBEvolution.register(:Happiness, {
  "minimumLevel"  => 1,   # Needs any level up
  "parameterType" => nil,
  "levelUpCheck"  => proc { |pkmn, parameter|
    next pkmn.happiness >= 220
  }
})
PBEvolution.register(:HoldItem, {
  "minimumLevel"  => 1,   # Needs any level up
  "parameterType" => :PBItems,
  "levelUpCheck"  => proc { |pkmn, parameter|
    next pkmn.item == parameter
  },
  "afterEvolution" => proc { |pkmn, new_species, parameter, evo_species|
    next false if evo_species != new_species || !pkmn.hasItem?(parameter)
    pkmn.setItem(0)   # Item is now consumed
    next true
  }
})
PBEvolution.register(:Item, {
  "parameterType" => :PBItems,
  "itemCheck"     => proc { |pkmn, parameter, item|
    next item == parameter
  }
})
PBEvolution.register(:TradeSpecies, {
  "parameterType" => :PBSpecies,
  "tradeCheck"    => proc { |pkmn, parameter, other_pkmn|
    next pkmn.species == parameter && !other_pkmn.hasItem?(:EVERSTONE)
  }
})

Evolution methods can have one or more properties (the text to the left of the =>). These are:

Property Description
"levelUpCheck" For evolutions triggered by the Pokémon levelling up. This is a proc containing code that performs the check for whether the Pokémon can evolve. It will next true if the evolution should happen, and next false (or not explicitly next anything) if it shouldn't.
"itemCheck" For evolutions triggered by the Pokémon having an item used on it. This is a proc containing code that performs the check for whether the Pokémon can evolve. It will next true if the evolution should happen, and next false (or not explicitly next anything) if it shouldn't.
"tradeCheck" For evolutions triggered by the Pokémon being received in a trade. This is a proc containing code that performs the check for whether the Pokémon can evolve. It will next true if the evolution should happen, and next false (or not explicitly next anything) if it shouldn't.
"afterEvolution" For after a Pokémon evolves. This is a proc containing code that is run after a Pokémon evolves. It is usually used to delete the Pokémon's held item if its evolution required it, and it is also used by the "Shedinja" method to duplicate the Pokémon and turn the duplicate into a Shedinja (if possible).
"parameterType" This is either the name of a module (with a colon in front of it), or nil, or undefined.

If a module's name, the parameter will be a constant defined in that module. This is usually the internal name of something (e.g. an item if the module is PBItems, or a move if the module is PBMoves).

If undefined, then the parameter will be a number.

If nil, the parameter will be blank and unused.

"minimumLevel" Gives the minimum level a Pokémon can be if it evolved by that evolution method. This only needs to be defined for evolution methods using the "levelUpCheck" property, and only if the evolution method doesn't expect the parameter to be a level. A value of 1 here means that it just needs to be levelled up, and it doesn't matter what the Pokémon's actual level is.

As mentioned above, this code is modular, which means you can write the code for your new evolution methods in a new script section to help keep track of content you have added.

Possible new evolution methods

There is a great deal of flexibility in what an evolution method can be. You can check any aspect of the Pokémon wanting to evolve (pkmn), use any kind of module to determine what the parameter represents (parameter), or refer to any recorded aspect in the game (e.g. weather, location).

The exact code you'll need to use for your custom evolution method will obviously depend on what you want it to do. This wiki page cannot describe at a general level what to do; however, some ideas are:

  • Create variants on existing methods, e.g. one that occurs if the Pokémon has a certain happiness value or less (i.e. the opposite of "Happiness").
  • Merge two or more existing methods together into a new one. Remember that you only have one parameter to work with, though.
  • Evolution that depends on the Pokémon's nature or form or total EVs, or if a given stat has risen above a particular value.
  • Fusion evolution (e.g. for Magnemite/Slowpoke). Check that there is a Shellder in the party, and if so, delete it and evolve the levelled-up Slowpoke. The deletion would occur in an "afterEvolution" proc.
  • Change the Pokémon's form depending on how it evolves. This is done by setting the form as part of the check. This assumes the unevolved Pokémon doesn't have multiple forms, only the evolved species.
  • Disable all evolutions for a time by inserting the line return -1 if $game_switches[42] at the very beginning of def pbCheckEvolutionEx (in the script section Pokemon_Evolution, next to similar lines for the Everstone and Battle Bond) and setting Game Switch 42 to ON whenever you want to forbid all evolutions. The number of the Game Switch you use may vary.

As well as creating new evolution methods, you could also/instead make a few changes to existing methods.

Evolution screen

When a Pokémon evolves, it is displayed on screen with some messages ("What? Pikachu is evolving!", etc.). The player has the chance to cancel some evolutions by pressing a button during the animation.

The animation itself is described in class PokemonEvolutionScene in the script section PScreen_Evolution. It shows the Pokémon's sprite fade to white, then grow bigger and smaller while alternating with the sprite of its evolved form, before the evolved form's sprite colours in.

The background used for the evolution screen is located in the "Graphics/Pictures" folder, and is called "evolutionbg.png". This image will be tiled across the entire background. If there is no picture with this name, a blank white background will be shown instead.

Community content is available under CC-BY-SA unless otherwise noted.