Code Monkey home page Code Monkey logo

mm's Introduction

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

Build Status Decompilation Progress Contributors Discord Channel

- WARNING! -

This repository is a work in progress, and while it can be used to make certain changes, it's 
still constantly evolving. If you wish to use it for modding purposes in its current state,
please be aware that the codebase could drastically change at any time. Also note that some
parts of the ROM may not be 'shiftable' yet, so modifying them could currently be difficult.

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, and will not, produce a PC port. For frequently asked questions, you can visit our website, and for more information you can get in touch with the team on our Discord server.

The only version currently supported is N64 US, but we intend to eventually support every retail version of the original game (i.e. not versions of MM3D, which is a totally different game).

It currently builds the following ROM and compressed ROM:

  • mm-n64-us.z64 md5: f46493eaa0628827dbd6ad3ecd8d65d6
  • mm-n64-us-compressed.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.

Docker

Preparation is covered in Building Docker.

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
  • python3-pip
  • python3-venv
  • 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 python3-venv libpng-dev

2. Clone 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

This will copy the GitHub repository contents into a new folder in the current directory called mm. Change into this directory before doing anything else:

cd mm

3. Prepare a base ROM

Place a copy of the US ROM inside the baseroms/n64-us/ folder.

Rename the file to baserom.z64, baserom.n64 or baserom.v64, depending on the original extension.

4. Make and Build the ROM

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

make init

The extraction/build process:

  1. Prepares build environment:
    • Creates a Python virtual environment
    • Downloads necessary tools from pip
    • Compiles tools for the build process
  2. Extracts ROM contents:
    • Decompresses the ROM
    • Extracts individual files
    • Extracts archive files
  3. Extracts assets:
    • Extracts assets based on the XML files found in assets/xml
  4. Disassembles code:
    • Disassembles code-containing files
    • Disassembles data (data, rodata, and bss)
  5. Builds the ROM:
    • Compiles the code and assets into a new ROM
    • Generates a compressed version of the ROM

If all goes well, the new ROM should be built at build/n64-us/mm-n64-us.z64, a compressed version generated at build/n64-us/mm-n64-us-compressed.z64, and the following text printed:

build/n64-us/mm-n64-us.z64: OK

and

build/n64-us/mm-n64-us-compressed.z64: OK

If you instead see the following:

build/n64-us/mm-n64-us.z64: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

or

build/n64-us/mm-n64-us-compressed.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 run 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 work also doesn'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 or ZeldaRET's other decompilation projects.

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

mm's People

Contributors

angheloalf avatar archez avatar chloebangbang avatar ellipticellipsis avatar engineer124 avatar hack-nuss avatar hensldm avatar isghj5 avatar jpburnett avatar kelebek1 avatar kenix3 avatar kyleburnette avatar louist103 avatar ltperiwinkle avatar maxbartlett avatar megaidk avatar mzxrules avatar ordlucas avatar petrie911 avatar pocable avatar retro-git avatar rozelette avatar rylieb avatar shawlucas avatar sonicdcer avatar stickythwomp avatar thar0 avatar tom-overton avatar zbanks avatar zelllll avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mm's Issues

Reduce compile time warnings.

We should fix up the code to remove as many compiler warnings as possible while still keeping OK.

Further, we should implement something like this PR for OOT until we are ready to elevate warnings to errors.
zeldaret/oot#768

Add contributing documentation to the MM repo.

  • readme.md - High level overview, building, and getting started.
    • High level overview
    • Preparing baserom
    • How to set up the repo
    • How to build the repo
    • Day to day workflow (diff.py and maybe symbol rename)
  • contributing.md - Contributor's guidelines
    • How to submit a PRs
    • How to respond to reviewer comments
    • Documentation rules
    • Style and naming schemes
    • Build warnings
    • Updating trello cards
  • reviewing.md - What to do when reviewing code.
    • When reviewing other people's code please follow the checklist.
    • When someone addresses all of your comments you should approve the changes.
    • If someone does not address your comments and expresses that a different way is better than yours, look for feedback from other contributors. The project lead will have final say in these situations, but the decisions will generally be guided by a consensus of contributors.
    • Reviewer checklist. This is mostly the same as contributor submission checklist.
      • format.sh was run.
      • Files with NON_MATCHING functions are equivalent.
      • make builds a matching ROM (jenkins)
      • Any new compiler warnings that were added are required for matching (check the file that stores warnings)
      • Comments and variables have correct spelling.
      • code and boot segment files are documented. Overlays with documentation are complete.
        • Overlays with documentation are required to have macros to define access to parameters if the parameter uses bitwise access. The params should have an enum otherwise.
      • The following fields are declared in an Actor header file.
        • Main Actor struct
        • Extern'd initVar data.
        • Types used in the actor struct. Specific example would be actionFunc typedefs.
        • Param field macros and/or enums.
        • We have proof that enum/struct/define is needed in another file.
      • New variables & functions should follow standard naming conventions.
        • Constants converted to whichever looks best in context: hexadecimal, decimal, or float
          • Rotation angles should always be in hexadecimal
        • Functions, structs, unions, enums, and typedefs are TitleCase (DmRavine)
          • "Methods" for objects separate the system from the verb with an underscore (DmRavine_Init)
        • Variable names are camelCase (actionFunc)
          • Global variables start with g (gSaveContext)
          • Static global variables start with s (sSphereInit)
        • Macros and enum constants are SCREAMING_SNAKE_CASE (DM_RAVINE_STATE_ACTIVE)
        • Trailing commas in array and struct definitions (see EnJcMatoDamageTable)
  • tools.md - description and how to use for the various manually run tools in the repository (diff.py, regconvert, permuter, etc)
    • Regconvert
    • Gfxdis
    • How to add new warnings
    • Diff.py
    • Permuter
    • fixle.sh
    • format.sh
    • mips_to_c
    • gen_mips_to_c_context.py
    • ichaindis.py
    • colliderinit.py
    • actor_symbols.py
    • TODO: Any other tools need documentation?
  • tutorial.md - table of contents for the decompilation tutorial.

Decide how to treat rom addresses, segmented addresses, physical addresses, etc

There has been the never ending discussion of how we should treat the various type of addresses that do not point to vram (ie, can't be derefernced directly).

Currently we use the void* type for holding vram pointers in struct members, temps, function parameters, etc. And cast them to uintptr_t when we need to do arithmetic on them.

We may want to have a distinction for the other numerical addresses.

  • Rom address. Personally I would like to propose a RomOffset type, which would be the uintptr_t equivalent for rom addresses, allowing to represent this type, differentiate it from virtual addresses and allow arithmetic on them.
  • Segmented address. @EllipticEllipsis brought up this possibility.
  • Physical address. Isn't this the same as a rom address? ๐Ÿค”

Rename `PlayerAgeProperties`

The PlayerAgeProperties name is a holdover from the OoT decomp project because it is used for the two ages in OoT, but it is used for each transformation (and Kafei) in MM.

It would be nice if we could rename it to something that better reflects what it represents in MM. We should also consider if we want to keep the name synced with OoT.

Currently there are two possible options:

  • PlayerTransformationProperties
  • PlayerFormProperties

Massage Actor entry point functions

Structs to rename

  • GameState -> Game
  • GlobalContext -> GamePlay

Variable names for Game will be game where possible.
Variable names for GamePlay will be play where possible.

Actor this variables will be renamed to self. These are the derived class actor structs.
Actor thisx variables will be called super or maybe actor. These are the based class actor structs.

Actor constructor/destructor/update/draw methods will be changed to accept the Game base state rather than the GamePlay/GlobalContext derived class.

Rebase and Force-push

hi, been a lurker of this project for a while, and i have noticed that "Please don't rebase and force-push: it makes it harder to review since GitHub loses all the comments and it's hard to see what's actually changed." or something along those lines as had to be say more than once(here and on the ocarina), wouldn't it be appropriate then to add this warning on the "Contributing" section of README.md?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.