Skip to content
Porygondolier edited this page Apr 6, 2026 · 1 revision

Introduction

Greetings. With this mod, you will be able to assign moves to Pokemon to be learnt immediately following evolution. This tutorial covers the system, and a few examples of how to use it.

Top Tip: Combine this mod with Allow multiple moves to be learned at the same level to automatically be able to assign multiple evolution moves to the same species.

1. Adding the Evolution Moves System

Define a constant in constants/pokemon_data_constants.asm

; Evolution types
	const_def 1
	const EVOLVE_LEVEL ; 1
	const EVOLVE_ITEM  ; 2
	const EVOLVE_TRADE ; 3
	
+; Evolution Moves
+DEF EVOLUTION_MOVE EQU 254


; wMonHGrowthRate values
; GrowthRateTable indexes (see data/growth_rates.asm)
	const_def
	const GROWTH_MEDIUM_FAST
	const GROWTH_SLIGHTLY_FAST

Modify engine/pokemon/evos_moves.asm

...
.doEvolution
...
	ld [wPokedexNum], a
	xor a
	ld [wMonDataLocation], a
	call LearnMoveFromLevelUp
+	call LearnEvolutionMoves
	pop hl
	predef SetPartyMonTypes
	ld a, [wIsInBattle]
...
Evolution_ReloadTilesetTilePatterns:
	ld a, [wLinkState]
	cp LINK_STATE_TRADING
	ret z
	jp ReloadTilesetTilePatterns

+LearnEvolutionMoves:
+	ld a, [wCurEnemyLevel]
+	push af
+	ld a, EVOLUTION_MOVE ; 254
+	ld [wCurEnemyLevel], a
+	call LearnMoveFromLevelUp
+	pop af
+	ld [wCurEnemyLevel], a
+	ret

LearnMoveFromLevelUp:
	ld hl, EvosMovesPointerTable
	ld a, [wPokedexNum] ; species
	ld [wCurPartySpecies], a

This function works by reusing the existing LearnMoveFromLevelUp function, but adjusting the input parameters. Before calling the script, wCurEnemyLevel (which contains the level of the Pokemon) is backed up and temporarily replaced with 254. The function is called, causing the Pokemon to learn moves that it would learn at level 254. After it is done, the backed up level is returned to wCurEnemyLevel, allowing the normal LearnMoveFromLevelUp to run just after as usual.

This does mean that if your game allows Pokemon to reach level 254, this implementation will not be suitable.

2. Assign Some Evolution Moves

Evolution moves will be assigned in data/pokemon/evos_moves.asm

First, let's give Metapod the move Harden:

...
MetapodEvosMoves:
; Evolutions
	db EVOLVE_LEVEL, 10, BUTTERFREE
	db 0
; Learnset
+	db EVOLUTION_MOVE, HARDEN
	db 0
...

Be careful to keep the db 0 after your learnset data, as this indicates the end of the data and is used by the game.

Evolution moves must come after any normal level-up moves. To illustrate this point, let's give Petal Dance to Venusaur:

VenusaurEvosMoves:
; Evolutions
	db 0
; Learnset
	db 7, LEECH_SEED
	db 13, VINE_WHIP
	db 22, POISONPOWDER
	db 30, RAZOR_LEAF
	db 43, GROWTH
	db 55, SLEEP_POWDER
	db 65, SOLARBEAM
+	db EVOLUTION_MOVE, PETAL_DANCE
	db 0

Some Pokemon learn multiple moves upon evolution. Once such example is Lanturn, which learns 3 moves. We can easily achieve this by implementing the additional modification mentioned in the Introduction. For this example, suppose we have already added Lanturn to our game, using its Generation II moves. We can then allocate the evolution moves as follows:

LanturnEvosMoves:
; Evolutions
	db 0
; Learnset
	db 5, SUPERSONIC
	db 13, FLAIL
	db 17, WATER_GUN
	db 25, SPARK
	db 33, CONFUSE_RAY
	db 45, TAKE_DOWN
	db 53, HYDRO_PUMP
+	db EVOLUTION_MOVE, STOCKPILE
+	db EVOLUTION_MOVE, SWALLOW
+	db EVOLUTION_MOVE, SPIT_UP
	db 0

Outroduction

Thank you for reading this tutorial, I have been your host, Mr. Poryman of Porygondolier, and I'd like to wish you a wonderful day.

Clone this wiki locally