gen3-poke-multiplayer

Your friends, in your Pokémon Emerald.

Online multiplayer in the Hoenn overworld on original Game Boy Advance hardware and cartridges, over the internet. You see them walk, run, ride a bike and surf right next to you — animated by the game's own engine.

For real

Screenshots taken during testing: every extra character is another player, connected from somewhere else.

Three players on the beach, first player's screen
Three players on the same beach: player 1's screen…
The same scene from the second player's screen
…player 2's…
The same scene from the third player's screen
…and player 3's. Everyone sees the other two.
Three players walking together
Walking together, with the game's real animation
Two players in the Cable Club room
In the Cable Club room, over the internet
Trade completed over the internet
And the trade goes all the way through

How to try it

Three ways, and all three end up in the same game. Agree on a room number (1–65535, any number: it's your «table») and everybody uses it. Note: English (USA/Europe) and Italian Emerald both work and play together. Both are tested on a real GBA too.

⚠️ Use at your own risk. The program never writes your save file, but it runs code inside the game on your original cartridge and comes with no warranty. If you can, back up your save first (with a cartridge dumper or flash cart; in mGBA just copy the .sav file).

Real GBA

With your Game Boy Advance

  1. Flash the Pico once with celio.uf2 (hold BOOTSEL + drag the file). Needed on a GB-Link too: the stock firmware can't load the game, and the GBA just never answers.
  2. On Windows, once: the WinUSB driver for the Pico with Zadig.
  3. Open the panel in Chrome or Edge → Connect the Pico.
  4. GBA switched on with no cartridge → Load the game (red screen, ~15 s).
  5. Insert the cartridge while the console is on → green → Emerald boots.
  6. Type the room → Play.
Open the panel
Emulator

In mGBA, on your PC

  1. Install mGBA 0.10 or later.
  2. In the panel, type the room and press «Download the emulator script».
  3. Open your own Pokémon Emerald (English or Italian: pick the matching one before downloading) and load your save.
  4. Tools → Scripting → Load script → the downloaded script. Done.

Real GBAs and emulators play together. In game, L+R+B opens a small panel to change room.

Get the script from the panel
Nothing needed

Just watch

No GBA, no emulator, even from Firefox: join a friend's room as a spectator and follow everyone on the Hoenn Live map, in real time.

Spectators don't take a seat: a room holds 4 players, spectators are unlimited.

Join as a spectator

How it works

Pokémon Emerald has no way to draw another player on your map. gen3-poke-multiplayer adds it without touching the cartridge: a tiny program (~11 KB) gets into the console's memory at every power-on and runs alongside the game.

GBAoriginal cartridge⇄ Link cable5 pins⇄ Raspberry Pi Picoextended Celio firmware⇄ Browser or PCWebUSB / USB⇄ RelayWebSocket · UDP⇄ …your friendsame path in reverse
1 · How the program gets into the GBA, with no in-game tricks

The GBA has a built-in feature called multiboot: switched on without a cartridge, it accepts a program over the link cable. We load a «stub» that settles into a corner of memory Emerald never uses, and waits. When you insert the cartridge, the stub jumps into the game's boot code right after the point where memory gets cleared: so our program survives, and Emerald starts normally with it inside.

The program hooks into the game by rewriting a single pointer in RAM — the interrupt vector — and from there it runs every frame. The cartridge is mask ROM: it can't be modified even if you wanted to, and the save is never written. Switch the console off and nothing is left behind.

2 · Why your friend moves like a real character

Thanks to the community's decompilation of the game (pret/pokeemerald) we know the address of every original function. The program reimplements nothing: it creates your friend with the same function the game uses for its own NPCs, and moves them with actions («take a step north»), not coordinates. Animation, steps, bike and surf are all drawn by Emerald's engine, exactly as for an NPC.

3 · Why you don't notice the internet

We don't send the position every frame: we send events, «I started a step in this direction from this tile», in 12 bytes, plus an occasional correction. With a 100 ms ping your friend is half a step behind: invisible. The server (relay) knows nothing about the game — it just forwards packets between players in the same room.

The last hop, from PC to GBA, drops a few packets: so every step is sent twice, and the GBA discards the copy. That's the difference between a friend who slides and one who walks.

4 · What it doesn't do (yet)
  • Reported by players, under investigation: a crash on the GBA after Record Mixing and after the Berry Blender.
  • Your friend is visible on your map and on the strip of the neighbouring map the game keeps loaded; not further.
  • On a very crowded map the game has room for 2-3 friends (16 characters per map in total).
  • Trainers can't see you if your friend stands in between: to the game, line of sight is a collision.
  • Emulators can't enter the Cable Club: online trades and battles are between real GBAs.
  • WebUSB exists only in Chrome and Edge: from Firefox and Safari you can only watch.

The full explanation · the code and technical README on GitHub

Who made it

The code

Written by Claude, by Anthropic

The main source of this project is Claude (Claude Code): the program running inside the GBA, the multiboot stub, the Pico firmware extensions, the serial driver, the overworld event protocol, the relay, this website, the Cable Club integration and the Live map were written by Claude, session after session.

Lain had the idea, provided the hardware, set the rules («no in-game tricks, ever», «Italian cartridge», «the ROM is never touched») and did all the field testing — with Hacke on the other side of the relay, the first friend to try it over the internet.

Standing on the shoulders of
pret
the matching decompilations of Emerald and FireRed: the map of every address in the game.
Essometer · Celio-Link
Essometer created Celio-Link. Its firmware powers the USB-GBA adapter. This project also builds on its client, server and mGBA bridge. His demos: online trade and trade emulation.
smashstacking
the GBA-USB adapter Celio is tuned for.
agtbaskara · weimanc
the link boards for the Raspberry Pi Pico.
endrift and mGBA
the emulator with Lua scripting used throughout development.
Martin Korth
GBATEK, the Game Boy Advance technical reference.
Celio-Link community (GBAtemp)
for being the first to crack the toughest hardware layer.