* Added constructor implementation for `daBoomerang_c`. * Extend `daBoomerang_sightPacket_c` with `dDlst_base_c` base class. * Refactor `d_a_boomerang.h`: reorganize class definitions and update member layout in `daBoomerang_c`. * Extend `daBoomerang_c`: add new arrays, members, and static assertions for structure validation. * Extend `daBoomerang_c`: add `dBgS_BoomerangLinChk` member and update padding fields. * Extend `daBoomerang_c`: implement `create` method, add new members, and update function signatures. * Refactor `daBoomerang_c`: update `createHeap` function to return `BOOL` and adjust related calls. * Extend `daBoomerang_c`: implement `execute` method logic, update member variables, and adjust structure layout in `d_a_boomerang.h`. * Extend `daBoomerang_c`: add static blur vector definitions for `l_blur_top` and `l_blur_root`. * Add fields to `daBoomerang_blur_c`. * Refactor `daBoomerang_blur_c`: implement `initBlur` logic, add `pos` field, update structure layout in `d_a_boomerang.h`. * Refactor `daBoomerang_blur_c`: update `initBlur` and `copyBlur` logic, modify array structure to use 2D layout, and adjust declarations in `d_a_boomerang.h`. * Match `copyBlur` * Update `config.yml`: add symbol `l_matDL` for `daBoomerang_blur_c`. * Extend `daBoomerang_blur_c`: implement `draw` method, add vertex description, attribute format lists, and texture handling logic. * Add fields to `daBoomerang_sightPacket_c` * Update `play` method in `daBoomerang_sightPacket_c`: implement looping logic for modifying `field_0xF4` values. * Refactor `setSight` and `play` in `daBoomerang_sightPacket_c`: implement animation logic, replace `field_0xF4` with `arr_0xF4`, add `arr_0xF9`, and update structure in `d_a_boomerang.h`. * Refactor `daBoomerang_sightPacket_c`: add `setTex` and `setImage` methods; update image data logic in `d_a_boomerang.cpp` and `d_a_boomerang.h`. * Update `initFrame` and `resetSightOn` in `daBoomerang_sightPacket_c`: initialize `arr_0xF4` and reset `targetFlags`. * Replace hardcoded array size with `BOOM_TARGET_MAX` in `d_a_boomerang.cpp` and `d_a_boomerang.h` * Refactor `daBoomerang_sightPacket_c`: rename variables for clarity, update structure fields, and adjust logic in `setSight`, `play`, and related methods. * Implement `draw` method in `daBoomerang_sightPacket_c`: add vertex descriptor/attribute format lists, texture handling, and sight rendering logic. * Adjust vertex attribute formats in `d_a_boomerang.cpp`: update position to `GX_S8` and texture to `GX_U8`. * Reorder includes in `d_a_boomerang.cpp` to resolve dependencies for `l_sightMatDL` and `l_sightDL__d_a_boomerang` * Update `getFlyMax` in `daBoomerang_c`: add player status and stage name checks to determine maximum flight distance. * Refactor `procMove` and `execute` in `daBoomerang_c`: improve boomerang targeting logic, rename variables for clarity, update array structures, and adjust control flow. * Implement enhanced boomerang movement logic in `daBoomerang_c`: calculate angles, update position/rotation, handle water effects, and refine collision detection. Adjust structure fields in `d_a_boomerang.h`. * Refactor `daBoomerang_c` control flow: reorder player retrieval logic, adjust distance-based normalization, and refine boomerang return handling. * Change return type of `returnBoomerang` from `int` to `BOOL` in `d_a_player_main.h` and `d_a_player_boomerang.inc`. * Change `setItemWaterEffect` return type from `u32` to `BOOL` and refactor its parameters and logic for clarity and behavior adjustment. * Adjust `setItemWaterEffect` call in `d_a_boomerang.cpp` to use explicit `BOOL` comparison for clarity. * Refactor `daBoomerang_c` control flow and targeting logic: introduce `mTargetRayEnd`, enhance position/angle calculations, integrate player sight checks, and update camera handling. Adjust includes and structure definitions for consistency. * Match `rockLineCallback` * Rename `param_1` to `pHitActor` in `rockLineCallback` for clarity. * Match `setAimActor` in `d_a_boomerang.cpp`. * Refactor `daBoomerang_c`: update `setLockActor` to use `BOOL` type, modify related logic for clarity, and ensure consistent parameter usage across `d_a_boomerang.cpp`. * Match `resetLockActor` in `d_a_boomerang.cpp`: initialize target arrays and reset counters for consistency. * Refactor `daBoomerang_c`: Fix struct offsets, update instance size * Match `setRoomInfo` in `d_a_boomerang.cpp`: update position handling, ground checks, room ID assignment, and environment override logic. * Match `create` in `d_a_boomerang.cpp`: update matrix handling, target ID initialization, callback setup, and clean up unused code. * Match `setKeepMatrix` in `d_a_boomerang.cpp`: update transformation logic to align boomerang with Link's hand. * Refactor `d_a_player_main` boomerang logic: rename `m36F4` to `mBoomerangCatchPos`, implement `getBoomerangCatchPos` accessor * Match `setAimPos` in `d_a_boomerang.cpp`: implement target position logic based on current target index and player catch position. * Match `checkBgHit` in `d_a_boomerang.cpp`: implement background collision logic, position updates, sound effects, and behavior adjustments. * Continue matching `procWait` in `d_a_boomerang.cpp` * Refactor `d_a_boomerang.cpp`: rename `field_0xF3A` to `mModelRotY` for clarity, update all associated references, and adjust struct definition in the header file. * Continue matching `procWait` in `d_a_boomerang.cpp` * Match `procWait` in `d_a_boomerang.cpp` * Continue matching `procMove` in `d_a_boomerang.cpp` * Refactor `d_a_boomerang.cpp`: convert `u8` fields to `bool` for clarity and better type usage, update header and references accordingly. * Match `draw` in `d_a_boomerang.cpp`: implement drawing logic with model updates, light settings, shadow handling, and target sight management. Update struct definition to include `mGroundY`. * Refactor `procMove` in `d_a_boomerang.cpp`: simplify angle calculations, update `mInWater` to `u8`, and improve readability by reducing nested logic. * Fix `at_offset` initialization in `procMove` in `d_a_boomerang.cpp` * Match `procMove` in `d_a_boomerang.cpp` * Refine `draw` in `d_a_boomerang.cpp`: inline comments for quads setup, add light yellow trail color definition. * Refactor `d_a_boomerang.cpp` and header: rename `field_0x14` to `numTrailSegments` for improved clarity and update all related references. * Refactor `draw` in `d_a_boomerang.cpp`: reorganize quads initialization and alpha blending loops for improved structure and readability. * Refactor `draw` in `d_a_boomerang.cpp`: combine alpha variable declarations for improved local scope and clarity. * Refactor `draw` in `d_a_boomerang.cpp`: introduce `QUAD_VERT` macro to streamline quad vertex setup and improve code readability. * Refactor `draw` in `d_a_boomerang.cpp`: rename `alpha` variables to `uCoord` for improved clarity and consistency with their purpose. * Refactor `d_a_boomerang.cpp` and header: introduce `SEGMENTS_PER_STEP` constant for improved clarity and consistency, update related loops and data structures. * Refactor `d_a_boomerang.cpp` and header: rename trail arrays for improved clarity and consistency, update all related references. * Refactor `d_a_boomerang.cpp` and header: simplify trail vertex array indexing by flattening multidimensional arrays and updating all related code. * Refactor `d_a_boomerang.cpp`: mark `se_flg` array as `const` for improved immutability and clarity. * Refactor `d_a_boomerang.cpp`: relocate `l_at_cps_src` definition for improved organization and consistency. * Refactor `d_a_boomerang.cpp` and header: rename and clarify multiple variables (e.g., `field_0xF2C` to `mIsReturning`) for improved readability and consistency, update all related references and logic. * Refactor `d_a_boomerang.h`: add destructors to `daBoomerang_blur_c` and `daBoomerang_sightPacket_c` for proper ordering. * Refactor `daBoomerang_blur_c::draw` in `d_a_boomerang.cpp`: reorder variable initialization, streamline loops, and adjust `QUAD_VERT` macro usage for improved clarity and consistency. * Add inline geometry utility functions to `GFGeometry.h` * Refactor `d_a_boomerang.cpp`: simplify geometry rendering by updating `QUAD_VERT` macro implementation and replacing manual vertex management with `GFBegin`/`GFEnd`. * Refactor `d_a_boomerang.cpp`: simplify trail rendering by streamlining `uCoord` handling, reducing redundant variables, and improving clarity in loops. * Refactor `d_a_boomerang.cpp`: rename `QUAD_VERT` to `QUAD_VTX` for clarity and update all related references. * Add `l_matDL$4438` entry to config files for `daBoomerang_blur_c` rendering assets. * Add version check around `j3dSys.reinitGX()` in `d_a_boomerang.cpp` to limit execution to non-demo builds. * Refactor `d_a_boomerang.cpp`: replace direct `current.roomNo` usage with `roomNo` variable for improved clarity and consistency. * Add version-specific asserts in `d_a_boomerang.cpp` for demo and non-demo builds * Add version-specific asserts and adjust version check logic in `d_a_boomerang.cpp` for Japanese build * Align `GXVtxDescList` and `GXVtxAttrFmtList` declarations with `ALIGN_DECL(32)` in `d_a_boomerang.cpp` for consistent memory alignment. * Update `d_a_boomerang` to use `MatchingFor` in configuration * Remove outdated `FIXME` comment in `d_a_boomerang.cpp`. * Refactor `d_a_boomerang.cpp`: replace hardcoded rotation constants with `yRotPerStep` variable for clarity and maintainability. * Update `d_a_boomerang.cpp` configuration to use `Matching` instead of `MatchingFor`. * Refactor `d_a_boomerang.cpp`: rename `field_0xF2E` to `mJustHit` and `field_0xF2D` to `unused_0xF2D` for improved clarity. * Replace hardcoded value in `d_a_boomerang.cpp` with `daBoomerang_blur_c::SEGMENTS_PER_STEP` for improved readability and maintainability. * Refactor `d_a_boomerang.cpp`: replace `fpcM_GetParam` with `fopAcM_GetParam` for consistency with actor parameter retrieval methods. * Introduce `Mode` enum in `d_a_boomerang` and replace related hardcoded values for improved readability and maintainability. * Refactor `setAimActor` in `d_a_boomerang.cpp`: rename parameter for improved clarity. * Replace `fpcM_SetParam` with `fopAcM_SetParam` in `d_a_boomerang.cpp` for consistency with actor parameter setting methods. * Replace hardcoded `0` with `dEvtMode_NONE_e` in `d_a_boomerang.cpp` for improved readability and maintainability. * Replace `BOOM_TARGET_MAX` with `BOOMERANG_LOCK_MAX` in `d_a_boomerang` for consistency. * Refactor `d_a_boomerang.cpp` and `d_a_boomerang.h`: rename target-related variables and methods to lock-related for improved clarity and consistency. * Refactor `daBoomerang_Draw` and `daBoomerang_Execute` in `d_a_boomerang.cpp` to simplify and remove redundant casts. * Replace `Mode_0` and `Mode_1` with `Mode_Wait` and `Mode_Throw` in `d_a_boomerang` * Simplify boolean assignment in boomerang lock condition in `d_a_boomerang.cpp`. * Rename variable `b` to `isAiming` in `d_a_boomerang.cpp` for improved readability. * Refactor draw methods in `d_a_boomerang.cpp` to streamline list-setting logic. * Refactor particle effect in `d_a_boomerang.cpp` to use `dComIfGp_particle_setP1` for improved clarity and maintainability. * Replace `g_dComIfG_gameInfo` camera getter with `dComIfGp` equivalents in `d_a_boomerang.cpp` for consistency. * Simplify version-specific `JUT_ASSERT` calls in `d_a_boomerang.cpp` with `VERSION_SELECT` for improved maintainability. * Replace direct model matrix assignment with `fopAcM_SetMtx` in `d_a_boomerang.cpp` for consistency. * Update matching logic for `d_a_boomerang.cpp` to use `MatchingFor`.
The Legend of Zelda: The Wind Waker

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%.- 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/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.pyTo 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 ghidra_11.1_DEV_20240115 from here.
- Launch Ghidra with
ghidraRun. - In Ghidra, go to
File -> New Project.... SelectShared Projectand 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. You should checkout the
mainfile.
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.
