Gopher64 fork with netplay session save/resume and desync auto-resync
This repository has been archived on 2026-08-27. You can view files and clone it, but cannot push or open issues or pull requests.
Go to file
Claude 48598f45ca
Some checks failed
Rust-lint / lint-linux (pull_request) Failing after 2s
Rust / build-linux (linux-x86_64, X64, ubuntu-24.04, x86_64-unknown-linux-gnu) (pull_request) Failing after 1s
Rust / build-android (29.0.14206865, ubuntu-24.04, 33) (pull_request) Failing after 1s
Rust / build-linux (linux-aarch64, ARM64, ubuntu-24.04-arm, aarch64-unknown-linux-gnu) (pull_request) Has been cancelled
Rust / build-windows (windows-aarch64, woa64, windows-11-arm, aarch64-pc-windows-msvc) (pull_request) Has been cancelled
Rust / build-windows (windows-x86_64, win64, windows-2025, x86_64-pc-windows-msvc) (pull_request) Has been cancelled
Rust / build-macos (macos-aarch64, ARM64, aarch64-apple-darwin) (pull_request) Has been cancelled
Rust / Collect release artifacts (pull_request) Has been cancelled
Desync auto-resync: host sends state on desync event (#6)
When GGRS fires DesyncDetected, the host (player_number==0) snapshots
the current emulator state, sends it to all peers via the reliable
channel as a 'resync_state' message, and pauses the frame loop until
all peers acknowledge with 'resync_ready'. Non-host peers ignore the
desync event and wait for the host's state.

Changes:
- Add ResyncState enum (Idle, HostWaiting, ClientLoading) to Netplay
- In poll_clients DesyncDetected handler: host creates in-memory
  savestate, sends resync_state message, enters HostWaiting state
- Add check_resync_messages: non-host receives resync_state and enters
  ClientLoading; host receives resync_ready acks and resets frame when
  all peers ack
- Add process_resync_load: non-host decompresses and loads received
  state, calls reset_frame, sends resync_ready ack, resumes
- Add resyncing state check in advance_frame: pauses frame loop during
  resync (like disconnected path), with 5s timeout -> disconnect
- Add create_savestate_in_memory: serializes Device via postcard +
  compress without file I/O
- Call process_resync_load from vi.rs update_screen before normal frame
  processing
- Add tests: ResyncState default/transitions, message serialization,
  timeout logic, ack tracking

Based on issue-5 branch (includes GGRS frame reset from #5).

Closes #6
2026-08-25 00:44:37 -05:00
.cargo cargo update (#1040) 2026-06-08 14:28:51 +00:00
.github update rust (#1167) 2026-07-20 08:49:16 +00:00
android-project re-arrange input profiles (#1150) 2026-07-05 10:43:23 +00:00
data add instructions for input profile (#1179) 2026-08-03 15:43:27 +00:00
parallel-rdp add gpu hints on windows (#1158) 2026-07-13 07:17:35 +00:00
retroachievements update rcheevos (#1172) 2026-07-23 22:11:01 +00:00
src Desync auto-resync: host sends state on desync event (#6) 2026-08-25 00:44:37 -05:00
vendor/ggrs Fix GGRS frame counter reset after state load (#5) 2026-08-25 00:37:22 -05:00
.gitignore ignore settings.json 2025-05-16 13:32:54 +02:00
.gitmodules RetroAchievements (#710) 2026-04-07 08:59:03 +02:00
build.rs use idle (#1039) 2026-06-08 13:23:22 +00:00
Cargo.lock Fix GGRS frame counter reset after state load (#5) 2026-08-25 00:37:22 -05:00
Cargo.toml Fix GGRS frame counter reset after state load (#5) 2026-08-25 00:37:22 -05:00
LICENSE Initial Commit 2023-10-04 14:33:17 -06:00
README.md Update contribution guidelines (#1143) 2026-07-01 07:58:17 +00:00
rust-toolchain.toml update rust (#1190) 2026-08-20 18:39:19 +00:00

gopher64

Gopher64 is a cross-platform N64 emulator. Some notable features:

  • Netplay
  • Homebrew support
  • Upscaling
  • CRT shader
  • Emulate CPU overclocking
  • Cheats
  • Savestates
  • RetroAchievements

download

Windows:

MacOS:

Linux:

  • Standalone executable: gopher64-linux-x86_64
  • Flatpak: flatpak install flathub io.github.gopher64.gopher64

Android:

wiki

https://github.com/gopher64/gopher64/wiki

discord

Discord invite link

controls

Keys are mapped according to these defaults. Xbox-style controllers also have a default mapping applied.

netplay

Gopher64 supports P2P netplay (online play with others).

Please read the guide before trying out netplay.

portable mode

If you would like to keep all the game data in the same folder as the executable, you just need to create a file called "portable.txt" in the same directory as the executable.

flatpak

If you want to run the flatpak from the command line, you need to add the --filesystem=host:ro option, for example:

flatpak run --filesystem=host:ro io.github.gopher64.gopher64 /path/to/rom.z64

building and usage

  1. Linux only: install the SDL3 dependencies
  2. Install rust
  3. git clone --recursive https://github.com/gopher64/gopher64.git
  4. cd gopher64
  5. cargo build --release
  6. ./target/release/gopher64 /path/to/rom.z64

contributing

PRs that are vibe coded and/or co-authored by AI agents (Plan/Agent mode) are not permitted. If you are going to submit a PR, it should be scoped to a single feature/improvement.

Please contact me via a GitHub issue or Discord (loganmc10) before doing substantial work on a PR.

license

Gopher64 is licensed under the GPLv3 license. Many portions of gopher64 have been adapted from mupen64plus and/or ares. The license for mupen64plus can be found here. The license for ares can be found here.

privacy and code signing policy

Free code signing for the Windows release is provided by SignPath.io, certificate by SignPath Foundation.

During online netplay sessions, the server logs your IP address and basic session information (game title and session name) for operational purposes. No additional personal data is collected or stored.

If you enable the RetroAchievements feature, some data is sent to their systems. Please see their terms here.