The player no longer needs a PC. LauncherActivity unpacks the bundled data, takes a ROM through the document picker, checks it against the supported SHA-1s, and runs Torch through JNI to produce sm64.o2r — about 27s on a Pixel 10a. The archive is byte-identical to a host extraction. GameExtractor gains a GenerateOTRTo() overload taking the two directories explicitly: the launcher runs before SDL exists, so Ship::Context cannot resolve a path yet. The launcher runs in its own process and ends it once the archive is written. Torch's Companion is deliberately never freed — every platform leaks it, and its destructor does not survive being run — so ending the process is what returns that memory before the game starts. Unpacking the packaged data moves from the engine to the launcher, because Torch needs config.yml and assets/ymls on disk before the game process starts, not after. It is the same gamedata.zip from the same Gradle tasks, so the packaging and the CI artifact are unchanged; AndroidUtils.cpp goes away. Also adds mods and saves managers behind a button that appears while the engine menu is open, and fixes edge-to-edge: with targetSdk 36 the system ignores the old fullscreen flags, so the navigation bar was sitting on top of the game. Toolchain moves to NDK 30.0.15729638, SDK 36, Gradle 8.13, AGP 8.13.2 and the Kotlin DSL, and builds arm64-v8a and armeabi-v7a. CMAKE_BUILD_TYPE=Release is forced for every variant: the Android plugin builds the release variant as RelWithDebInfo (-O2), but the root CMakeLists pins Release to -O1 -fno-strict-aliasing because the game's C code is miscompiled above that. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
5.2 KiB
Ghostship
Lead Developers:
Discord
Official Discord: https://discord.com/invite/shipofharkinian
If you're having any trouble after reading through this README, feel free ask for help in the Ghostship Support text channels. Please keep in mind that we do not condone piracy.
Quick Start
Ghostship does not include any copyrighted assets. You are required to provide a supported copy of the game.
1. Verify your ROM dump
The supported ROMs are US and JP versions. You can verify you have dumped a supported copy of the game by using the SHA-1 File Checksum Online at https://www.romhacking.net/hash/.
- The SHA-1 hash for a US ROM is 9bef1128717f958171a4afac3ed78ee2bb4e86ce.
- The SHA-1 hash for a JP ROM is 8a20a5c83d6ceb0f0506cfc9fa20d8f438cafe51.
2. Verify your ROM is in .z64 format
Your ROM needs to be in .z64 format. If it's in .n64 format, use the following to convert it to a .z64: https://hack64.net/tools/swapper.php
2. Download Ghostship from Releases
3. Generating the OTR from the ROM and Play!
Windows
- Extract every file from the zip into a folder of your choosing.
- Run Ghostship.exe and select your US or JP ROM.
Linux
- Extract every file from the zip into a folder of your choosing.
- Execute Ghostship.appimage. You may have to chmod +x the appimage via terminal.
MacOS
- Extract every file from the zip into a folder of your choosing.
- Run Ghostship and select your US or JP ROM.
Nintendo Switch
- Run one of the PC releases to generate an
sm64.o2rfile. After launching the game on PC, you will be able to find these files in the same directory asGhostship.exeorGhostship.appimage. - Copy the files to your sd card
Android
- Install the APK and launch it.
- Tap Choose Super Mario 64 ROM and pick your own US or JP
.z64. It is checked against the supported hashes, kept in the app's own storage, and converted intosm64.o2ron the device — no PC step, and no game data ships with the app. - Extraction runs once and takes a few minutes; the game starts by itself when it finishes.
- Mods and saves are managed from the Mods button, which appears next to Menu while the in-game menu is open. Everything also lives on disk under
Android/data/dev.net64.ghostship/files/, so mods can be dropped intomods/with a file manager instead.
Configuration
Default keyboard configuration
| N64 | A | B | Z | Start | Analog stick | C buttons | D-Pad |
|---|---|---|---|---|---|---|---|
| Keyboard | X | C | Z | Space | WASD | Arrow keys | TFGH |
Other shortcuts
| Keys | Action |
|---|---|
| Esc | Toggle menu |
| Ctrl+R | Reset (inside levels) |
| F11 | Fullscreen |
| Tab | Toggle Alternate assets |
Graphics Backends
Currently, there are three rendering APIs supported: DirectX11 (Windows), OpenGL (all platforms), and Metal (macOS). You can change which API to use in the Settings menu of the menubar, which requires a restart. If you're having an issue with crashing, you can change the API in the Ghostship.cfg.json file by finding the line "Backend":{... and changing the id value to 3 and set the Name to OpenGL. DirectX 11 with id 2 is the default on Windows. Metal with id 4 is the default on macOS.
Custom Assets
Custom assets are packed in .o2r or .otr files. To use custom assets, place them in the mods folder.
If you're interested in creating and/or packing your own custom asset .o2r/.otr files, check out the following tools:
Development
Building
If you want to manually compile Ghostship, please consult the building instructions.
Playtesting
If you want to playtest a continuous integration build, you can find them at the links below. Keep in mind that these are for playtesting only, and you will likely encounter bugs and possibly crashes.
Special Thanks:
- Kenix3 : for helping with the Engine development that were brought into other ports.
- HM64 Team : for creating Libultraship and helping with various issues.
- garrettjoecox : for contributing with fixes to this port.
- inspectredc : for contributing to the extraction of the game's assets.
- Malkierian : for contributing to the extraction of the game's assets.