|
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
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 |
||
|---|---|---|
| .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.