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; Legend of Zelda for the NES (plus its randomizer); and Super Metroid and its randomizer (although for Super Metroid, you might want to check out Multitroid instead). Emu-coop 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. (We have not yet figured out how to get IUPLua to work on Mac.)
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. The instructions to do this are in the MODDING file included with the software, or here.
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.
Some more about the games currently supported:
Link to the Past: Currently it syncs all collectable items, all pendants, all crystals, and whether the Dwarf has been rescued; 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.
Co-op speedrun leaderboards are here.
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.
Co-op speedrun leaderboards are here.
Super Metroid: Currently it tracks all items, beams, expansions, whether Zebes is awake, 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. The Super Metroid mode is fairly primitive, so if this interests you, you should instead use Multitroid, an emulator mod just for running Super Metroid coop.
Co-op speedrun leaderboards (using Multitroid) are here.
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)”.