This is an emulator hack that turns 1-player games into 2-player games by sharing in-game inventory over the internet.
It currently works with Legend of Zelda: A Link to the Past; the Link to the Past Randomizer; Super Metroid; and Legend of Zelda for the NES (plus its randomizer). It works well for any game that has locks and keys and backtracking.
In order to run emu-coop, you will need an emulator that can run Lua scripts, such as snes9x-rr or FCEUX. (BizHawk does not work but could in a later version). If you already have an emulator, you can just download:
If you don’t have one, here is a copy of snes9x-rr with the coop script bundled in:
The above are for Windows. You may need to install the “x86” version of the VS2015 C++ redistributable.
If you are on Mac or Linux, you can get this working by dropping built copies of LuaSocket and IUPLua into the folder with the Lua files. I will try to get a Mac version uploaded soon.
Once you have the scripts and emulator, open snes9x-rr and the ROM you wish to play. Then select
File->Lua Scripting->New Lua Script Window. Click “Browse” and select “coop.lua” inside the emu-coop directory.
Emu-coop communicates using Internet Relay Chat. You will get a popup asking which IRC server you want to connect to, what nickname you want to use, and what the nickname of your Player 2 will be. Once you’re connected, tell your Player 2 to connect to the same network and enter your nick in their emulator. You should see either “Connected to partner”, or an error message, pop up on your game screen.
If you halt a game in the middle and have to restart– maybe your emulator crashed, or your Internet disconnected, or you died in Super Metroid– you might “desync”, where there are items that one player has but not the other. If this happens, both players should save, close their emulators, connect again, and this time check “Yes” for “Are you reconnecting after a crash?”. This will resend all the data that emu-coop is tracking.
If you run into any problems, please feel free to file an issue on the GitHub page for this project.
You can add support for additional games– or new modes for games emu-coop already supports– by creating a .lua file and putting it into emu-coop’s “modes” directory. If you add a new mode file, you will also need to add its name to the file
WARNING: Lua files are PROGRAMS, like a .exe file. A Lua file you install could give you a virus or delete files from your computer. Do not install a mode file unless it came from someone you know and trust.
Sorry, there is no documentation for creating a mode file yet.
Some more about the games currently supported:
Link to the Past: Currently it syncs all collectable items, all pendants, all crystals, and in the Randomizer it tracks whether the old man has been rescued. It does not track “quantities” (rupees, heart pieces, arrows or bombs or expansions of either), or “events” like whether you have beaten Aghanim or paid off Kiki. When it updates your shield or armor, the sprite will not update until the next Save+Quit even though you have it. The 1.0 Japan version of the game is currently required.
Super Metroid: Currently it tracks all items, beams, expansions, and whether you have beaten the four main bosses. Items you collect might not appear in the top icon bar, and when it updates your beams and armor the sprite won’t update even though you have it until you change rooms or pause. This has not been tested as well as LTTP.
Legend of Zelda NES: This comes in three modes. One syncs items only, one syncs items plus dungeon completion (maps compasses triforce), and one syncs what seems to be all the memory the author could get her hands on, including things like door status.
Big thanks to:
The change history for the project is here.
I think there’s a LOT you could do with this basic concept, and there’s some changes I’d still like to make. Make sure to watch back here for updates.
Some ideas I think are cool:
There’s also some known bugs/limitations:
The default IRC network used by emu-coop is SpeedRunsLive. I went with SRL because Sluip there said it was okay. If you run an IRC network, and you want to ban emu-coop users from using your server, you can spot them because their usernames will end in “-bot” and their “real name”s will end in “(snes bot)”.