The Glitchhouse · Pokemon Gold, Silver & Crystal

The Celebi Egg glitch

There was no way to legitimately catch Celebi in the main games. So players found another door, and it swings open on a single number the game happened to reuse.

Decoded from a Pokemon Crystal ROM · part of The Glitchhouse

Inside Generation II every move has an index number, and so does every Pokemon. They are two separate lists that were never meant to touch. But at slot 251 the move list holds Beat Up, and the Pokemon list holds Celebi. The Celebi Egg glitch is the art of getting the game to read one where it expects the other, so a move called Beat Up quietly becomes a legend, and hatches out of an Egg as the real thing.

The number 251

The whole glitch rests on a coincidence in the game's own data. Moves are numbered in one list, Pokemon in another, and the two were never meant to line up. But slide down to the very end of both lists and something strange happens at 251. Drag the dial and watch the two columns.

244$F4
Move list
Pokemon list
244251
Move and species indexes read straight from pokecrystal (move_constants.asm, pokemon_constants.asm). Beat Up is the very last move, number 251, the same slot Celebi holds in the Pokemon list.

Why that matters

A Pokemon in memory is just a row of bytes in a fixed order: its species, its held item, then its four moves, and on from there. The game always reads the species from the first byte. But the moves are only a few bytes further along, so if the whole row gets nudged, a move can end up sitting where the species is read. Watch what happens when Beat Up, in move slot three, slides into the species spot.

Species
253
EGG
Item
0
none
Move 1
10
SCRATCH
Move 2
43
LEER
Move 3
251
BEAT UP
Move 4
98
QUICK ATK
Byte order from pokecrystal's party_struct (pokemon_data_constants.asm): species, item, then the four move bytes. Every value shown is the real index (Beat Up is 251, the same as Celebi).

First you need a bad clone

The byte shift does not happen by wishing for it. It rides on the cloning glitch, done wrong on purpose. Reset a fraction too early during a box save and you get a bad clone, a Pokemon built from a half-written, scrambled block of memory. That corrupted block is the raw material the Celebi trick reshapes. Step through how you get one.

1
Start a clone
Reset too early
?!
Bad clone
Day Care stabilizes it
The bad clone is a normal cloning attempt interrupted a moment too early. It is the honest, community-documented risk of cloning, turned into the first ingredient here.

Set up the Egg

Because the trick reads move slot three as the species, Beat Up has to sit in exactly that slot. Players breed two Sneasel that both know Beat Up, raised so the baby inherits it in the right position. Try it yourself: tap the four moves into the slots and get Beat Up into slot three.

Move 1
empty
Move 2
empty
Move 3 ←
empty
Move 4
empty
A Sneasel baby can inherit Beat Up by breeding. Slot three is the target because that is the byte the glitch later reads as the species. The move names are real Sneasel-learnable moves.

The shuffle

This is the fiddly part, and there is no way around that. With the bad clone stabilized and the Beat Up Egg ready, you move Pokemon between your party and the boxes in a set order. Each deposit nudges the data blocks in memory, and the goal is to slide the Egg so the byte the game reads as its species lands on the Beat Up value. Step through it and watch that species number change.

Egg species byte
253 EGG
The precise deposit order is finicky and was worked out by the glitch community; this shows what it accomplishes, not a substitute for a full frame-by-frame guide. What matters is the end state: the species byte reads 251.

Hatch it

The hard part is over. Now it is an ordinary Egg with an extraordinary secret, and Eggs hatch by walking. Hop on the Bicycle and ride in circles until the counter runs down. The game has no idea it is about to hand you a legend.

Steps to hatch: 5
Celebi's front sprite, straight from the Pokemon Crystal ROM (gfx/pokemon/celebi/front.png). It hatches at level 0, which is where the last catch comes in.

The level zero catch

There is one last trap. A hatched Celebi comes out at level zero, a level the game was never built to handle. If you take it straight into battle, the first time it tries to level up the math runs off the rails and its stats can come out corrupted. The safe move is to put it right back in the Day Care and let the couple raise it to level two or higher first. Then it behaves like any other Pokemon.

Lv 0
Do not battle yet
Level zero is out of the game's normal range, so its stat and experience math misbehaves. Letting the Day Care raise it to level two first is the community's standard fix.

Does it work, and is it a real Celebi

Two questions everyone asks. First, where does it still run. The glitch lives in the games' own code, so it survives anywhere that code runs faithfully, though the save timing behind the bad clone is the fussy part. Second, and more interesting: is the Celebi you get a real one. Pick a platform, then read the verdict below.

The method uses only in-game actions, so the result is an ordinary Celebi to the game. The tricky, platform-dependent part is the bad clone, which relies on interrupting a real save.

From the ROM

The entire glitch comes down to two lines in two different files of the Pokemon Crystal disassembly. One numbers the moves, the other numbers the Pokemon, and both put the number 251 on their last entry. Here they are, side by side.

Move list
BEAT_UP
$FB
constants/move_constants.asm
Pokemon list
CELEBI
$FB
constants/pokemon_constants.asm

Both are $FB, which is 251. Beat Up is the very last move the game defines (NUM_ATTACKS = 251), and Celebi is number 251 in the Pokemon list. The whole trick is arranging memory so the game reads the Beat Up byte where it expects a species. It is not a bug in one routine, it is two numbering systems that happened to collide at the end.

Beat Up is move 251. Celebi is Pokemon 251. The glitch is nothing more than getting the game to confuse the two.

Go deeper: the cloning glitch (the bad clone you need first), the Ditto glitch (a stat read as a species, Gen 1) | browse the Glitchhouse.