An in-progress decompilation of The Legend of Zelda: Skyward Sword for the Nintendo Wii. Currently builds NTSC-1.0 (SOUE01 Rev 0), with other versions planned. Skyward Sword HD for the Nintendo Switch is out of scope, though the Skyward Sword HD Randomizer community has done some reverse engineering.
The repository is hosted in the ZeldaRET GitHub organization, and progress can be viewed on decomp.dev.
There is no known debug information for any Skyward Sword version, so a large part of this project requires original research. However, some foundational libraries and even the core engine can be found in other games with more debugging info available.
As mentioned above, much of our knowledge about Skyward Sword's code comes from other games:
Other information has been gathered through plain static and dynamic analysis.
In particular, the Skyward Sword Randomizer community has analyzed various file formats and game behaviors:
For first-time setup, please refer to the GitHub project's README. Some details that will be relevant after the initial setup are discussed in this section.
Many functions will have a name like fn_8002ECD0
. This is simply an automatically generated name based on the fact that it's found at virtual memory address 8002ECD0
. Since the function could be from code that is only found in Skyward Sword, we might not have an "official name" and you can choose any name for it that makes sense and follows the surrounding coding style.
When you write code to match this function, objdiff won't know that your function is related to fn_8002ECD0
and won't compare them. Simply clicking on fn_8002ECD0
will allow you to choose a function implemented by you and temporarily "map" these two functions.
After you have a function matched and you're reasonably certain about argument types, you will then right-click your function, click Copy <mangled name>
, where "mangled name" is the least readable version of the function name, and then open the config/SOUE01/symbols.txt
file and replace fn_8002ECD0
with the mangled name. This makes your name known to the rest of the tooling; otherwise you'll get linker errors.
Here are some example Pull Requests that are good self-contained examples for fully matching a file.