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 eb5cf56ee3
Some checks failed
Rust / build-linux (linux-x86_64, X64, ubuntu-24.04, x86_64-unknown-linux-gnu) (pull_request) Failing after 5s
Rust / build-android (29.0.14206865, ubuntu-24.04, 33) (pull_request) Failing after 2s
Rust-lint / lint-linux (pull_request) Failing after 2s
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
Fix GGRS frame counter reset after state load (#5)
After a netplay savestate load, the GGRS session's internal frame counter
must be reset to match the savestate's frame, or desync detection fires
immediately on resume.

Changes:
- Patch vendored ggrs 0.13.0 to expose set_current_frame(frame) on
  P2PSession and SyncTestSession, with internal SyncLayer and InputQueue
  reset methods to clear stale saved states, checksum history, and input
  queues
- Add [patch.crates-io] ggrs = { path = 'vendor/ggrs' } in Cargo.toml
- Add netplay::reset_frame(session, frame) wrapper function
- Record current GGRS frame in Savestate.netplay_frame during
  create_savestate when in netplay context
- Call reset_frame after load_savestate in netplay context
- Add tests: advance 120 frames, reset to 60, verify current_frame()==60
  and clean resume with matching inputs; reset to 0; idempotent reset

Closes #5
2026-08-25 00:37:22 -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 Fix GGRS frame counter reset after state load (#5) 2026-08-25 00:37:22 -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.