Briggs Baltzell ca9481dcc9 d_cloth_packet matching (#928)
* Match dCloth_packet_c::setMtx

* Match dCloth_packet_c::setGlobalWind

* Match dCloth_packet_c::dCloth_packet_c constructor implementation

* Match dCloth_packet_c::getFactor and get_cloth_anim_sub_factor implementation

* Match dCloth_packet_c::cloth_move implementation

* Match dCloth_packet_c::setNrm implementation

* Match dCloth_packet_c::init and default_factor_checkCB implementation

* Match dCloth_packet_c::draw implementation

* Match dCloth_packet_c::cloth_draw implementation

* Match dCloth_packet_c::plot implementation

* Match dCloth_packet_c::TexObjLoad implementation

* Match dCloth_packet_c::TexObjInit implementation

* Match dCloth_packet_c::TevSetting implementation

* Match dCloth_packet_c::dCloth_packet_create implementation

* Match dCloth_packet_c::TevSetting implementation

* Match dCloth_packetXlu_c::TevSetting implementation and make dCloth_packet_c members protected

* Match dCloth_packetXlu_c::cloth_draw implementation

* Match dClothVobj03_c::cloth_copy implementation and update member definitions

* Match dClothVobj04_c, dClothVobj05_c, and dClothVobj07_0_c::cloth_copy implementations and update member definitions

* Match dClothVobj03_c::init implementation, update cloth_counter definitions, and add new member variables

* Match `dClothVobj04_c::init`, `dClothVobj05_c::init`, and `dClothVobj07_0_c::init` implementations, and add new member variables.

* Match `dClothVobj03_c::dClothVobj03_create` and constructor implementations, update member definitions, and add new logic checks.

* Match `dClothVobj03_c::cloth_move` implementation

* Match `dClothVobj04_c`, `dClothVobj05_c`, and `dClothVobj07_0_c::cloth_move` implementations

* Match `dClothVobj03_c`, `dClothVobj04_c`, `dClothVobj05_c`, and `dClothVobj07_0_c::TexObjInit` implementations, update member definitions, and initialize `mTlutObj`.

* Match `TexObjLoad` implementations for `dClothVobj03_c`, `dClothVobj04_c`, `dClothVobj05_c`, and `dClothVobj07_0_c`.

* Fix `dClothVobj04_c::cloth_move`

* Match `dClothVobj04_create`, `dClothVobj05_create`, and `dClothVobj07_0_create` implementations, update parameter definitions, and add new constructor logic.

* Update parameter names in `dClothVobj05_VtxFactorCB` and `dClothVobj07_0_VtxFactorCB` for consistency.

* Adjust parameter values in `dClothVobj05_create` and `dClothVobj07_0_create` for consistency with expected behavior.

* Match `dClothVobj05_VtxFactorCB` and `dClothVobj07_0_VtxFactorCB` implementations and update return logic.

* Fix constructors

* Refactor repetitive parameter assignments in `dCloth_packet_c` with `setParam` and `setWindPower` for cleaner and more maintainable code.

* Add `setFactorCheckCB` call in `dCloth_packet_c` initialization

* Refactor `dCloth_packet_c` and related classes to eliminate redundant success checks with `chkCreateBuff` helper method.

* Refactor `dCloth_packet_c` and related classes to use getter methods for cleaner access and rename methods for improved clarity.

* Simplify constructors for `dClothVobj03_c`, `dClothVobj04_c`, `dClothVobj05_c`, and `dClothVobj07_0_c` by removing redundant parameters.

* Replace `field_0x109` with `mIsIndoors` for improved clarity and consistency across `dCloth_packet_c` and related classes.

* Replace `VECDotProduct` with `inprod` method in `dCloth_packet_c` for improved readability and modern syntax usage.

* Make `top_pointer` and `cloth_counter` members private in multiple `dClothVobjXX_c` classes for encapsulation.

* Match cloth creation functions

* Add `l_alpha_matDL` assets and update `GXCallDisplayList` usage in `dCloth_packetXlu_c`

* Match dCloth_packet_c::init

* Match dCloth_packet_c::setNrm

* Refactor dCloth_packet_c to use mDoMtx_stack_c methods

* Match `get_cloth_anim_sub_factor` implementation in `dCloth_packet_c`.

* Refactor `getFactor` in `dCloth_packet_c` to use a bitmask for neighbor checks, enhancing code clarity and efficiency.

* Match dCloth_packet_c::cloth_move

* Match dCloth_packet_c::setGlobalWind

* Match dCloth_packet_c::plot implementation

* Remove unused virtual function declarations

* Update `d/d_cloth_packet.cpp` to Matching in configure.py

* Refactor field_0x108 and mIsIndoors to boolean types, rename, and add explanatory comments.

* Update `d/d_cloth_packet.cpp` to `MatchingFor("GZLE01")` in configure.py

* Add new material and alpha material configurations for `d_cloth_packet` across GZLP01, GZLJ01, and D44J01

* Update `d/d_cloth_packet.cpp` to `Matching` in configure.py

* Update `d/d_cloth_packet.cpp` to `MatchingFor("GZLE01", "GZLP01")` in configure.py

* Add conditional GXSetNumIndStages and resetVcdVatCache for non-JPN versions in `dCloth_packet_c::draw`

* Update `d/d_cloth_packet.cpp` to `MatchingFor("GZLJ01", "GZLE01", "GZLP01")` in configure.py

* Matched dCloth_packet_c::dCloth_packet_c for `VERSION_DEMO` in `d/d_cloth_packet.cpp`

* Matched dCloth_packet_c::cloth_move for `VERSION_DEMO` in `d/d_cloth_packet.cpp`

* Matched dCloth_packet_c::draw for `VERSION_DEMO` in `d/d_cloth_packet.cpp`

* Matched dCloth_packet_c::TexObjInit for `VERSION_DEMO` in `d/d_cloth_packet.cpp`

* Matched dClothVobjXX_c::TexObjInit for `VERSION_DEMO` in `d/d_cloth_packet.cpp`

* Update `d/d_cloth_packet.cpp` to `Matching` in configure.py

* Replaced direct member access with getter methods in `d/d_cloth_packet.cpp`

* Added `f` suffix to floating-point literals in `d/d_cloth_packet.cpp` for consistency.
2026-02-12 01:42:21 -05:00
2025-08-22 13:43:47 -04:00
2023-09-10 00:48:55 -04:00
2026-02-12 01:42:21 -05:00
2026-02-12 01:42:21 -05:00
2025-05-19 19:32:23 -04:00
2026-02-12 01:42:21 -05:00
2025-11-24 19:08:53 -05:00
2025-08-26 17:04:33 -04:00
2023-09-10 00:48:55 -04:00
2025-02-19 19:48:55 -05:00
2026-02-12 01:42:21 -05:00
2023-09-09 10:08:34 -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 ghidra_11.1_DEV_20240115 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. You should checkout the main file.

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.

S
Description
No description provided
Readme CC0-1.0 48 MiB
Languages
C++ 89.4%
C 8.9%
Python 1%
Pawn 0.6%
Pascal 0.1%