Kenz Linden ae3b3b0deb d_a_saku GLZE01 (#1214)
* daSaku_c matching setMoveBGMtx func

* minor adjustment of daSaku_c setMoveBGMTx func

* remove unecessary class declaration in d_a_saku header

* daSaku_c setEffFire matching

* d_a_saku Draw func matching

* d_a_saku move mtx into array

* d_a_saku move mtxs out of array, setMtx func matching

* d_a_saku checkCol func matching

* d_a_saku checkCol func cleanup

* d_a_saku move related adjacent values into array as opposed to separate variables

* d_a_saku setup HIO class

* d_a_saku mode_break_throw_obj matching, adjust other funcs for data type change

* d_a_saku broken matching, update other funcs to reflect changed data types

* d_a_saku change collision func matching

* d_a_saku burn matching

* fix sakuHIO class data structure

* d_a_saku execute matching

* d_a_saku GetDzId func matching

* d_a_saku CreateHeap func matching

* d_a_saku daSaku_Delete func matching

* d_a_saku adjust data type, update matching funcs for updated data type

* d_a_saku mode_break_none func matching

* d_a_saku daSaku_create matching except stringbase, fix CreateHeap func type

* d_a_saku fix CreateHeap and loadModel func types

* d_a_saku RecreateHeap func matching except stringbase

* d_a_saku CreateInit matching

* d_a_saku CreateDummyHeap func matching

* d_a_saku matAlphaAnim, changeXluMaterialAlpha, l_blendInfo, l_zmodeInfo, l_zmodeInfo2 matching

* d_a_saku DrawSub matching, adjust matAlphaAnim output type

* d_a_saku MoveBGResist func matching

* d_a_saku fix matAlphaAnim to use u16 in for loop

* d_a_saku mode_break_fire func matching

* d_a_saku loadModel func matching except stringbase

* d_a_saku loadMoveBG func matching

* d_a_saku update mode_break_throw_obj heap name

* d_a_saku change my_cyl_src to not const to force into .data

* d_a_saku setCol matching

* d_a_saku adjust loadModel value to correct val

* d_a_saku setEffBreak func matching

* d_a_saku fix sakuHIO_c destructor not properly initialised

* d_a_saku instantiate static vars, re-shuffle to get correct ordering and data placement

* d_a_saku remove redundant "this" usage

* d_a_saku run format on doc

* d_a_saku remove redundant non-matching comments

* d_a_saku cleanup - var names, formatting, function cleanup

* d_a_saku marked as matching

* d_a_saku remove redundant class declaration

* d_a_saku implement code review feedback

* reverse formatter making changes to configure.py

* d_a_saku code review fixes
2026-09-22 21:46:01 -04:00
2026-09-09 12:06:35 -04:00
2026-08-23 14:32:27 -04:00
2026-09-22 21:46:01 -04:00
2025-05-19 19:32:23 -04:00
2026-09-22 21:46:01 -04:00
2026-08-22 13:59:12 -04:00
2026-08-22 18:04:19 -04:00
2023-09-10 00:48:55 -04:00
2025-02-19 19:48:55 -05:00
2026-09-22 21:46:01 -04:00
2023-09-09 10:08:34 -04:00
2026-08-23 14:32:27 -04:00

The Legend of Zelda: The Wind Waker
Build Status Progress DOL Progress RELs Progress Discord Badge

A work-in-progress decompilation of The Legend of Zelda: The Wind Waker for GameCube.

This repository does not contain any game assets or assembly whatsoever. An existing copy of the game is required.

All GameCube versions are supported:

  • GZLE01: Rev 0 (USA), Rev 48 (KOR)
  • GZLP01: Rev 0 (PAL)
  • GZLJ01: Rev 0 (JPN)
  • D44J01: Kiosk demo (JPN)

Dependencies

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%.
  • Download ninja and add it to %PATH%.
    • Quick install via pip: pip install ninja

macOS:

  • Install ninja:
    brew install ninja
    

wibo, a minimal 32-bit Windows binary wrapper, will be automatically downloaded and used.

Linux:

wibo, a minimal 32-bit Windows binary wrapper, will be automatically downloaded and used.

Building

  • Clone the repository:

    git clone https://github.com/zeldaret/tww.git
    
  • Copy your game's disc image to orig/GZLE01.

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

    To use a version other than GZLE01 (USA), specify --version GZLJ01 (JPN) or --version GZLP01 (PAL).

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

Setting up Ghidra

Ghidra is a tool that automatically decompiles code. Although Ghidra's output is not accurate enough to be directly copy-pasted into this decompilation project, it can still be helpful for understanding functions and decompiling them faster.

We have a shared Ghidra project for TWW already set up. To get access to this server:

  • Go to https://ghidra.decomp.dev and link your Discord account.
  • Create a Ghidra account by entering a new username and password into the form on the right.
  • Request "Read" access to the WindWaker server.

Then wait for an admin to approve your request. Once you have access, you can set up the Ghidra project like so:

  • To use Ghidra, you first need to install JDK. You can download OpenJDK 17 from here.
  • Download the RootCubed Ghidra build from here.
  • Launch Ghidra with ghidraRun.
  • In Ghidra, go to File -> New Project.... Select Shared Project and input the following information:
    • Server Name: ghidra.decomp.dev
    • Port Number: 13100
    • User ID: (the username that you chose earlier)
    • Password: (the password that you chose earlier)
  • You should now be able to view the files in the Ghidra project. Open the main file.
  • Finally, you should make a local copy of the main file in Ghidra. Right click on main, select Copy, then right click again and select Paste.
    • This is so that you will be able to save changes that you make while decompiling, as you don't have write access to change main itself.
    • Additionally, Ghidra has a bug that causes the remote version of main to be extremely slow to use if you only have read access, so you should still make a local copy even if you don't intend to change anything. The first time you open main will still be slow, but opening the local copy in the future should be fast.

Now you have Ghidra set up and ready to use.

For an introduction on how to use Ghidra, you can read this section of the Twilight Princess decompilation's guide.

Optionally, you may also want to also request "Read" access to the TwilightPrincess server on https://ghidra.decomp.dev and set that Ghidra project up too, even if you are not interested in working on that game. The reason for this is that a significant amount of engine code is shared between The Wind Waker and Twilight Princess, and the debug version of Twilight Princess (called shield_chn_debug in the Ghidra project) is easier to work with because inline functions are not inlined in that version. It can be worth checking if the function you're working on is present in that game as well.

Contributing

If you've got all the requirements set up and want to learn how to contribute to the decompilation effort, see this guide for details.

Anyone can open a pull request, but please be aware that we do not accept contributions that are primarily AI-generated or directly copy-pasted from Ghidra. Your PR will be closed if it contains obvious signs of machine-generated code. It is your responsibility to check the code that you are submitting and make sure it is readable and feels like something a human programmer would write. Refer to the coding guidelines page for more information.

S
Description
No description provided
Readme CC0-1.0 57 MiB
Languages
C++ 75.3%
C 23.2%
Python 0.8%
Pawn 0.5%