Briggs Baltzell ea7c107eb7 d_menu_cloth matching (#937)
* Add `l_matDL` symbols and assets to config files for all regions for d_menu_cloth

* Extend `daCLOTH_HIO_c` with `JORReflexible` and add static instance `l_HIO` in `d_menu_cloth`

* Refactor `d_menu_cloth.h` to improve naming consistency for member variables.

* Initialize `dMCloth_c` member variables and create HIO child in constructor

* Include `l_matDL` in `d_menu_cloth` and call it in `dMCloth_c::draw`.

* Add private member variables to `daCLOTH_HIO_c` in `d_menu_cloth.h`

* Add virtual destructor to `daCLOTH_HIO_c` in `d_menu_cloth.h`

* Swap `daCLOTH_HIO_c` and `daCLOTH_ChildHIO_c` class definitions and adjust member variables in `d_menu_cloth.h`.

* Remove non-matching comments from `daCLOTH_ChildHIO_c` constructor and destructor in `d_menu_cloth.cpp`.

* Initialize `daCLOTH_HIO_c` member variables and update `daCLOTH_ChildHIO_c` access modifiers in `d_menu_cloth`.

* Remove unused member variables from `daCLOTH_HIO_c` and `daCLOTH_ChildHIO_c` in `d_menu_cloth.h`.

* Match dMCloth_c::dMCloth_c

* Match `dMCloth_c::init`.

* Match `dMCloth_c` destructor.

* Refactor `dMCloth_c` to use `mCurArr` for indexing and update structure definitions in `d_menu_cloth`.

* Define `ARR_SIZE` constant and replace hardcoded array sizes in `d_menu_cloth`.

* Match dMCloth_c::TevSetting

* Match dMCloth_c::TevSettingMenu

* Match `dMCloth_c::TevSettingMenu` and `dMCloth_c::TevSettingFileSelect`.

* Match `dMCloth_c::lightSet1`

* Start matching `dMCloth_c::cloth_init` and update structure definitions to use `INNER_SIZE` constant, optimize initialization logic, and replace redundant assignments with consolidated methods.

* Match `dMCloth_c::setNrmVtx` implementation and update header declaration.

* Match `daCLOTH_HIO_c` destructor implementation.

* Match `dMenu_ClothCreate`, `dMenu_ClothDelete`, `dMenu_ClothExecute`, `dMenu_ClothDraw`, and `dMenu_ClothIsDelete` implementations and update related structure definitions.

* Update `g_fopAc_Method` reference to `g_fopMsg_Method` in cloth menu structure.

* Match `dMCloth_c::cloth_move` implementation and update type definitions for `field_0xa` and `field_0x34` to `s16`.

* Start matching `dMCloth_c::cloth_move_sin` and `dMCloth_c::cloth_move_simple` implementations.

* Match `dMCloth_c::ShadowTevSetting` implementation.

* Match `dMCloth_c::ShadowTevSettingMenu` and `dMCloth_c::ShadowTevSettingFileSelect` implementations.

* Match `dMCloth_c::alpha_out` implementation.

* Match `dMCloth_c::plot` implementation and minor formatting fix in `dMCloth_c::ShadowTevSettingMenu`.

* Refactor `d_menu_cloth` to replace s16 color fields with `GXColorS10` and `GXColor` structures. Update all related logic and structure definitions accordingly.

* Match `dMCloth_c::draw` implementation, refactor initialization of `field_0x10`, and update associated structure definitions.

* Match `dMCloth_c::plot_shadow` implementation and update parameter names in `plot` and `plot_shadow` declarations.

* Update `d_menu_cloth` to use `msg_method_class` and `msg_process_profile_definition`. Refactor structure definitions and add TODO comment for size clarification.

* Add member comments in `dMenu_ClothMethodTable`

* Refactor `d_menu_cloth` to improve pointer arithmetic in `plot` loop and add missing implementations for `getOffsetVec` and `getShadowPos`.

* Refactor `dMCloth_c::plot` to improve naming consistency for loop variables and pointer arithmetic.

* Refactor `d_menu_cloth` to replace repeated member accesses with `HIO_CHILD` macro for improved readability and maintainability.

* Rename fields in `d_menu_cloth`

* Add clarifying comments in `dMenu_ClothMethodTable` about function order and usage

* Use `TRUE` and `FALSE` macros instead of literal values in `d_menu_cloth` methods for consistency.

* Replace numeric cloth type values with `MenuClothType` enum for improved readability and maintainability in `d_menu_cloth`.

* Refactor `dMCloth_c::cloth_init`: replace raw pointer arithmetic with `set` calls for improved clarity and maintainability.

* Refactor `MENU_CLOTH_TYPE_2` logic: replace hardcoded rotation calculation with `cM_deg2s` for clarity and maintainability.

* Change `wavePreSteps` type from `u16` to `s16` in `d_menu_cloth` for alignment with signed calculations.

* Replace hardcoded angle conversion with `cM_deg2s` in `MENU_CLOTH_TYPE_0` logic for improved clarity and maintainability.

* Change `mWaveProgress` type from `u16` to `s16` in `d_menu_cloth` for consistency with signed calculations.

* Match `cloth_init` in `d_menu_cloth`

* Fix `INNER_SIZE` iteration in `d_menu_cloth` to properly handle loop bounds.

* Update vertex attribute formats in `d_menu_cloth` for improved correctness.

* Add inline utility function `GXColor4x8` to `GX.h` for streamlined color input handling

* Refactor triangle strip generation in `d_menu_cloth` for improved readability and maintainability.

* Refactor vertex and texture coordinate handling in `dMCloth_c::plot_shadow` for improved clarity and correctness.

* Refactor vertex handling in `d_menu_cloth` to group vertex and texture operations for improved readability and structure.

* Add `GXNormal1x16` and `GXColor3x8` inline utility functions to `GX.h` for simplified normal and color input handling.

* Update vertex format in `d_menu_cloth` to use `GXPosition1x16` and `GXNormal1x16` for improved attribute handling.

* Add `dMs_clothOnly_create` and `dMs_clothOnly_delete` implementations in `d_menu_window`

* Implement `dMs_cloth_create` and `dMs_cloth_delete` functions in `d_menu_window` and update related structure definitions.

* Replace hardcoded cloth type with `MENU_CLOTH_TYPE_2` constant in `d_menu_window`.

* Refactor `MENU_CLOTH_TYPE` enum names for clarity and update all references across `d_menu_cloth`, `d_s_name`, and `d_menu_window`.

* Refactor `mChildren` array indexing in `daCLOTH_HIO_c` constructor to use `MENU_CLOTH_TYPE` constants for improved readability and maintainability.

* Refactor `color1` and `color2` fields to `clothColor` and `shadowColor` for improved clarity in `d_menu_cloth` structure and related logic.

* Simplify alpha blending logic by removing redundant variables in `d_menu_cloth`.

* Refactor `mColor1`/`mColor2` to `mClothColor`/`mShadowColor` for improved clarity in `d_menu_cloth` and update all related logic.

* Add temporary `dummy0` function in `d_menu_window` for placeholder debug strings.

* Refactor position array access in `d_menu_cloth` to use `getPos()` result for better clarity and maintainability.

* Change `waveFreqX` and `waveFreqY` types from `u16` to `s16` in `d_menu_cloth` structure for consistency.

* Add demo version-specific mipmap handling logic in `d_menu_cloth` initialization.

* Remove demo version-specific mipmap handling logic in `d_menu_cloth` initialization.

* Match `cloth_move_sin` and `cloth_move_simple`.

* Refactor loop variable initialization in `d_menu_cloth` for improved clarity.

* Refactor variable names in alpha calculation for improved clarity in `d_menu_cloth`.

* Inline vertex index calculations in `d_menu_cloth` to simplify code and reduce redundant variables.

* Match `plot` and `plot_shadow`.

* Refactor `lightDistance` variable in `d_menu_cloth` for improved clarity.

* Inline empty destructor for `daCLOTH_HIO_c` in `d_menu_cloth` to simplify code.

* Match `plot` and `plot_shadow` in demo build.

* Update vertex attribute formats and streamline vertex function calls in `d_cloth_packet`.

* Match `cloth_init` for JP version

* Match `init` for JP version

* Match `draw` for JP version

* Add TODO note to identify superclass for correct size in `menu_cloth_class`.

* Match `d_menu_cloth` for specific regions: GZLJ01, GZLE01, GZLP01.

* Adjust `plot_shadow` parameters in `d_menu_cloth` for consistent shadow scaling.

* Add dummy functions to ensure correct float order in `d_menu_cloth`.

* Use version-specific scale values for `MENU_CLOTH_TYPE_DEFAULT` in `d_menu_cloth`.

* Normalize hex color and value formatting in `d_menu_cloth`.

* Add `STATIC_ASSERT` checks for struct size validation in `d_menu_cloth`.

* Rename ambiguous `field` members to `padding` in `d_menu_cloth` and update struct size.

* Replace `menu_cloth_class` size calculation with `sizeof(dMCloth_c)` in `d_menu_cloth`.

* Revert "Replace `menu_cloth_class` size calculation with `sizeof(dMCloth_c)` in `d_menu_cloth`."

This reverts commit 3920b07e1a.

* Revert "Rename ambiguous `field` members to `padding` in `d_menu_cloth` and update struct size."

This reverts commit 153ee490bf.

* Rename placeholder fields to `padding_*` in `d_menu_cloth` for clarity.

* Update `menu_cloth_class` size handling with `STATIC_ASSERT` and padding.

* Clarify comment for `dMenu_ClothMethodTable` initialization.

* Replace hardcoded offsets with calculated `INNER_SIZE`-based sizes in `d_menu_cloth`.

* Remove stray comments in `setClothType` definition and invocation.

* Annotate `mStatus` with offset comment in `dDlst_MENU_CAPTURE_c`.

* Replace `g_dComIfG_gameInfo.play` calls with `dComIfGp_` equivalents in `d_menu_window`.
2026-03-11 23:54:58 -04:00
2025-08-22 13:43:47 -04:00
2023-09-10 00:48:55 -04:00
2026-03-11 23:54:58 -04:00
2026-03-11 23:54:58 -04:00
2025-05-19 19:32:23 -04:00
2026-03-11 23:54:58 -04: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-03-11 23:54:58 -04: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 50 MiB
Languages
C++ 89.4%
C 8.9%
Python 1%
Pawn 0.6%
Pascal 0.1%