* d_a_tag_event debug almost matching * d_a_tag_msg debug almost matching * d_a_tag_attention almost matching * d_a_tag_chkpoint debug almost matching (weak func order) * d_a_tag_evt debug almost matching (extra weak fns) * d_a_tag_evtarea debug almost matching (weak func order) * d_a_tag_evtmsg debug almost matching (weak func order) * d_a_tag_mist debug almost matching (weak func order) * d_a_tag_howl debug almost matching (weak func order) * d_a_tag_lantern debug almost matching (weak func order) * d_a_tag_push debug almost matching (weak func order) * d_a_tag_telop debug almost matching (weak func order) * d_a_tag_CstaSw debug almost matching (weak func order) * d_a_tag_ajnot debug almost matching (weak func order) * d_a_tag_attack_item debug almost matching (weak func order) * d_a_tag_gstart debug almost matching (weak func order) * d_a_tag_hinit debug almost matching (debug weak func order) * d_a_tag_hjump debug almost matching (weak func order) * d_a_tag_hstop debug almost matching (weak func order) * d_a_tag_lv2prchk debug almost matching (weak func order) * d_a_tag_magne debug almost matching (weak func order) * d_a_tag_mhint debug almost matching (weak func order) * d_a_tag_mstop debug almost matching (weak func order) * d_a_tag_spring debug almost matching (weak func order) * d_a_tag_statue_evt debug almost matching (weak func order) * d_a_tag_arena debug almost matching (weak func order) * d_a_tag_Lv6Gate debug almost matching (weak func order) * d_a_tag_Lv7Gate debug almost matching (weak func order) * d_a_tag_Lv8Gate debug almost matching (.data + weak func order) * d_a_tag_TWgate debug almost matching (weak func order) * d_a_tag_lv6CstaSw debug almost matching (weak func order) * d_a_tag_assistance debug almost matching (weak func order) * d_a_tag_bottle_item debug almost matching (weak func order) * d_a_tag_chgrestart debug almost matching (weak func order) * d_a_tag_csw debug almost matching (weak func order) * d_a_tag_escape debug almost matching (weak func order) * d_a_tag_firewall debug almost matching (weak func order) * d_a_tag_gra debug almost matching (weak func order) * d_a_tag_guard debug almost matching (weak func order) * d_a_tag_instruction debug almost matching (weak func order) * d_a_tag_kago_fall debug almost matching (weak func order) * d_a_tag_lightball debug almost matching (weak func order) * d_a_tag_lv5soup debug almost matching (weak func order) * d_a_tag_mmsg debug almost matching (weak func order) * d_a_tag_mwait debug almost matching (weak func order) * d_a_tag_myna2 debug almost matching (weak func order) * d_a_tag_myna_light debug almost matching (weak func order) * d_a_tag_pachi debug almost matching (weak func order) * d_a_tag_poFire debug almost matching (weak func order) * d_a_tag_qs debug almost matching (small mismatch in search) * d_a_tag_ret_room debug almost matching (weak func order) * d_a_tag_river_back debug almost matching (weak func order) * d_a_tag_rmbit_sw debug almost matching (weak func order) * d_a_tag_schedule debug almost matching (weak func order) * d_a_tag_setBall debug almost matching (weak func order) * d_a_tag_setrestart debug almost matching (weak func order) * d_a_tag_shop_item debug almost matching (weak func order) * d_a_tag_smk_emt debug almost matching (weak func order) * d_a_tag_spinner debug almost matching (weak func order) * d_a_tag_sspath debug almost matching (weak func order) * d_a_tag_ss_drink debug almost matching (weak func order) * d_a_tag_stream debug almost matching (weak func order) * d_a_tag_theB_hint debug almost matching (weak func order) * d_a_tag_watchge debug almost matching (weak func order) * d_a_tag_waterfall debug almost matching (weak func order) * d_a_tag_allmato debug almost matching (weak func order) * d_a_tag_camera debug almost matching (extra weak fns) * d_a_tag_wara_howl debug almost matching (RTTI mismatch?) * d_a_tag_yami debug almost matching (weak func order) * Fix Shield regressions related to d_a_tag_* debug work
The Legend of Zelda: Twilight Princess
A work-in-progress decompilation of The Legend of Zelda: Twilight Princess.
The code for the GameCube releases is completely matching. However, not every Translation Unit (TU) has been linked yet. Work is continuing by aligning the Debug version and getting the Wii versions to match. All versions are built from the same codebase using conditional compilation.
Important
This repository does not contain any game assets or assembly whatsoever. An existing copy of the game is required.
This project itself is not, and will not, produce a port, to PC or any other platform. It is a decompilation of the original game code, which can be compiled back into a binary identical to the original.
The project can target the following supported versions:
GZ2E01: GameCube - North AmericaGZ2P01: GameCube - Europe/AustraliaGZ2J01: GameCube - JapanRZDE01_00: Wii - North America (Rev 0)RZDE01_02: Wii - North America (Rev 2)RZDP01: Wii - Europe/AustraliaRZDJ01: Wii - JapanShield: Nvidia Shield - ChinaShieldD: Nvidia Shield - China (Debug Version)
More information about the project can be found here: https://zsrtp.link
Dependencies
You will need the following dependencies:
- git
- ninja
- python3
- clang-format (optional)
Windows
On Windows, it's highly recommended to use native tooling. WSL or msys2 are not required.
When running under WSL, objdiff is unable to get filesystem notifications for automatic rebuilds.
- Install Python and add it to
%PATH%.- Also available from the Windows Store.
- Download ninja and add it to
%PATH%.- Quick install via pip:
pip install ninja
- Quick install via pip:
macOS
-
Install ninja:
brew install ninja
wibo, a minimal 32-bit Windows binary wrapper, will be automatically downloaded and used.
Linux
- Install ninja.
wibo, a minimal 32-bit Windows binary wrapper, will be automatically downloaded and used.
Building
-
Clone the repository:
git clone https://github.com/zeldaret/tp.git -
Copy your game's disc image to
orig/GZ2E01.- Supported formats: ISO (GCM), RVZ, WIA, WBFS, CISO, NFS, GCZ, TGC.
- After the initial build, the disc image can be deleted to save space.
-
Configure:
python configure.pyTo use a version other than
GZ2E01(GCN USA), specify it with--version. -
Build:
ninja
Diffing
Once the initial build succeeds, an objdiff.json should exist in the project root.
Download the latest release from encounter/objdiff. Under project settings, set Project directory. The configuration should be loaded automatically.
Select an object from the left sidebar to begin diffing. Changes to the project will rebuild automatically: changes to source files, headers, configure.py, splits.txt or symbols.txt.
Contributing
If you've got all the requirements set up and want to learn how to contribute to the decompilation effort, join our Discord server and check out our contribution guide.
