|
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
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
|
||
|---|---|---|
| .cargo | ||
| .github | ||
| android-project | ||
| data | ||
| parallel-rdp | ||
| retroachievements | ||
| src | ||
| vendor/ggrs | ||
| .gitignore | ||
| .gitmodules | ||
| build.rs | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
| rust-toolchain.toml | ||
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:
- Standalone executable: gopher64-windows-x86_64.exe
MacOS:
- App Bundle: gopher64-macos-aarch64.zip
- Homebrew:
brew install --cask gopher64
Linux:
- Standalone executable: gopher64-linux-x86_64
- Flatpak:
flatpak install flathub io.github.gopher64.gopher64
Android:
- APK: gopher64-android.apk
wiki
https://github.com/gopher64/gopher64/wiki
discord
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
- Linux only: install the SDL3 dependencies
- Install rust
git clone --recursive https://github.com/gopher64/gopher64.gitcd gopher64cargo build --release./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.