ARCH R

Netplay

RetroArch network play, over the internet or between two consoles with no router

RetroArch can play a libretro core over the network, and EmulationStation puts a front end on top of it: a lobby browser, a host entry in the game options, and a local mode where one console becomes the access point for the others.

It only works with libretro cores. Standalone emulators (DraStic, PPSSPP, Yabasanshiro, DuckStation, ScummVM) have no netplay here.


Turn it on

ES → Game Settings → Netplay Settings.

Enable netplay

Switch Enable netplay on and fill in Nickname. Saving with the switch on starts a background pass over your library, computing a CRC for each ROM. That is how the lobby knows whether your copy of a game matches the host's.

Wait for the indexing

The pass shows as Searching netplay games in the corner. You can run it again at any time from Index games in the same menu, choosing All or Only missing and which systems to cover. Index new games at startup keeps it up to date on its own.

Once netplay is on, the home screen gains a shortcut: press X on the system carousel to open Connect to netplay.


Playing over the internet

The lobby browser lists what other people are hosting. Games you have appear under Available games, games you do not have under Unavailable games, and each row says Same ROM, Different ROM, Unknown ROM version or Unavailable core. Only Same ROM is a safe join.

Pick one, then Join game to play or Watch game to spectate.

To host, open a game list, press X on the game for its options, then Start a netplay game → Host a netplay game. The same screen has Netplay nickname, Player password, Publicly announce game (which is what puts you in the public lobby), Netplay host and Netplay port. The port defaults to 55435.

Relay servers

A direct connection needs an open port on the host's router, which most home connections do not give you. Use relay server in Netplay Settings routes the session through a public server instead. The built-in choices are New York, Madrid, Montreal and Sao Paulo, plus Custom for an address of your own. It is slower than a direct link but it works behind NAT.

Show relay server games only filters the lobby to rooms that are easier to join for the same reason.


Playing with no router at all

One console can serve as the access point for the others, which is what you want on a train or in a park.

On the host

Network Settings → Enable WiFi on → Local play mode on → Local play ID = 1 (Host).

The console brings up an access point called NETPLAY_AP with the passphrase deadbeef, on the channel set in Local network channel (6 by default), and takes the address 192.168.80.1. EmulationStation points the netplay host setting at that address and switches the relay off.

On the other consoles

Same menu: Enable WiFi on, Local play mode on, Local play ID = 2, 3 or 4. They join NETPLAY_AP on their own, so there is no SSID to type.

Start the game

Host: game options → Start a netplay game → Host a netplay game. Clients: same game, same core, Join a netplay game.

Local play mode takes over the wireless adapter, so while it is on there is no internet: no scraping, no updates, no lobby browser.

Local play mode only appears in the menu if the wireless adapter reports access point support. ArchR asks the driver directly (wifictl has_ap_mode), so on a dongle without AP mode the row is simply absent.


What netplay changes while it runs

setsettings.sh rewrites retroarch.cfg before every launch, and while netplay is enabled it writes three things regardless of whether this particular game is a netplay session:

  • Automatic save-state loading and saving off.
  • RetroAchievements hardcore mode off.
  • On a client, netplay_client_swap_input, so the second console drives player 2.

The first two are worth knowing about. They are tied to the global netplay switch, not to the session, so leaving netplay on costs you autosave and hardcore achievements in single-player too. Turn the switch off when you are done.

A handful of cores get extra treatment, because their multiplayer is a link cable rather than plain netplay:

CoreWhat is set up
gambatteGame Boy link over the network, server on the host and client on the others, using the netplay port plus one
tgbdualLink cable with one screen per console, assigned from the local play ID
genesis_plus_gxFour-way play adapter on port 2
snes9xMultitap on port 2

Which cores work

95 of the shipped libretro cores are flagged for netplay, which is most of them. The ones you are likely to reach for:

  • snes9x, snes9x2010, snes9x2002, snes9x2005_plus
  • fceumm, nestopia, quicknes, mesen
  • gambatte, sameboy, gearboy, tgbdual, DoubleCherryGB
  • mgba, vba_next, vbam, beetle_gba, gpsp
  • genesis_plus_gx, picodrive
  • fbneo, fbalpha2012, mame2003_plus, mame2010, neocd
  • pcsx_rearmed, pcsx_rearmed32
  • flycast, flycast2021
  • mupen64plus_next, parallel_n64
  • beetle_pce_fast, beetle_supergrafx, opera, same_cdi

The heavy 3D cores are on that list because RetroArch supports it, not because it plays well. On the RK3326 the four Cortex-A35 cores are already busy rendering, and netplay on top of that means frame drops.


Troubleshooting

The lobby says "different ROM". Your dump is not the same file as the host's. Match the No-Intro or Redump release on both sides. The lobby compares the CRC of the file, so even a trimmed or re-headered copy counts as different.

"You are not connected to a network". ES checks for an IP address before opening the lobby or hosting. Check Network Settings → IP address.

Nobody can join your public game. Your router is not forwarding port 55435. Pick a relay server in Netplay Settings instead of asking people to reach you directly.

A game is missing from the lobby list. It has not been indexed. Run Index games with Only missing selected.

Lag spikes on local play mode. The channel is shared with everything else nearby. Change Local network channel on the host, 1, 6 and 11 do not overlap each other.

Netplay Settings is not in the menu. It appears under Game Settings → Accounts only when at least one installed system has a core that supports netplay. If you have removed cores by hand, that can stop being true.

On this page