Tom Overton 527c54b66e Obj_Tokeidai (Clock Tower) OK and mostly documented (#442)
* Migrate data to C

* ObjTokeidai_Init OK

* ObjTokeidai_Destroy OK

* func_80AB2BBC OK

* func_80AB3BB0 OK

* func_80AB29F8 OK

* func_80AB27B4 OK

* func_80AB2834 OK

* func_80AB2790 OK

* func_80AB28C8 OK

* ObjTokeidai_Update OK

* func_80AB4040 OK

* func_80AB3010 OK

* func_80AB3CCC OK

* func_80AB3240 OK

* func_80AB3C50 OK

* func_80AB4080 OK

* func_80AB4160 OK

* func_80AB319C OK

* func_80AB3BE8 OK

* func_80AB3BD8 OK

* func_80AB3B34 OK

* func_80AB3A7C OK

* func_80AB3ED0 OK

* func_80AB39BC OK

* func_80AB38B0 OK

* func_80AB3880 OK

* func_80AB363C OK

* func_80AB36C4 OK

* func_80AB3808 OK

* func_80AB365C OK

* func_80AB3598 OK

* func_80AB3544 OK

* func_80AB34CC OK

* func_80AB3370 OK

* func_80AB32F0 OK

* ObjTokeidai_Draw OK

* func_80AB4894 OK

* func_80AB4664 OK

* func_80AB4394 OK

* Use compiled reloc

* Initial documentation pass

* Little more documentation

* Last bit of first pass documentation

* Finish documentation

* Respond to review feedback

* Respond to Anghelo's feedback

* Incorporate new enum

* Respond to engineer's feedback

* Respond to engineer's feedback

* Update comments because the things I thought were unused ARE actually used

* Switch to using "Open" instead of "Transform"

* Run ./format.sh

* Respond to engineer + hensldm by removing some macros

* Fix func_801A3F54 argument

* Fix func_801A3F54 argument

Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>

* This is a legacy PR, so using autogenned object symbols

* Move enum to .c

* Revert "Move enum to .c"

This reverts commit de13c50f0a.

* Move tokeidai-specific defines to .c

Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>
2021-12-28 02:10:15 +00:00
2021-05-20 21:06:30 -04:00
2021-12-28 01:44:27 +00:00
2021-12-28 01:07:41 +00:00
2020-07-24 19:57:54 -04:00
2020-07-24 19:57:54 -04:00
2021-12-28 01:07:41 +00:00
2021-05-18 18:39:08 -04:00
2021-05-18 22:21:14 -04:00
2021-12-28 01:07:41 +00:00
2021-08-03 23:21:31 -04:00
2020-09-13 21:09:13 -04:00
2021-12-28 01:07:41 +00:00
2021-12-28 01:07:41 +00:00
2021-12-28 01:07:41 +00:00
2021-09-21 18:09:14 -04:00

Legend of Zelda: Majora's Mask (US) 1.0

Build Status Decompilation Progress Contributors Discord Channel

- WARNING! -

The ROM this repository builds while has a matching checksum cannot be 'shifted' due
to hardcoded pointers which have yet to be dumped. Thus this repository is currently
in an experimental and research phase and cannot currently be used traditionally as a
source code base for general changes.

This is a WIP decompilation of The Legend of Zelda: Majora's Mask. The purpose of the project is to recreate a source code base for the game from scratch, using information found inside the game along with static and/or dynamic analysis. It is not producing a PC port. For more information you can get in touch with the team on our Discord server.

The only build currently supported is N64 US, but other versions are planned to be supported.

It currently builds the following ROM:

  • mm.us.rev1.rom.z64 md5: 2a0a8acb61538235bc1094d297fb6556

This repo does not include any assets or assembly code necessary for compiling the ROM. A prior copy of the game is required to extract the required assets.

Please refer to the following for more information:

Installation

Windows

For Windows 10, install WSL and a distribution by following this Windows Subsystem for Linux Installation Guide. We recommend using Debian or Ubuntu 20.04 Linux distributions.

MacOS

Preparation is covered in a separate document.

Linux (Native or under WSL / VM)

1. Install build dependencies

The build process has the following package requirements:

  • make
  • git
  • build-essential
  • binutils-mips-linux-gnu
  • python3
  • pip3
  • libpng-dev

Under Debian / Ubuntu (which we recommend using), you can install them with the following commands:

sudo apt update
sudo apt install make git build-essential binutils-mips-linux-gnu python3 python3-pip libpng-dev

To install the Python dependencies simply run in a terminal:

python3 -m pip install -r requirements.txt

2. Fork the repository

Create your own fork of the repository at https://github.com/zeldaret/mm. Then clone your fork where you wish to have the project, with the command:

git clone https://github.com/<YOUR_USERNAME>/mm.git

3. Prepare a base ROM

Copy your ROM to inside the root of this new project directory, and rename the file of the baserom to reflect the version of ROM you are using. ex: baserom.mm.us.rev1.z64

4. Make and Build the ROM

To start the extraction/build process, run the following command:

make init

This will extract all the individual files in the ROM into a newly created baserom folder, as well as decompress the compressed files in a newly created decomp folder. This will create the build folders as well as a new folder with the ASM as well as containing the disassemblies of nearly all the files containing code.

This make target will also build the ROM. If all goes well, a new ROM called "mm.us.rev1.rom.z64" should be built and the following text should be printed:

mm.us.rev1.rom.z64: OK

If you instead see the following:

mm.us.rev1.rom.z64: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

This means that something is wrong with the ROM's contents. Either the baserom files are incorrect due to a bad ROM, or some of the code is not matching.

Running make init will also make the ./expected directory and copy all of the files there, which will be useful when running the diff script. The diff script is useful in decompiling functions and can be ran with this command: ./tools/asm-differ/diff.py -wmo3 <insert_function_here>

Note: to speed up the build, you can pass -jN to make setup and make, where N is the number of threads to use in the build, e.g. make -j4. The generally-accepted wisdom is to use the number of virtual cores your computer has, which is the output of nproc (which should be installed as part of coreutils). The disadvantage that the ordering of the terminal output is scrambled, so for debugging it is best to stick to one thread (i.e. not pass -jN). (-j also exists, which uses unlimited jobs, but is generally slower.)

Contributing

All contributions are welcome. This is a group effort, and even small contributions can make a difference. Some tasks also don't require much knowledge to get started.

Please note that is is our strict policy that Anyone who wishes to contribute to the OOT or MM projects must not have accessed leaked source code at any point in time for Nintendo 64 SDK, iQue player SDK, libultra, Ocarina of Time, Majora's Mask, Animal Crossing/Animal Forest, or any other game that shares the same game engine or significant portions of code to a Zelda 64 game or any other console similar to the Nintendo 64.

Most discussions happen on our Discord Server, where you are welcome to ask if you need help getting started, or if you have any questions regarding this project and other decompilation projects.

For more information on getting started, see our Contributing Guide and our Code Review Guidelines to see what code quality guidelines we follow.

FAQ

Q: Why does MM use transient assembly?

A: It is the view of the MM project leads that transient asm is safer than storing the disassembly in the repo. We feel like the C code is more transformative than a straight disassembly.

S
Description
No description provided
Readme 251 MiB
Languages
C 87.3%
gas 5.2%
Python 3.9%
C++ 3%
Assembly 0.3%
Other 0.2%