Decompilation of Super Mario Odyssey 1.0.0.
Sorted function map can be found here.
Reminder: this will not produce a playable game. This project will not allow you to play the game if you don't already own it on a Switch.
While Linux is not a hard requirement, it is strongly advised to set up WSL to simplify the setup process. Ubuntu 20.04 is usually a good choice.
The instructions below assume that you are using Linux (native or WSL) or macOS.
- Python 3.6 or newer with pip
- Ninja
- CMake 3.13+
- If you are on Ubuntu 18.04, you must first update CMake by using the official CMake APT repository.
- ccache (to speed up builds)
- xdelta3
- clang (not for compiling SMO code, but for compiling Rust tools)
Ubuntu users can install those dependencies by running:
sudo apt install python3 ninja-build cmake ccache xdelta3 clang libssl-dev
Additionally, you'll also need:
- A Rust toolchain (follow the instructions here)
- The following Python modules:
capstone colorama cxxfilt pyelftools ansiwrap watchdog python-Levenshtein toml
(install them withpip install ...
)
-
Clone this repository. If you are using WSL, please clone the repo inside WSL, not on the Windows side (for performance reasons).
-
Run
git submodule update --init --recursive
Next, you'll need to acquire the original 1.0
main
NSO executable.- To dump it from a Switch, follow the instructions on the wiki.
- You do not need to dump the entire game (RomFS + ExeFS + DLC). Just dumping the 1.0 ExeFS is sufficient.
-
Run
tools/setup.py [path to the NSO]
- This will:
- install tools/check to check for differences in decompiled code
- convert the executable if necessary
- set up Clang 3.9.1 and 4.0.1 by downloading them from the official LLVM website
- create a build directory in
build/
- If something goes wrong, follow the instructions given to you by the script.
- If you wish to use a CMake generator that isn't Ninja, use
--cmake_backend
to specify it.
- This will:
To start the build, just run
python tools/build.py
By default, a multithreaded build is performed. No need to specify -j
manually.
Use --clean
to perform a clean build, and --verbose
to enable verbose output.
To check whether everything built correctly, just run tools/check
after the build completes.