catchup 1

This commit is contained in:
petrie911
2023-01-21 12:12:55 -06:00
2743 changed files with 394475 additions and 148365 deletions
+5 -1
View File
@@ -1,5 +1,9 @@
Checks: '-*,readability-braces-around-statements'
Checks: '-*,readability-braces-around-statements,readability-inconsistent-declaration-parameter-name'
WarningsAsErrors: ''
HeaderFilterRegex: '(src|include)\/.*\.h$'
FormatStyle: 'file'
CheckOptions:
# Require argument names to match exactly (instead of allowing a name to be a prefix/suffix of another)
# Note: 'true' is expected by clang-tidy 12+ but '1' is used for compatibility with older versions
- key: readability-inconsistent-declaration-parameter-name.Strict
value: 1
-9
View File
@@ -1,9 +0,0 @@
Before opening this PR, ensure the following:
- `./format.sh` was run to apply standard formatting.
- `make` successfully builds a matching ROM.
- No new compiler warnings were introduced during the build process.
- Can be verified locally by running `tools/warnings_count/check_new_warnings.sh`
- New variables & functions should follow standard naming conventions.
- Comments and variables have correct spelling.
---
<!-- Leave the text above intact. Add additional comments below. -->
+12
View File
@@ -10,9 +10,11 @@ __pycache__/
CMakeLists.txt
cmake-build-debug
venv/
tags
# Project-specific ignores
*.z64
*.sra
*.bin
*.elf
archive/
@@ -31,6 +33,10 @@ tools/qemu-mips
tools/ido_recomp/* binary
ctx.c
graphs/
*.c.m2c
tools/**/*dSYM/
tools/decomp-permuter/
tools/mips_to_c/
# Assets
*.png
@@ -38,5 +44,11 @@ graphs/
!*_custom*
.extracted-assets.json
# Docs
!docs/**/*.png
docs/doxygen/
!.vscode/extensions.json
# Per-user configuration
.python-version
.make_options
-162
View File
@@ -1,162 +0,0 @@
Contributing to the Majora's Mask Decompilation Project
=======================================================
Thanks for helping us reverse engineer *The Legend of Zelda: Majora's Mask* for the N64!
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.
This document is meant to be a set of tips and guidelines for contributing to the project.
For general information about the project, see [our readme](https://github.com/zeldaret/mm/blob/master/README.md).
Most discussions happen on our [Discord Server](https://discord.zelda64.dev) 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.
Useful Links
------------
- [Discord](https://discord.zelda64.dev/) - Primary discussion platform.
- [Trello board](https://trello.com/b/ruxw9n6m/majoras-mask-decompilation) - We use this to track decompilation progress, not GitHub Issues.
- [Installation guide](https://github.com/zeldaret/mm/blob/master/README.md#installation) - Instructions for getting this repository set up and built on your machine.
- [Code Review Guidelines](REVIEWING.md) - These are the guidelines that reviewers will be using when reviewing your code. Good to be familiar with these before submitting your code.
- [Zelda 64 Reverse Engineering Website](https://zelda64.dev/) - Our homepage, with links to other resources.
- [Introduction to OOT decomp](https://github.com/zeldaret/oot/blob/master/docs/tutorial/contents.md) - A very detailed tutorial on how to get started with decomp. For OOT, but largely applicable to MM as well.
- The `#resources` channel on the Discord contains many more links
Getting Started
---------------
### What should I know to take part?
Basic knowledge of C, particularly arrays and pointers, is extremely useful. Knowledge of MIPS is not required initially, you can pick it up as you work through some decompilation.
You should be familiar with using git and GitHub. There are a number of tutorials available online, [such as this one](https://github.com/firstcontributions/first-contributions) which can help you get started.
The most useful knowledge to have is a general understanding of how the game works. An afternoon of constructive mucking about in the [OOT Practice Rom](http://practicerom.com/) (aka GZ) or the [MM Practice Rom](https://kz.zeldacodes.org/) (aka KZ) will be very beneficial if you have not looked at either of the N64 Zelda's internals before.
The [OOT Decompilation Project](https://github.com/zeldaret/oot) is farther along than this project, so it can also be a great resource.
This project only uses *publicly available code*.
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.
### Environment Setup
Get started by following the [installation guide in the readme](https://github.com/zeldaret/mm/blob/master/README.md#installation).
You should be able to build a matching ROM before you start making any changes.
### First Contribution
Usually, the best place to get started is to decompile an actor overlay.
An *actor* is any thing in the game that moves or performs actions or interactions. This includes things like Link, enemies, NPCs, doors, pots, etc.
You should [join the Discord](https://discord.zelda64.dev/) to say hello and get suggestions on where to start on the `#mm-decomp` channel.
We track who is working on what on the [Trello board](https://trello.com/b/ruxw9n6m/majoras-mask-decompilation).
After joining the Discord, ask to be added to the Trello board so you can claim your code file and avoid duplicate work. You may need to add a card if a card for your file does not currently exist.
The work flow is: Reserve a file, decompile it, submit a PR, and then repeat while addressing review comments. The expectation is that one reservation goes to one file which ends up in a one file PR.
Please note that unless it is communicated beforehand you will be expected to fully complete the file if you reserve it on Trello. Exceptions are always easy to approve if it's communicated to the team. Real life circumstances can prevent someone from finishing. In these cases they should link their repo/branch in the trello and unreserve immediately. Communicate any issues with your reservations as early as possible.
Style Guide & Conventions
-------------------------
Most of the C formatting style is enforced by the `format.sh` script which is based on `clang-format`.
Running `./format.sh` will apply our standard style to all `.c` files in the repository.
There are some conventions that cannot be automatically enforced.
### Naming Scheme
The following overlays are good examples of our naming conventions:
- [`ovl_Dm_Ravine`](src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.c)
- [`ovl_En_Jc_Mato`](src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c)
These files demonstrate the following:
- Word order in names are from least-to-most specific (`DM_RAVINE_STATE_ACTIVE`, not `DM_RAVINE_ACTIVE_STATE`)
- Functions, structs, unions, enums, and typedefs are `TitleCase` (`DmRavine`)
- "Methods" for objects separate the object 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`)
- Public structs, enums, and constants should be defined in the header file in the following cases:
- The primary `Actor` struct (`DmRavine`)
- The actor's `InitVars`, as an `extern` symbol (`Dm_Ravine_InitVars`)
- Types used in other public declarations, like `actionFunc` typedefs (`DmRavineActionFunc`)
- Macros and enums for accessing & setting actor `params`
- The struct/enum/define is needed by other files
- Trailing commas in array and struct definitions (see `EnJcMatoDamageTable`)
- Constants converted to whichever looks best in context: hexadecimal, decimal, or float
- Rotation angles should always be in hexadecimal
- Define macros for bitwise access to `actor->params`
### `NON_MATCHING` & `NON_EQUIVALENT`
If you make significant progress on decompiling a function, but can't get it to match perfectly, you can use a `NON_MATCHING` block to commit your code but have it excluded from the build, like so:
```c
#ifdef NON_MATCHING
void CollisionCheck_SpawnWaterDroplets(GlobalContext* globalCtx, Vec3f* v) {
// ...
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_collision_check/CollisionCheck_SpawnWaterDroplets.s")
#endif
```
Before using `NON_MATCHING`, first try to use the [decomp-permuter](tools/decomp-permuter) tool to find a closer match.
`NON_EQUIVALENT` can be used with the same syntax as `NON_MATCHING`, but it is used to mark sections of code which do not match *and* do not have the same behavior as the original code.
### Matching vs. Documenting
Usually, the first step of decompiling a section of code is to get it *matching*: to produce a C version of the code that can be compiled into an identical ROM.
However, the goal of this project is to produce a codebase that can be understood and modified.
So, beyond producing matching C code, the next steps are *documenting* the code.
Documenting is more than just adding comments. Documenting also includes:
- Renaming functions, variables, and struct members
- Using (or adding) constants, enums, and macros when possible
- Explaining sections of code that are not straightforward
Overlays are not required to be documented at this time, but `code/` and `boot/` should be documented. When documentation on a file has been started it should be as complete as possible.
For right now, object segment symbols should not be documented/renamed.
These will be given names when object reconstruction is ready.
However, it can be useful to add comments with name suggestions.
Pull Requests (PRs)
-------------------
### Checklist
Before opening a PR, walk through the following steps to ensure that your code conforms to the style guide and conventions.
- `./format.sh` was run to apply standard formatting.
- `make` successfully builds a matching ROM.
- No new compiler warnings were introduced during the build process.
- Can be verified locally by running `tools/warnings_count/check_new_warnings.sh`
- New variables & functions should follow standard naming conventions.
- Comments and variables have correct spelling.
Feel free to reach out on the Discord if you have any questions about these steps or encounter any issues.
### Pull Request Process
After opening a PR, the Jenkins server will verify your changes.
If there is an error, double-check that you can successfully `make clean && make` locally. If the build is OK, the next thing to check is that all added/modified files were `git add`-ed to your commit. The final check before posting on Discord for help is that there are no new warnings added to the code causing Jenkins to fail. You can check this by running: `tools/warnings_count/check_new_warnings.sh`.
Each PR needs a review from one reviewer and the project lead.
The PR author marks the comments as resolved: the commenter may not have permissions to do so.
Once all comments are addressed, it is courteous to ping the reviewer on either Discord or GitHub via re-requesting a review.
After all the comments are addressed and at least one contributor has approved the review, the project lead can then review and merge the code.
The project lead is also responsible for ensuring that all of these procedures are followed.
Throughout the PR process, you (the author) should update the card on [Trello board](https://trello.com/b/ruxw9n6m/majoras-mask-decompilation) with the appropriate column and labels.
+42
View File
@@ -0,0 +1,42 @@
FROM ubuntu:22.04 as build
ENV TZ=UTC
# Install Required Dependencies
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
apt-get update && apt-get install -y \
curl \
build-essential \
binutils-mips-linux-gnu \
pkg-config \
python3 \
python3-pip \
git \
wget \
unzip \
vbindiff \
vim \
clang-tidy-11 \
clang-format-11 \
libpng-dev && \
apt clean && \
rm -rf /var/lib/apt/lists/*
# Install practicerom
RUN curl https://practicerom.com/public/packages/debian/pgp.pub | \
apt-key add - && echo deb http://practicerom.com/public/packages/debian staging main >/etc/apt/sources.list.d/practicerom.list && apt update
RUN apt-get install -y practicerom-dev
COPY requirements.txt requirements.txt
RUN python3 -m pip install --no-cache-dir -r requirements.txt
ENV LANG C.UTF-8
RUN mkdir /mm
WORKDIR /mm
RUN git config --global --add safe.directory /mm
ENTRYPOINT ["/bin/bash", "-c"]
Vendored
+56 -11
View File
@@ -3,7 +3,29 @@ pipeline {
label 'mm'
}
options {
ansiColor('xterm')
}
stages {
stage('Check formatting') {
steps {
echo 'Checking formatting...'
sh 'bash -c "tools/check_format.sh 2>&1 >(tee tools/check_format.txt)"'
}
}
stage('Check relocs') {
steps {
echo 'Checking relocs on spec...'
sh 'bash -c "tools/reloc_spec_check.sh"'
}
}
stage('Install Python dependencies') {
steps {
echo 'Installing Python dependencies'
sh 'python3 -m pip install -r requirements.txt'
}
}
stage('Copy ROM') {
steps {
echo 'Setting up ROM...'
@@ -17,7 +39,17 @@ pipeline {
}
stage('Check setup warnings') {
steps {
sh 'python3 tools/warnings_count/compare_warnings.py tools/warnings_count/warnings_setup_current.txt tools/warnings_count/warnings_setup_new.txt'
sh 'bash -c "./tools/warnings_count/compare_warnings.sh setup"'
}
}
stage('Assets') {
steps {
sh 'bash -c "make -j assets 2> >(tee tools/warnings_count/warnings_assets_new.txt)"'
}
}
stage('Check assets warnings') {
steps {
sh 'bash -c "./tools/warnings_count/compare_warnings.sh assets"'
}
}
stage('Disasm') {
@@ -27,17 +59,27 @@ pipeline {
}
stage('Check disasm warnings') {
steps {
sh 'python3 tools/warnings_count/compare_warnings.py tools/warnings_count/warnings_disasm_current.txt tools/warnings_count/warnings_disasm_new.txt'
sh 'bash -c "./tools/warnings_count/compare_warnings.sh disasm"'
}
}
stage('Build') {
steps {
sh 'bash -c "make -j all 2> >(tee tools/warnings_count/warnings_build_new.txt)"'
sh 'bash -c "make -j uncompressed 2> >(tee tools/warnings_count/warnings_build_new.txt)"'
}
}
stage('Check build warnings') {
steps {
sh 'python3 tools/warnings_count/compare_warnings.py tools/warnings_count/warnings_build_current.txt tools/warnings_count/warnings_build_new.txt'
sh 'bash -c "./tools/warnings_count/compare_warnings.sh build"'
}
}
stage('Compress') {
steps {
sh 'bash -c "make -j compressed 2> >(tee tools/warnings_count/warnings_compress_new.txt)"'
}
}
stage('Check compress warnings') {
steps {
sh 'bash -c "./tools/warnings_count/compare_warnings.sh compress"'
}
}
stage('Report Progress') {
@@ -46,9 +88,9 @@ pipeline {
}
steps {
sh 'mkdir reports'
sh 'python3 ./tools/progress.py csv >> reports/progress_mm.us.rev1.csv'
sh 'python3 ./tools/progress.py csv -m >> reports/progress_matching_mm.us.rev1.csv'
sh 'python3 ./tools/progress.py shield-json > reports/progress_shield_mm.us.rev1.json'
sh 'python3 ./tools/progress.py csv >> reports/progress-mm-nonmatching.csv'
sh 'python3 ./tools/progress.py csv -m >> reports/progress-mm-matching.csv'
sh 'python3 ./tools/progress.py shield-json > reports/progress-mm-shield.json'
stash includes: 'reports/*', name: 'reports'
}
}
@@ -57,17 +99,20 @@ pipeline {
branch 'master'
}
agent{
label 'master'
label 'zeldaret_website'
}
steps {
unstash 'reports'
sh 'cat reports/progress_mm.us.rev1.csv >> /var/www/html/reports/progress_mm.us.rev1.csv'
sh 'cat reports/progress_matching_mm.us.rev1.csv >> /var/www/html/reports/progress_matching_mm.us.rev1.csv'
sh 'cat reports/progress_shield_mm.us.rev1.json > /var/www/html/reports/progress_shield_mm.us.rev1.json'
sh 'cat reports/progress-mm-nonmatching.csv >> /var/www/zelda64.dev/assets/csv/progress-mm-nonmatching.csv'
sh 'cat reports/progress-mm-matching.csv >> /var/www/zelda64.dev/assets/csv/progress-mm-matching.csv'
sh 'cat reports/progress-mm-shield.json > /var/www/zelda64.dev/assets/csv/progress-mm-shield.json'
}
}
}
post {
failure {
sh 'cat tools/check_format.txt tools/warnings_count/warnings_setup_new.txt tools/warnings_count/warnings_disasm_new.txt tools/warnings_count/warnings_build_new.txt'
}
always {
cleanWs()
}
+161 -61
View File
@@ -1,6 +1,11 @@
# Build options can be changed by modifying the makefile or by building with 'make SETTING=value'.
# It is also possible to override the settings in Defaults in a file called .make_options as 'SETTING=value'.
-include .make_options
MAKEFLAGS += --no-builtin-rules
# Build options can either be changed by modifying the makefile, or by building with 'make SETTING=value'
#### Defaults ####
# If COMPARE is 1, check the output md5sum after building
COMPARE ?= 1
@@ -8,6 +13,23 @@ COMPARE ?= 1
NON_MATCHING ?= 0
# If ORIG_COMPILER is 1, compile with QEMU_IRIX and the original compiler
ORIG_COMPILER ?= 0
# if WERROR is 1, pass -Werror to CC_CHECK, so warnings would be treated as errors
WERROR ?= 0
# Keep .mdebug section in build
KEEP_MDEBUG ?= 0
# Disassembles all asm from the ROM instead of skipping files which are entirely in C
FULL_DISASM ?= 0
# Check code syntax with host compiler
RUN_CC_CHECK ?= 1
# Dump build object files
OBJDUMP_BUILD ?= 0
# Number of threads to disassmble, extract, and compress with
N_THREADS ?= $(shell nproc)
#### Setup ####
# Ensure the map file being created using English localization
export LANG := C
ifeq ($(NON_MATCHING),1)
CFLAGS := -DNON_MATCHING
@@ -15,6 +37,11 @@ ifeq ($(NON_MATCHING),1)
COMPARE := 0
endif
DISASM_FLAGS := --reg-names=o32
ifneq ($(FULL_DISASM), 0)
DISASM_FLAGS += --all
endif
PROJECT_DIR := $(dir $(realpath $(firstword $(MAKEFILE_LIST))))
MAKE = make
@@ -34,14 +61,8 @@ else
endif
endif
# Threads to compress and extract assets with, TODO improve later
ifeq ($(DETECTED_OS),linux)
N_THREADS ?= $(shell nproc)
else
N_THREADS ?= 1
endif
#### Tools ####
ifeq ($(shell type mips-linux-gnu-ld >/dev/null 2>/dev/null; echo $$?), 0)
MIPS_BINUTILS_PREFIX := mips-linux-gnu-
else
@@ -67,32 +88,68 @@ AS := $(MIPS_BINUTILS_PREFIX)as
LD := $(MIPS_BINUTILS_PREFIX)ld
OBJCOPY := $(MIPS_BINUTILS_PREFIX)objcopy
OBJDUMP := $(MIPS_BINUTILS_PREFIX)objdump
ASM_PROC := python3 tools/asm-processor/build.py
ASM_PROC_FLAGS := --input-enc=utf-8 --output-enc=euc-jp
IINC := -Iinclude -Isrc -Iassets -Ibuild -I.
ifeq ($(KEEP_MDEBUG),0)
RM_MDEBUG = $(OBJCOPY) --remove-section .mdebug $@
else
RM_MDEBUG = @:
endif
# Check code syntax with host compiler
CHECK_WARNINGS := -Wall -Wextra -Wno-format-security -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-variable -Wno-missing-braces -Wno-int-conversion -Wno-unused-but-set-variable -Wno-unused-label
CC_CHECK := gcc -fno-builtin -fsyntax-only -fsigned-char -std=gnu90 -D _LANGUAGE_C -D NON_MATCHING -Iinclude -Isrc -Iassets -Ibuild -include stdarg.h $(CHECK_WARNINGS)
ifneq ($(RUN_CC_CHECK),0)
CHECK_WARNINGS := -Wall -Wextra -Wno-format-security -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-variable -Wno-missing-braces -Wno-int-conversion -Wno-unused-but-set-variable -Wno-unused-label
CC_CHECK := gcc -fno-builtin -fsyntax-only -funsigned-char -fdiagnostics-color -std=gnu89 -D _LANGUAGE_C -D NON_MATCHING $(IINC) -nostdinc $(CHECK_WARNINGS)
ifneq ($(WERROR), 0)
CC_CHECK += -Werror
endif
else
CC_CHECK := @:
endif
CPP := cpp
ELF2ROM := tools/buildtools/elf2rom
MKLDSCRIPT := tools/buildtools/mkldscript
YAZ0 := tools/buildtools/yaz0
ZAPD := tools/ZAPD/ZAPD.out
FADO := tools/fado/fado.elf
OPTFLAGS := -O2 -g3
ASFLAGS := -march=vr4300 -32 -Iinclude
MIPS_VERSION := -mips2
# we support Microsoft extensions such as anonymous structs, which the compiler does support but warns for their usage. Surpress the warnings with -woff.
CFLAGS += -G 0 -non_shared -Xfullwarn -Xcpluscomm -Iinclude -Isrc -Iassets -Ibuild -I. -Wab,-r4300_mul -woff 624,649,838,712
CFLAGS += -G 0 -non_shared -fullwarn -verbose -Xcpluscomm $(IINC) -nostdinc -Wab,-r4300_mul -woff 624,649,838,712,516
# Use relocations and abi fpr names in the dump
OBJDUMP_FLAGS := --disassemble --reloc --disassemble-zeroes -Mreg-names=32
ifneq ($(OBJDUMP_BUILD), 0)
OBJDUMP_CMD = $(OBJDUMP) $(OBJDUMP_FLAGS) $@ > $(@:.o=.s)
OBJCOPY_BIN = $(OBJCOPY) -O binary $@ $@.bin
else
OBJDUMP_CMD = @:
OBJCOPY_BIN = @:
endif
ifeq ($(shell getconf LONG_BIT), 32)
# Work around memory allocation bug in QEMU
export QEMU_GUEST_BASE := 1
else
else ifneq ($(RUN_CC_CHECK),0)
# Ensure that gcc treats the code as 32-bit
CC_CHECK += -m32
endif
# rom compression flags
COMPFLAGS := --threads $(N_THREADS)
ifneq ($(NON_MATCHING),1)
COMPFLAGS += --matching
endif
#### Files ####
# ROM image
@@ -107,28 +164,35 @@ $(shell mkdir -p asm data)
SRC_DIRS := $(shell find src -type d)
ASM_DIRS := $(shell find asm -type d -not -path "asm/non_matchings*") $(shell find data -type d)
ASSET_BIN_DIRS := $(shell find assets/* -type d -not -path "assets/xml*")
BASEROM_DIRS := $(shell find baserom -type d 2>/dev/null)
ASSET_C_FILES := $(shell find assets/ -type f -name "*.c")
ASSET_FILES_BIN := $(foreach dir,$(ASSET_BIN_DIRS),$(wildcard $(dir)/*.bin))
ASSET_FILES_OUT := $(foreach f,$(ASSET_FILES_BIN:.bin=.bin.inc.c),build/$f)
## Assets binaries (PNGs, JPGs, etc)
ASSET_BIN_DIRS := $(shell find assets/* -type d -not -path "assets/xml*")
# Prevents building C files that will be #include'd
ASSET_BIN_DIRS_C_FILES := $(shell find assets/* -type d -not -path "assets/xml*" -not -path "assets/code*" -not -path "assets/overlays*")
ASSET_FILES_XML := $(foreach dir,$(ASSET_BIN_DIRS),$(wildcard $(dir)/*.xml))
ASSET_FILES_BIN := $(foreach dir,$(ASSET_BIN_DIRS),$(wildcard $(dir)/*.bin))
ASSET_FILES_OUT := $(foreach f,$(ASSET_FILES_XML:.xml=.c),$f) \
$(foreach f,$(ASSET_FILES_BIN:.bin=.bin.inc.c),build/$f)
TEXTURE_FILES_PNG := $(foreach dir,$(ASSET_BIN_DIRS),$(wildcard $(dir)/*.png))
TEXTURE_FILES_JPG := $(foreach dir,$(ASSET_BIN_DIRS),$(wildcard $(dir)/*.jpg))
TEXTURE_FILES_OUT := $(foreach f,$(TEXTURE_FILES_PNG:.png=.inc.c),build/$f) \
$(foreach f,$(TEXTURE_FILES_JPG:.jpg=.jpg.inc.c),build/$f) \
C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c))
S_FILES := $(foreach dir,$(ASM_DIRS),$(wildcard $(dir)/*.s))
C_FILES := $(foreach dir,$(SRC_DIRS) $(ASSET_BIN_DIRS_C_FILES),$(wildcard $(dir)/*.c))
S_FILES := $(shell grep -F "build/asm" spec | sed 's/.*build\/// ; s/\.o\".*/.s/') \
$(shell grep -F "build/data" spec | sed 's/.*build\/// ; s/\.o\".*/.s/')
BASEROM_FILES := $(shell grep -F "build/baserom" spec | sed 's/.*build\/// ; s/\.o\".*//')
O_FILES := $(foreach f,$(S_FILES:.s=.o),build/$f) \
$(foreach f,$(wildcard baserom/*),build/$f.o) \
$(foreach f,$(C_FILES:.c=.o),build/$f) \
$(foreach f,$(ASSET_C_FILES:.c=.o),build/$f)
$(foreach f,$(BASEROM_FILES),build/$f.o)
OVL_RELOC_FILES := $(shell $(CPP) $(CPPFLAGS) $(SPEC) | grep -o '[^"]*_reloc.o' )
# Automatic dependency files
# (Only asm_processor dependencies are handled for now)
DEP_FILES := $(O_FILES:.o=.asmproc.d)
# (Only asm_processor dependencies and reloc dependencies are handled for now)
DEP_FILES := $(O_FILES:.o=.asmproc.d) $(OVL_RELOC_FILES:.o=.d)
# create build directories
$(shell mkdir -p build/baserom $(foreach dir,$(SRC_DIRS) $(ASM_DIRS) $(ASSET_BIN_DIRS),build/$(dir)))
@@ -143,29 +207,42 @@ build/src/libultra/io/%.o: OPTFLAGS := -O2
build/src/libultra/libc/%.o: OPTFLAGS := -O2
build/src/libultra/gu/%.o: OPTFLAGS := -O2
build/src/libultra/rmon/%.o: OPTFLAGS := -O2
build/src/libultra/flash/%.o: OPTFLAGS := -g
build/src/libultra/flash/%.o: MIPS_VERSION := -mips1
build/src/code/audio/%.o: OPTFLAGS := -O2
build/assets/%.o: OPTFLAGS := -O1
build/assets/%.o: ASM_PROC_FLAGS :=
# file flags
build/src/boot_O2_g3/fault.o: CFLAGS += -trapuv
build/src/boot_O2_g3/fault_drawer.o: CFLAGS += -trapuv
build/src/code/jpegutils.o: OPTFLAGS := -O2
build/src/code/jpegdecoder.o: OPTFLAGS := -O2
build/src/code/jpegutils.o: CC := $(CC_OLD)
build/src/code/jpegdecoder.o: CC := $(CC_OLD)
build/src/libultra/libc/ll.o: OPTFLAGS := -O1
build/src/libultra/libc/ll.o: MIPS_VERSION := -mips3 -32
build/src/libultra/libc/llcvt.o: OPTFLAGS := -O1
build/src/libultra/libc/llcvt.o: MIPS_VERSION := -mips3 -32
# cc & asm-processor
build/src/boot_O2/%.o: CC := python3 tools/asm-processor/build.py $(CC) -- $(AS) $(ASFLAGS) --
build/src/boot_O2_g3/%.o: CC := python3 tools/asm-processor/build.py $(CC) -- $(AS) $(ASFLAGS) --
build/src/boot_O2/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
build/src/boot_O2_g3/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
build/src/libultra/%.o: CC := python3 tools/asm-processor/build.py $(CC_OLD) -- $(AS) $(ASFLAGS) --
build/src/libultra/%.o: CC := $(CC_OLD)
# Needed at least until voice is decompiled
build/src/libultra/voice/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC_OLD) -- $(AS) $(ASFLAGS) --
build/src/code/%.o: CC := python3 tools/asm-processor/build.py $(CC) -- $(AS) $(ASFLAGS) --
build/src/code/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
build/src/code/audio/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
build/src/overlays/actors/%.o: CC := python3 tools/asm-processor/build.py $(CC) -- $(AS) $(ASFLAGS) --
build/src/overlays/effects/%.o: CC := python3 tools/asm-processor/build.py $(CC) -- $(AS) $(ASFLAGS) --
build/src/overlays/fbdemos/%.o: CC := python3 tools/asm-processor/build.py $(CC) -- $(AS) $(ASFLAGS) --
build/src/overlays/gamestates/%.o: CC := python3 tools/asm-processor/build.py $(CC) -- $(AS) $(ASFLAGS) --
build/src/overlays/kaleido_scope/%.o: CC := python3 tools/asm-processor/build.py $(CC) -- $(AS) $(ASFLAGS) --
build/src/overlays/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
build/assets/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
#### Main Targets ###
@@ -181,19 +258,30 @@ ifeq ($(COMPARE),1)
@md5sum -c checksum.md5
endif
.PHONY: all uncompressed compressed clean assetclean distclean disasm init setup
.PHONY: all uncompressed compressed clean assetclean distclean assets disasm init setup
.DEFAULT_GOAL := uncompressed
all: compressed
all: uncompressed compressed
$(ROM): $(ELF)
$(ELF2ROM) -cic 6105 $< $@
$(ROMC): uncompressed
python3 tools/z64compress_wrapper.py --mb 32 --matching --threads $(N_THREADS) $(ROM) $@ $(ELF) build/$(SPEC)
$(ROMC): $(ROM)
python3 tools/z64compress_wrapper.py $(COMPFLAGS) $(ROM) $@ $(ELF) build/$(SPEC)
$(ELF): $(TEXTURE_FILES_OUT) $(OVERLAY_RELOC_FILES) $(O_FILES) build/ldscript.txt build/undefined_syms.txt
$(ELF): $(TEXTURE_FILES_OUT) $(ASSET_FILES_OUT) $(O_FILES) $(OVL_RELOC_FILES) build/ldscript.txt build/undefined_syms.txt
$(LD) -T build/undefined_syms.txt -T build/ldscript.txt --no-check-sections --accept-unknown-input-arch --emit-relocs -Map build/mm.map -o $@
## Order-only prerequisites
# These ensure e.g. the O_FILES are built before the OVL_RELOC_FILES.
# The intermediate phony targets avoid quadratically-many dependencies between the targets and prerequisites.
o_files: $(O_FILES)
$(OVL_RELOC_FILES): | o_files
asset_files: $(TEXTURE_FILES_OUT) $(ASSET_FILES_OUT)
$(O_FILES): | asset_files
.PHONY: o_files asset_files
#### Main commands ####
@@ -215,14 +303,16 @@ setup:
$(MAKE) -C tools
python3 tools/fixbaserom.py
python3 tools/extract_baserom.py
python3 extract_assets.py -t $(N_THREADS)
assets:
python3 extract_assets.py -j $(N_THREADS)
## Assembly generation
disasm:
$(RM) -rf asm data
python3 tools/disasm/disasm.py
python3 tools/disasm/disasm.py -j $(N_THREADS) $(DISASM_FLAGS)
diff-init: all
diff-init: uncompressed
$(RM) -rf expected/
mkdir -p expected/
cp -r build expected/build
@@ -230,60 +320,70 @@ diff-init: all
init:
$(MAKE) distclean
$(MAKE) setup
$(MAKE) assets
$(MAKE) disasm
$(MAKE) all
$(MAKE) diff-init
build/assets/%.o: assets/%.c
$(CC) -I build/ -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
#### Various Recipes ####
build/undefined_syms.txt: undefined_syms.txt
$(CPP) $(CPPFLAGS) $< > build/undefined_syms.txt
build/ldscript.txt: $(SPEC)
$(CPP) $(CPPFLAGS) $< > build/spec
$(MKLDSCRIPT) build/spec $@
build/$(SPEC): $(SPEC)
$(CPP) $(CPPFLAGS) $< > $@
build/baserom/%.o: baserom/%
$(OBJCOPY) -I binary -O elf32-big $< $@
build/ldscript.txt: build/$(SPEC)
$(MKLDSCRIPT) $< $@
build/asm/%.o: asm/%.s
$(AS) $(ASFLAGS) $< -o $@
build/assets/%.o: assets/%.c
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
$(OBJCOPY_BIN)
$(RM_MDEBUG)
build/baserom/%.o: baserom/%
$(OBJCOPY) -I binary -O elf32-big $< $@
build/data/%.o: data/%.s
iconv --from UTF-8 --to EUC-JP $< | $(AS) $(ASFLAGS) -o $@
$(AS) $(ASFLAGS) $< -o $@
build/src/overlays/%.o: src/overlays/%.c
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
$(CC_CHECK) $<
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
@$(OBJDUMP) -d $@ > $(@:.o=.s)
# TODO: `() || true` is currently necessary to suppress `Error 1 (ignored)` make warnings caused by `test`, but this will go away if
# the following is moved to a separate rule that is only run once when all the required objects have been compiled.
$(ZAPD) bovl -eh -i $@ -cfg $< --outputpath $(@D)/$(notdir $(@D))_reloc.s
(test -f $(@D)/$(notdir $(@D))_reloc.s && $(AS) $(ASFLAGS) $(@D)/$(notdir $(@D))_reloc.s -o $(@D)/$(notdir $(@D))_reloc.o) || true
$(RM_MDEBUG)
build/src/overlays/%_reloc.o: build/$(SPEC)
$(FADO) $$(tools/buildtools/reloc_prereq $< $(notdir $*)) -n $(notdir $*) -o $(@:.o=.s) -M $(@:.o=.d)
$(AS) $(ASFLAGS) $(@:.o=.s) -o $@
build/src/%.o: src/%.c
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
$(CC_CHECK) $<
@$(OBJDUMP) -d $@ > $(@:.o=.s)
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
$(OBJDUMP_CMD)
$(RM_MDEBUG)
build/src/libultra/libc/ll.o: src/libultra/libc/ll.c
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
$(CC_CHECK) $<
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
python3 tools/set_o32abi_bit.py $@
@$(OBJDUMP) -d $@ > $(@:.o=.s)
$(OBJDUMP_CMD)
$(RM_MDEBUG)
build/src/libultra/libc/llcvt.o: src/libultra/libc/llcvt.c
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
$(CC_CHECK) $<
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
python3 tools/set_o32abi_bit.py $@
@$(OBJDUMP) -d $@ > $(@:.o=.s)
$(OBJDUMP_CMD)
$(RM_MDEBUG)
# Build C files from assets
build/%.inc.c: %.png
$(ZAPD) btex -eh -tt $(lastword ,$(subst ., ,$(basename $<))) -i $< -o $@
$(ZAPD) btex -eh -tt $(subst .,,$(suffix $*)) -i $< -o $@
build/assets/%.bin.inc.c: assets/%.bin
$(ZAPD) bblb -eh -i $< -o $@
+49 -42
View File
@@ -5,8 +5,8 @@
[jenkins]: https://jenkins.deco.mp/job/MM/job/master
[jenkins-badge]: https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fjenkins.deco.mp%2Fjob%2FMM%2Fjob%2Fmaster
[progress]: https://zelda64.dev/progress.html
[progress-badge]: https://img.shields.io/endpoint?url=https://zelda64.dev/reports/progress_shield_mm.us.rev1.json
[progress]: https://zelda64.dev/games/mm
[progress-badge]: https://img.shields.io/endpoint?url=https://zelda64.dev/assets/csv/progress-mm-shield.json
[contributors]: https://github.com/zeldaret/mm/graphs/contributors
[contributors-badge]: https://img.shields.io/github/contributors/zeldaret/mm
@@ -17,24 +17,27 @@
```diff
- 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 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 repo does not include any assets or code necessary for compiling the ROM. A prior copy of the game is required to extract the required assets.**
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](https://zelda64.dev/games/mm), and for more information you can get in touch with the team on our [Discord server](https://discord.zelda64.dev).
This is a decompilation of Legend of Zelda: Majora's Mask (US) 1.0
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:
It 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:
- [Website](https://zelda64.dev/)
- [Discord](https://discord.zelda64.dev/)
- [How to Contribute](CONTRIBUTING.md)
- [How to Contribute](docs/CONTRIBUTING.md)
## Installation
@@ -42,7 +45,15 @@ Please refer to the following for more information:
For Windows 10, install WSL and a distribution by following this
[Windows Subsystem for Linux Installation Guide](https://docs.microsoft.com/en-us/windows/wsl/install-win10).
We recommend using Debian or Ubuntu 18.04 Linux distributions.
We recommend using Debian or Ubuntu 20.04 Linux distributions.
### MacOS
Preparation is covered in a [separate document](docs/BUILDING_MACOS.md).
### Docker
Preparation is covered in [Building Docker](docs/BUILDING_DOCKER.md).
### Linux (Native or under WSL / VM)
@@ -65,13 +76,7 @@ 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:
```bash
python3 -m pip install -r requirements.txt
```
#### 2. Fork the repository
#### 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:
@@ -79,11 +84,27 @@ Create your own fork of the repository at `https://github.com/zeldaret/mm`. Then
git clone https://github.com/<YOUR_USERNAME>/mm.git
```
#### 3. Prepare a base ROM
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:
```bash
cd mm
```
#### 3. Install python dependencies
The build process has a few python packages required that are located in `requirements.txt`.
To install them simply run in a terminal:
```bash
python3 -m pip install -r requirements.txt
```
#### 4. 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
#### 5. Make and Build the ROM
To start the extraction/build process, run the following command:
@@ -108,33 +129,19 @@ 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>`
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 either:
* 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.
* Pass `-j` to `make setup` and `make`, to use as many threads as possible, but beware that this can use too much memory on lower-end systems.
Both of these have 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 `-j` or `-jN`).
**Note**: if you rename symbols, it is recommended that you use the `tools/rename_sym.sh` to ensure that you cover all instances, including the tables which are used to generate the `asm/` directory.
Usage: `tools/rename_sym.sh old_name new_name`. Example:
```bash
tools/rename_sym.sh func_808A3428 EnTorch2_UpdateIdle
```
**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.
Some work also doesn't require much knowledge to get started.
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.
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](https://discord.zelda64.dev), 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.
Most discussions happen on our [Discord Server](https://discord.zelda64.dev), 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](CONTRIBUTING.md) and our [Code Review Guidelines](REVIEWING.md) 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.
For more information on getting started, see our [Contributing Guide](docs/CONTRIBUTING.md), [Style Guide](docs/STYLE.md) and our [Code Review Guidelines](docs/REVIEWING.md) to see what code quality guidelines we follow.
-67
View File
@@ -1,67 +0,0 @@
Reviewing Pull Requests to the Majora's Mask Decompilation Project
=======================================================
Thanks for helping us reverse engineer *The Legend of Zelda: Majora's Mask* for the N64!
We invite all contributors to participate in our code review program. Every review submitted helps us keep code quality high and code merged in more quickly.
This document is meant to be a set of tips and guidelines for reviewers of pull requests to the project.
For general information about the project, see [our readme](https://github.com/zeldaret/mm/blob/master/README.md).
Most discussions happen on our [Discord Server](https://discord.zelda64.dev) 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.
Useful Links
------------
- [Discord](https://discord.zelda64.dev/) - Primary discussion platform.
- [Trello board](https://trello.com/b/ruxw9n6m/majoras-mask-decompilation) - We use this to track decompilation progress, not GitHub Issues.
- [Contributing guide](https://github.com/zeldaret/mm/blob/master/CONTRIBUTING.md) - Instructions for contributors.
- [Installation guide](https://github.com/zeldaret/mm/blob/master/README.md#installation) - Instructions for getting this repository set up and built on your machine.
- [Zelda 64 Reverse Engineering Website](https://zelda64.dev/) - Our homepage, with links to other resources.
- [Introduction to OOT decomp](https://github.com/zeldaret/oot/blob/master/docs/tutorial/contents.md) - A very detailed tutorial on how to get started with decomp. For OOT, but largely applicable to MM as well.
- The `#resources` channel on the Discord contains many more links
Getting Started
---------------
### What should I know to take part in the review process?
You should first get yourself familiar with our [Contributing guide](https://github.com/zeldaret/mm/blob/master/CONTRIBUTING.md). It is also recommended that you have already successfully submitted a merged pull request to understand how the process works before submitting a review.
Pull Requests (PRs)
------------
### How to review a Pull Request
- When reviewing a PR it is suggested that you follow the checklist outlined in this section.
- You are not required to check for all of the items in the checklist. It is meant as a guide.
- Once the PR author has addressed all of your comments, you should add a comment with approval to the PR to signify to the project leads that this PR has been through peer review.
- 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. All decisions will generally be guided by a consensus of contributors.
### Reviewer Checklist
- [ ] Jenkins build is successful.
- [ ] `make` builds a matching ROM.
- [ ] Any new compiler warnings that were added are required for matching. Ensure there is good reason if the warnings files have changed. `./tools/warnings_count/warnings_build_current.txt` and `./tools/warnings_count/warnings_setup_current.txt`
- [ ] Files with NON_MATCHING functions have equivalent behaviour. (This will only be reviewed once we have shiftability since equivalence testing is easiest in game)
- [ ] `code` and `boot` segment files should be documented as much as possible. Overlays with documentation should be complete.
- [ ] Overlays with documentation should have macros to define access to parameters if the parameter uses bitwise access. The params should have an enum when it makes sense.
- [ ] `format.sh` was run.
- [ ] Comments and variables have correct spelling.
- [ ] The following should be declared in an Actor header file. There should be nothing else in the 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.
- [ ] For any other additional `enum`/`struct`/`define`/`function`/`global`, there needs to be evidence it is needed in another file.
- [ ] New variables and functions should follow standard naming conventions.
- [ ] Constants are converted to whichever looks best in context: hexadecimal, decimal, or float
- [ ] Rotation angles should always be in hexadecimal
- [ ] Colour values should always be in decimal.
- [ ] 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`)
+29
View File
@@ -0,0 +1,29 @@
<Root>
<File Name="code" BaseAddress="0x800A5AC0" RangeStart="0x114A90" RangeEnd="0x115550" OutName="debug_display">
<Array Name="sDebugDisplay1Vtx" Count="36" Offset="0x114A90">
<Vtx/>
</Array>
<DList Name="sDebugDisplay1DL" Offset="0x114CD0"/>
<Array Name="sDebugDisplay2Vtx" Count="8" Offset="0x114D30">
<Vtx/>
</Array>
<DList Name="sDebugDisplay2DL" Offset="0x114DB0"/>
<Array Name="sDebugDisplay3Vtx" Count="40" Offset="0x114E00">
<Vtx/>
</Array>
<DList Name="sDebugDisplay3DL" Offset="0x115080"/>
<Texture Name="sDebugDisplayCircleTex" OutName="debug_circle" Format="i8" Width="16" Height="16" Offset="0x1150F8"/>
<Texture Name="sDebugDisplayBallTex" OutName="debug_ball" Format="i8" Width="16" Height="16" Offset="0x1151F8"/>
<Texture Name="sDebugDisplayCursorTex" OutName="debug_cursor" Format="i8" Width="16" Height="16" Offset="0x1152F8"/>
<Texture Name="sDebugDisplayCrossTex" OutName="debug_cross" Format="i8" Width="16" Height="16" Offset="0x1153F8"/>
<Array Name="sDebugDisplaySpriteVtx" Count="4" Offset="0x1154F8">
<Vtx/>
</Array>
<DList Name="sDebugDisplaySpriteDL" Offset="0x115538"/>
</File>
</Root>
+7
View File
@@ -0,0 +1,7 @@
<Root>
<File Name="code" BaseAddress="0x800A5AC0" RangeStart="0x108830" RangeEnd="0x108870" OutName="eff_shield_particle">
<Array Name="sEffShieldParticleVtx" Count="4" Offset="0x108830">
<Vtx/>
</Array>
</File>
</Root>
+6
View File
@@ -0,0 +1,6 @@
<Root>
<File Name="code" OutName="sub_s" BaseAddress="0x800A5AC0" RangeStart="0x120260" RangeEnd="0x1202F0" >
<DList Name="gShadowMaterialDL" Offset="0x1202A0"/>
<DList Name="gShadowModelDL" Offset="0x1202C0"/>
</File>
</Root>
+57
View File
@@ -0,0 +1,57 @@
<Root>
<File Name="do_action_static" Segment="9">
<Texture Name="gDoActionAttackENGTex" OutName="attack_eng" Format="ia4" Width="48" Height="16" Offset="0x0"/>
<Texture Name="gDoActionCheckENGTex" OutName="check_eng" Format="ia4" Width="48" Height="16" Offset="0x180"/>
<Texture Name="gDoActionEnterENGTex" OutName="enter_eng" Format="ia4" Width="48" Height="16" Offset="0x300"/>
<Texture Name="gDoActionReturnENGTex" OutName="return_eng" Format="ia4" Width="48" Height="16" Offset="0x480"/>
<Texture Name="gDoActionOpenENGTex" OutName="open_eng" Format="ia4" Width="48" Height="16" Offset="0x600"/>
<Texture Name="gDoActionJumpENGTex" OutName="jump_eng" Format="ia4" Width="48" Height="16" Offset="0x780"/>
<Texture Name="gDoActionDecideENGTex" OutName="decide_eng" Format="ia4" Width="48" Height="16" Offset="0x900"/>
<Texture Name="gDoActionDiveENGTex" OutName="dive_eng" Format="ia4" Width="48" Height="16" Offset="0xA80"/>
<Texture Name="gDoActionFasterENGTex" OutName="faster_eng" Format="ia4" Width="48" Height="16" Offset="0xC00"/>
<Texture Name="gDoActionThrowENGTex" OutName="throw_eng" Format="ia4" Width="48" Height="16" Offset="0xD80"/>
<!-- Unused and left untranslated from Japanese -->
<Texture Name="gDoActionNaviENGTex" OutName="navi_eng" Format="ia4" Width="48" Height="16" Offset="0xF00"/>
<Texture Name="gDoActionClimbENGTex" OutName="climb_eng" Format="ia4" Width="48" Height="16" Offset="0x1080"/>
<Texture Name="gDoActionDropENGTex" OutName="drop_eng" Format="ia4" Width="48" Height="16" Offset="0x1200"/>
<Texture Name="gDoActionDownENGTex" OutName="down_eng" Format="ia4" Width="48" Height="16" Offset="0x1380"/>
<Texture Name="gDoActionQuitENGTex" OutName="quit_eng" Format="ia4" Width="48" Height="16" Offset="0x1500"/>
<Texture Name="gDoActionSpeakENGTex" OutName="speak_eng" Format="ia4" Width="48" Height="16" Offset="0x1680"/>
<Texture Name="gDoActionNextENGTex" OutName="next_eng" Format="ia4" Width="48" Height="16" Offset="0x1800"/>
<Texture Name="gDoActionGrabENGTex" OutName="grab_eng" Format="ia4" Width="48" Height="16" Offset="0x1980"/>
<Texture Name="gDoActionStopENGTex" OutName="stop_eng" Format="ia4" Width="48" Height="16" Offset="0x1B00"/>
<Texture Name="gDoActionPutAwayENGTex" OutName="put_away_eng" Format="ia4" Width="48" Height="16" Offset="0x1C80"/>
<!-- Unused and left untranslated from Japanese -->
<Texture Name="gDoActionReelENGTex" OutName="reel_eng" Format="ia4" Width="48" Height="16" Offset="0x1E00"/>
<Texture Name="gDoActionInfoENGTex" OutName="info_eng" Format="ia4" Width="48" Height="16" Offset="0x1F80"/>
<Texture Name="gDoActionWarpENGTex" OutName="warp_eng" Format="ia4" Width="48" Height="16" Offset="0x2100"/>
<Texture Name="gDoActionSnapENGTex" OutName="snap_eng" Format="ia4" Width="48" Height="16" Offset="0x2280"/>
<Texture Name="gDoActionExplodeENGTex" OutName="explode_eng" Format="ia4" Width="48" Height="16" Offset="0x2400"/>
<Texture Name="gDoActionDanceENGTex" OutName="dance_eng" Format="ia4" Width="48" Height="16" Offset="0x2580"/>
<Texture Name="gDoActionMarchENGTex" OutName="march_eng" Format="ia4" Width="48" Height="16" Offset="0x2700"/>
<Texture Name="gDoActionNum1ENGTex" OutName="num_1_eng" Format="ia4" Width="48" Height="16" Offset="0x2880"/>
<Texture Name="gDoActionNum2ENGTex" OutName="num_2_eng" Format="ia4" Width="48" Height="16" Offset="0x2A00"/>
<Texture Name="gDoActionNum3ENGTex" OutName="num_3_eng" Format="ia4" Width="48" Height="16" Offset="0x2B80"/>
<Texture Name="gDoActionNum4ENGTex" OutName="num_4_eng" Format="ia4" Width="48" Height="16" Offset="0x2D00"/>
<Texture Name="gDoActionNum5ENGTex" OutName="num_5_eng" Format="ia4" Width="48" Height="16" Offset="0x2E80"/>
<Texture Name="gDoActionNum6ENGTex" OutName="num_6_eng" Format="ia4" Width="48" Height="16" Offset="0x3000"/>
<Texture Name="gDoActionNum7ENGTex" OutName="num_7_eng" Format="ia4" Width="48" Height="16" Offset="0x3180"/>
<Texture Name="gDoActionNum8ENGTex" OutName="num_8_eng" Format="ia4" Width="48" Height="16" Offset="0x3300"/>
<Texture Name="gDoActionCurlENGTex" OutName="curl_eng" Format="ia4" Width="48" Height="16" Offset="0x3480"/>
<Texture Name="gDoActionSurfaceENGTex" OutName="surface_eng" Format="ia4" Width="48" Height="16" Offset="0x3600"/>
<Texture Name="gDoActionSwimENGTex" OutName="swim_eng" Format="ia4" Width="48" Height="16" Offset="0x3780"/>
<Texture Name="gDoActionPunchENGTex" OutName="punch_eng" Format="ia4" Width="48" Height="16" Offset="0x3900"/>
<Texture Name="gDoActionPoundENGTex" OutName="pound_eng" Format="ia4" Width="48" Height="16" Offset="0x3A80"/>
<!-- Unused and left untranslated from Japanese -->
<Texture Name="gDoActionHookENGTex" OutName="hook_eng" Format="ia4" Width="48" Height="16" Offset="0x3C00"/>
<Texture Name="gDoActionShootENGTex" OutName="shoot_eng" Format="ia4" Width="48" Height="16" Offset="0x3D80"/>
</File>
</Root>
@@ -0,0 +1,32 @@
<Root>
<!-- Assets for dungeon icons -->
<File Name="icon_item_dungeon_static" Segment="12">
<!-- Identical icons to OoT -->
<Texture Name="gDungeonMapBlankFloorButtonTex" OutName="dungeon_map_blank_floor_button" Format="ia8" Width="24" Height="16" Offset="0x0"/>
<Texture Name="gDungeonMap1FButtonTex" OutName="dungeon_map_1f_button" Format="ia8" Width="24" Height="16" Offset="0x180"/>
<Texture Name="gDungeonMap2FButtonTex" OutName="dungeon_map_2f_button" Format="ia8" Width="24" Height="16" Offset="0x300"/>
<Texture Name="gDungeonMap3FButtonTex" OutName="dungeon_map_3f_button" Format="ia8" Width="24" Height="16" Offset="0x480"/>
<Texture Name="gDungeonMap4FButtonTex" OutName="dungeon_map_4f_button" Format="ia8" Width="24" Height="16" Offset="0x600"/>
<Texture Name="gDungeonMap5FButtonTex" OutName="dungeon_map_5f_button" Format="ia8" Width="24" Height="16" Offset="0x780"/>
<Texture Name="gDungeonMap6FButtonTex" OutName="dungeon_map_6f_button" Format="ia8" Width="24" Height="16" Offset="0x900"/>
<Texture Name="gDungeonMap7FButtonTex" OutName="dungeon_map_7f_button" Format="ia8" Width="24" Height="16" Offset="0xA80"/>
<Texture Name="gDungeonMap8FButtonTex" OutName="dungeon_map_8f_button" Format="ia8" Width="24" Height="16" Offset="0xC00"/>
<Texture Name="gDungeonMapB1ButtonTex" OutName="dungeon_map_b1_button" Format="ia8" Width="24" Height="16" Offset="0xD80"/>
<Texture Name="gDungeonMapB2ButtonTex" OutName="dungeon_map_b2_button" Format="ia8" Width="24" Height="16" Offset="0xF00"/>
<Texture Name="gDungeonMapB3ButtonTex" OutName="dungeon_map_b3_button" Format="ia8" Width="24" Height="16" Offset="0x1080"/>
<Texture Name="gDungeonMapB4ButtonTex" OutName="dungeon_map_b4_button" Format="ia8" Width="24" Height="16" Offset="0x1200"/>
<Texture Name="gDungeonMapB5ButtonTex" OutName="dungeon_map_b5_button" Format="ia8" Width="24" Height="16" Offset="0x1380"/>
<Texture Name="gDungeonMapB6ButtonTex" OutName="dungeon_map_b6_button" Format="ia8" Width="24" Height="16" Offset="0x1500"/>
<Texture Name="gDungeonMapB7ButtonTex" OutName="dungeon_map_b7_button" Format="ia8" Width="24" Height="16" Offset="0x1680"/>
<Texture Name="gDungeonMapB8ButtonTex" OutName="dungeon_map_b8_button" Format="ia8" Width="24" Height="16" Offset="0x1800"/>
<!-- Skull has a slightly altered design compared to OoT -->
<Texture Name="gDungeonMapSkullTex" OutName="dungeon_map_skull" Format="rgba16" Width="16" Height="16" Offset="0x1980"/>
<!-- Similar to stray fairy icons in parameter_static, except facing forward -->
<Texture Name="gDungeonStrayFairyWoodfallIconTex" OutName="dungeon_stray_fairy_woodfall_icon" Format="rgba32" Width="32" Height="24" Offset="0x1B80"/>
<Texture Name="gDungeonStrayFairySnowheadIconTex" OutName="dungeon_stray_fairy_snowhead_icon" Format="rgba32" Width="32" Height="24" Offset="0x2780"/>
<Texture Name="gDungeonStrayFairyGreatBayIconTex" OutName="dungeon_stray_fairy_great_bay_icon" Format="rgba32" Width="32" Height="24" Offset="0x3380"/>
<Texture Name="gDungeonStrayFairyStoneTowerIconTex" OutName="dungeon_stray_fairy_stone_tower_icon" Format="rgba32" Width="32" Height="24" Offset="0x3F80"/>
</File>
</Root>
@@ -0,0 +1,40 @@
<Root>
<!-- Assets for the world map -->
<File Name="icon_item_field_static" Segment="12">
<!-- World map itself -->
<Texture Name="gWorldMapImageTex" OutName="world_map_image" Format="ci8" Width="216" Height="128" Offset="0x0" TlutOffset="0x6C00"/>
<Texture Name="gWorldMapImageTLUT" OutName="world_map_image_tlut" Format="rgba16" Width="16" Height="16" Offset="0x6C00"/>
<!-- Identical To OoT -->
<Texture Name="gWorldMapDotTex" OutName="world_map_dot" Format="ia8" Width="8" Height="8" Offset="0x6E00"/>
<Texture Name="gWorldMapAreaBox1Tex" OutName="world_map_area_box_1" Format="ia4" Width="32" Height="19" Offset="0x6E40"/>
<Texture Name="gWorldMapAreaBox2Tex" OutName="world_map_area_box_2" Format="ia4" Width="48" Height="38" Offset="0x6F70"/>
<Texture Name="gWorldMapAreaBox3Tex" OutName="world_map_area_box_3" Format="ia4" Width="32" Height="17" Offset="0x7300"/>
<Texture Name="gWorldMapAreaBox4Tex" OutName="world_map_area_box_4" Format="ia4" Width="32" Height="13" Offset="0x7410"/>
<Texture Name="gWorldMapAreaBox5Tex" OutName="world_map_area_box_5" Format="ia4" Width="32" Height="26" Offset="0x74E0"/>
<Texture Name="gWorldMapAreaBox6Tex" OutName="world_map_area_box_6" Format="ia4" Width="48" Height="19" Offset="0x7680"/>
<Texture Name="gWorldMapAreaBox7Tex" OutName="world_map_area_box_7" Format="ia4" Width="96" Height="59" Offset="0x7848"/>
<Texture Name="gWorldMapAreaBox8Tex" OutName="world_map_area_box_8" Format="ia4" Width="16" Height="16" Offset="0x8358"/>
<Texture Name="gWorldMapArrowTex" OutName="world_map_arrow" Format="ia8" Width="8" Height="8" Offset="0x83D8"/>
<!-- Cloud cover based on tingle maps -->
<Texture Name="gWorldMapClockTownCloud1Tex" OutName="world_map_clock_town_cloud_1" Format="ia8" Width="80" Height="40" Offset="0x8418"/>
<Texture Name="gWorldMapClockTownCloud2Tex" OutName="world_map_clock_town_cloud_2" Format="ia8" Width="64" Height="31" Offset="0x9098"/>
<Texture Name="gWorldMapRomaniRanchCloudTex" OutName="world_map_romani_ranch_cloud" Format="ia8" Width="48" Height="32" Offset="0x9858"/>
<Texture Name="gWorldMapGreatBayCloud1Tex" OutName="world_map_great_bay_cloud_1" Format="ia8" Width="64" Height="64" Offset="0x9E58"/>
<Texture Name="gWorldMapGreatBayCloud2Tex" OutName="world_map_great_bay_cloud_2" Format="ia8" Width="64" Height="64" Offset="0xAE58"/>
<Texture Name="gWorldMapGreatBayCloud3Tex" OutName="world_map_great_bay_cloud_3" Format="ia8" Width="64" Height="64" Offset="0xBE58"/>
<Texture Name="gWorldMapGreatBayCloud4Tex" OutName="world_map_great_bay_cloud_4" Format="ia8" Width="64" Height="64" Offset="0xCE58"/>
<Texture Name="gWorldMapSnowheadCloud1Tex" OutName="world_map_snowhead_cloud_1" Format="ia8" Width="64" Height="52" Offset="0xDE58"/>
<Texture Name="gWorldMapSnowheadCloud2Tex" OutName="world_map_snowhead_cloud_2" Format="ia8" Width="112" Height="35" Offset="0xEB58"/>
<Texture Name="gWorldMapSnowheadCloud3Tex" OutName="world_map_snowhead_cloud_3" Format="ia8" Width="112" Height="35" Offset="0xFAA8"/>
<Texture Name="gWorldMapStoneTowerCloud1Tex" OutName="world_map_stone_tower_cloud_1" Format="ia8" Width="48" Height="82" Offset="0x109F8"/>
<Texture Name="gWorldMapStoneTowerCloud2Tex" OutName="world_map_stone_tower_cloud_2" Format="ia8" Width="64" Height="61" Offset="0x11958"/>
<Texture Name="gWorldMapWoodfallCloud1Tex" OutName="world_map_woodfall_cloud_1" Format="ia8" Width="64" Height="53" Offset="0x12898"/>
<Texture Name="gWorldMapWoodfallCloud2Tex" OutName="world_map_woodfall_cloud_2" Format="ia8" Width="64" Height="53" Offset="0x135D8"/>
<Texture Name="gWorldMapWoodfallCloud3Tex" OutName="world_map_woodfall_cloud_3" Format="ia8" Width="16" Height="53" Offset="0x14318"/>
<!-- Face of an owl to indicate warp points -->
<Texture Name="gWorldMapOwlFaceTex" OutName="world_map_owl_face" Format="rgba32" Width="24" Height="12" Offset="0x14668"/>
</File>
</Root>
@@ -0,0 +1,10 @@
<Root>
<File Name="icon_item_gameover_static" Segment="12">
<Texture Name="gGameOverP1Tex" OutName="game_over_p1" Format="ia8" Width="64" Height="32" Offset="0x0"/>
<Texture Name="gGameOverP2Tex" OutName="game_over_p2" Format="ia8" Width="64" Height="32" Offset="0x800"/>
<Texture Name="gGameOverP3Tex" OutName="game_over_p3" Format="ia8" Width="64" Height="32" Offset="0x1000"/>
<Texture Name="gGameOverMaskTex" OutName="game_over_mask" Format="ia8" Width="64" Height="32" Offset="0x1800"/>
<Texture Name="gContinuePlayingJAPTex" OutName="continue_playing_jap" Format="ia8" Width="152" Height="16" Offset="0x2000"/>
<Texture Name="gContinuePlayingNESTex" OutName="continue_playing_nes" Format="ia8" Width="152" Height="16" Offset="0x2980"/>
</File>
</Root>
@@ -0,0 +1,31 @@
<Root>
<!-- Pause Menu: Language-Dependent Textures -->
<File Name="icon_item_jpn_static" Segment="13">
<!-- Pause Menu Dungeon Title Cards -->
<Texture Name="gPauseWoodfallTitleENGTex" OutName="pause_woodfall_title_eng" Format="ia8" Width="128" Height="16" Offset="0x0"/>
<Texture Name="gPauseSnowheadTitleENGTex" OutName="pause_snowhead_title_eng" Format="ia8" Width="128" Height="16" Offset="0x800"/>
<Texture Name="gPauseGreatBayTitleENGTex" OutName="pause_great_bay_title_eng" Format="ia8" Width="128" Height="16" Offset="0x1000"/>
<Texture Name="gPauseStoneTowerTitleENGTex" OutName="pause_stone_tower_title_eng" Format="ia8" Width="128" Height="16" Offset="0x1800"/>
<!-- Pause Menu Info Panel To-> Textures -->
<Texture Name="gPauseToEquipENGTex" OutName="pause_to_equip_eng" Format="ia4" Width="64" Height="16" Offset="0x2000"/>
<Texture Name="gPauseToDecideENGTex" OutName="pause_to_decide_eng" Format="ia4" Width="64" Height="16" Offset="0x2200"/>
<Texture Name="gPauseToPlayMelodyENGTex" OutName="pause_to_play_melody_eng" Format="ia4" Width="96" Height="16" Offset="0x2400"/>
<Texture Name="gPauseToSelectItemENGTex" OutName="pause_to_select_item_eng" Format="ia4" Width="128" Height="16" Offset="0x2700"/>
<Texture Name="gPauseToMapENGTex" OutName="pause_to_map_eng" Format="ia4" Width="128" Height="16" Offset="0x2B00"/>
<Texture Name="gPauseToQuestStatusENGTex" OutName="pause_to_quest_status_eng" Format="ia4" Width="128" Height="16" Offset="0x2F00"/>
<Texture Name="gPauseToMasksENGTex" OutName="pause_to_masks_eng" Format="ia4" Width="128" Height="16" Offset="0x3300"/>
<Texture Name="gPauseToViewNotebookENGTex" OutName="pause_to_view_notebook_eng" Format="ia4" Width="96" Height="16" Offset="0x3700"/>
<!-- Pause Menu Pages Background Textures -->
<!-- Divided into 3 columns (first digit) and 5 rows (second digit) -->
<Texture Name="gPauseMasks10ENGTex" OutName="pause_masks_1_0_eng" Format="ia8" Width="80" Height="32" Offset="0x3A00"/>
<Texture Name="gPauseSelectItem00ENGTex" OutName="pause_select_item_0_0_eng" Format="ia8" Width="80" Height="32" Offset="0x4400"/>
<Texture Name="gPauseSelectItem10ENGTex" OutName="pause_select_item_1_0_eng" Format="ia8" Width="80" Height="32" Offset="0x4E00"/>
<Texture Name="gPauseSelectItem20ENGTex" OutName="pause_select_item_2_0_eng" Format="ia8" Width="80" Height="32" Offset="0x5800"/>
<Texture Name="gPauseMap10ENGTex" OutName="pause_map_1_0_eng" Format="ia8" Width="80" Height="32" Offset="0x6200"/>
<Texture Name="gPauseQuestStatus00ENGTex" OutName="pause_quest_status_0_0_eng" Format="ia8" Width="80" Height="32" Offset="0x6C00"/>
<Texture Name="gPauseQuestStatus10ENGTex" OutName="pause_quest_status_1_0_eng" Format="ia8" Width="80" Height="32" Offset="0x7600"/>
<Texture Name="gPauseQuestStatus20ENGTex" OutName="pause_quest_status_2_0_eng" Format="ia8" Width="80" Height="32" Offset="0x8000"/>
</File>
</Root>
+168
View File
@@ -0,0 +1,168 @@
<Root>
<File Name="nes_font_static">
<!-- The two-digit number after the prefix is the character's codepoint: the hexadecimal byte it corresponds to in the text data -->
<!-- "ASCII" block -->
<!-- Not actually either ASCII or JIS X 0201: 0x5C is the yen symbol, 0x7E the tilde, 0x7F the masculine ordinal indicator -->
<Texture Name="gMsgChar20SpaceTex" OutName="msg_char_20_space" Format="i4" Width="16" Height="16" Offset="0x0"/>
<Texture Name="gMsgChar21ExclamationMarkTex" OutName="msg_char_21_exclamation_mark" Format="i4" Width="16" Height="16" Offset="0x80"/>
<Texture Name="gMsgChar22QuotationMarkTex" OutName="msg_char_22_quotation_mark" Format="i4" Width="16" Height="16" Offset="0x100"/>
<Texture Name="gMsgChar23NumberSignTex" OutName="msg_char_23_number_sign" Format="i4" Width="16" Height="16" Offset="0x180"/>
<Texture Name="gMsgChar24DollarSignTex" OutName="msg_char_24_dollar_sign" Format="i4" Width="16" Height="16" Offset="0x200"/>
<Texture Name="gMsgChar25PercentSignTex" OutName="msg_char_25_percent_sign" Format="i4" Width="16" Height="16" Offset="0x280"/>
<Texture Name="gMsgChar26AmpersandTex" OutName="msg_char_26_ampersand" Format="i4" Width="16" Height="16" Offset="0x300"/>
<Texture Name="gMsgChar27ApostropheTex" OutName="msg_char_27_apostrophe" Format="i4" Width="16" Height="16" Offset="0x380"/>
<Texture Name="gMsgChar28LeftParenthesesTex" OutName="msg_char_28_left_parentheses" Format="i4" Width="16" Height="16" Offset="0x400"/>
<Texture Name="gMsgChar29RightParenthesesTex" OutName="msg_char_29_right_parentheses" Format="i4" Width="16" Height="16" Offset="0x480"/>
<Texture Name="gMsgChar2AAsteriskTex" OutName="msg_char_2a_asterisk" Format="i4" Width="16" Height="16" Offset="0x500"/>
<Texture Name="gMsgChar2BPlusSignTex" OutName="msg_char_2b_plus_sign" Format="i4" Width="16" Height="16" Offset="0x580"/>
<Texture Name="gMsgChar2CCommaTex" OutName="msg_char_2c_comma" Format="i4" Width="16" Height="16" Offset="0x600"/>
<Texture Name="gMsgChar2DHyphenMinusTex" OutName="msg_char_2d_hyphen_minus" Format="i4" Width="16" Height="16" Offset="0x680"/>
<Texture Name="gMsgChar2EFullStopTex" OutName="msg_char_2e_full_stop" Format="i4" Width="16" Height="16" Offset="0x700"/>
<Texture Name="gMsgChar2FSolidusTex" OutName="msg_char_2f_solidus" Format="i4" Width="16" Height="16" Offset="0x780"/>
<Texture Name="gMsgChar30Digit0Tex" OutName="msg_char_30_digit_0" Format="i4" Width="16" Height="16" Offset="0x800"/>
<Texture Name="gMsgChar31Digit1Tex" OutName="msg_char_31_digit_1" Format="i4" Width="16" Height="16" Offset="0x880"/>
<Texture Name="gMsgChar32Digit2Tex" OutName="msg_char_32_digit_2" Format="i4" Width="16" Height="16" Offset="0x900"/>
<Texture Name="gMsgChar33Digit3Tex" OutName="msg_char_33_digit_3" Format="i4" Width="16" Height="16" Offset="0x980"/>
<Texture Name="gMsgChar34Digit4Tex" OutName="msg_char_34_digit_4" Format="i4" Width="16" Height="16" Offset="0xA00"/>
<Texture Name="gMsgChar35Digit5Tex" OutName="msg_char_35_digit_5" Format="i4" Width="16" Height="16" Offset="0xA80"/>
<Texture Name="gMsgChar36Digit6Tex" OutName="msg_char_36_digit_6" Format="i4" Width="16" Height="16" Offset="0xB00"/>
<Texture Name="gMsgChar37Digit7Tex" OutName="msg_char_37_digit_7" Format="i4" Width="16" Height="16" Offset="0xB80"/>
<Texture Name="gMsgChar38Digit8Tex" OutName="msg_char_38_digit_8" Format="i4" Width="16" Height="16" Offset="0xC00"/>
<Texture Name="gMsgChar39Digit9Tex" OutName="msg_char_39_digit_9" Format="i4" Width="16" Height="16" Offset="0xC80"/>
<Texture Name="gMsgChar3AColonTex" OutName="msg_char_3a_colon" Format="i4" Width="16" Height="16" Offset="0xD00"/>
<Texture Name="gMsgChar3BSemicolonTex" OutName="msg_char_3b_semicolon" Format="i4" Width="16" Height="16" Offset="0xD80"/>
<Texture Name="gMsgChar3CLessThanSignTex" OutName="msg_char_3c_less_than_sign" Format="i4" Width="16" Height="16" Offset="0xE00"/>
<Texture Name="gMsgChar3DEqualsSignTex" OutName="msg_char_3d_equals_sign" Format="i4" Width="16" Height="16" Offset="0xE80"/>
<Texture Name="gMsgChar3EGreaterThanSignTex" OutName="msg_char_3e_greater_than_sign" Format="i4" Width="16" Height="16" Offset="0xF00"/>
<Texture Name="gMsgChar3FQuestionMarkTex" OutName="msg_char_3f_question_mark" Format="i4" Width="16" Height="16" Offset="0xF80"/>
<Texture Name="gMsgChar40CommercialAtTex" OutName="msg_char_40_commercial_at" Format="i4" Width="16" Height="16" Offset="0x1000"/>
<Texture Name="gMsgChar41LatinCapitalLetterATex" OutName="msg_char_41_latin_capital_letter_a" Format="i4" Width="16" Height="16" Offset="0x1080"/>
<Texture Name="gMsgChar42LatinCapitalLetterBTex" OutName="msg_char_42_latin_capital_letter_b" Format="i4" Width="16" Height="16" Offset="0x1100"/>
<Texture Name="gMsgChar43LatinCapitalLetterCTex" OutName="msg_char_43_latin_capital_letter_c" Format="i4" Width="16" Height="16" Offset="0x1180"/>
<Texture Name="gMsgChar44LatinCapitalLetterDTex" OutName="msg_char_44_latin_capital_letter_d" Format="i4" Width="16" Height="16" Offset="0x1200"/>
<Texture Name="gMsgChar45LatinCapitalLetterETex" OutName="msg_char_45_latin_capital_letter_e" Format="i4" Width="16" Height="16" Offset="0x1280"/>
<Texture Name="gMsgChar46LatinCapitalLetterFTex" OutName="msg_char_46_latin_capital_letter_f" Format="i4" Width="16" Height="16" Offset="0x1300"/>
<Texture Name="gMsgChar47LatinCapitalLetterGTex" OutName="msg_char_47_latin_capital_letter_g" Format="i4" Width="16" Height="16" Offset="0x1380"/>
<Texture Name="gMsgChar48LatinCapitalLetterHTex" OutName="msg_char_48_latin_capital_letter_h" Format="i4" Width="16" Height="16" Offset="0x1400"/>
<Texture Name="gMsgChar49LatinCapitalLetterITex" OutName="msg_char_49_latin_capital_letter_i" Format="i4" Width="16" Height="16" Offset="0x1480"/>
<Texture Name="gMsgChar4ALatinCapitalLetterJTex" OutName="msg_char_4a_latin_capital_letter_j" Format="i4" Width="16" Height="16" Offset="0x1500"/>
<Texture Name="gMsgChar4BLatinCapitalLetterKTex" OutName="msg_char_4b_latin_capital_letter_k" Format="i4" Width="16" Height="16" Offset="0x1580"/>
<Texture Name="gMsgChar4CLatinCapitalLetterLTex" OutName="msg_char_4c_latin_capital_letter_l" Format="i4" Width="16" Height="16" Offset="0x1600"/>
<Texture Name="gMsgChar4DLatinCapitalLetterMTex" OutName="msg_char_4d_latin_capital_letter_m" Format="i4" Width="16" Height="16" Offset="0x1680"/>
<Texture Name="gMsgChar4ELatinCapitalLetterNTex" OutName="msg_char_4e_latin_capital_letter_n" Format="i4" Width="16" Height="16" Offset="0x1700"/>
<Texture Name="gMsgChar4FLatinCapitalLetterOTex" OutName="msg_char_4f_latin_capital_letter_o" Format="i4" Width="16" Height="16" Offset="0x1780"/>
<Texture Name="gMsgChar50LatinCapitalLetterPTex" OutName="msg_char_50_latin_capital_letter_p" Format="i4" Width="16" Height="16" Offset="0x1800"/>
<Texture Name="gMsgChar51LatinCapitalLetterQTex" OutName="msg_char_51_latin_capital_letter_q" Format="i4" Width="16" Height="16" Offset="0x1880"/>
<Texture Name="gMsgChar52LatinCapitalLetterRTex" OutName="msg_char_52_latin_capital_letter_r" Format="i4" Width="16" Height="16" Offset="0x1900"/>
<Texture Name="gMsgChar53LatinCapitalLetterSTex" OutName="msg_char_53_latin_capital_letter_s" Format="i4" Width="16" Height="16" Offset="0x1980"/>
<Texture Name="gMsgChar54LatinCapitalLetterTTex" OutName="msg_char_54_latin_capital_letter_t" Format="i4" Width="16" Height="16" Offset="0x1A00"/>
<Texture Name="gMsgChar55LatinCapitalLetterUTex" OutName="msg_char_55_latin_capital_letter_u" Format="i4" Width="16" Height="16" Offset="0x1A80"/>
<Texture Name="gMsgChar56LatinCapitalLetterVTex" OutName="msg_char_56_latin_capital_letter_v" Format="i4" Width="16" Height="16" Offset="0x1B00"/>
<Texture Name="gMsgChar57LatinCapitalLetterWTex" OutName="msg_char_57_latin_capital_letter_w" Format="i4" Width="16" Height="16" Offset="0x1B80"/>
<Texture Name="gMsgChar58LatinCapitalLetterXTex" OutName="msg_char_58_latin_capital_letter_x" Format="i4" Width="16" Height="16" Offset="0x1C00"/>
<Texture Name="gMsgChar59LatinCapitalLetterYTex" OutName="msg_char_59_latin_capital_letter_y" Format="i4" Width="16" Height="16" Offset="0x1C80"/>
<Texture Name="gMsgChar5ALatinCapitalLetterZTex" OutName="msg_char_5a_latin_capital_letter_z" Format="i4" Width="16" Height="16" Offset="0x1D00"/>
<Texture Name="gMsgChar5BLeftSquareBracketTex" OutName="msg_char_5b_left_square_bracket" Format="i4" Width="16" Height="16" Offset="0x1D80"/>
<Texture Name="gMsgChar5CYenSignTex" OutName="msg_char_5c_yen_sign" Format="i4" Width="16" Height="16" Offset="0x1E00"/>
<Texture Name="gMsgChar5DRightSquareBracketTex" OutName="msg_char_5d_right_square_bracket" Format="i4" Width="16" Height="16" Offset="0x1E80"/>
<Texture Name="gMsgChar5ECircumflexAccentTex" OutName="msg_char_5e_circumflex_accent" Format="i4" Width="16" Height="16" Offset="0x1F00"/>
<Texture Name="gMsgChar5FLowLineTex" OutName="msg_char_5f_low_line" Format="i4" Width="16" Height="16" Offset="0x1F80"/>
<Texture Name="gMsgChar60GraveAccentTex" OutName="msg_char_60_grave_accent" Format="i4" Width="16" Height="16" Offset="0x2000"/>
<Texture Name="gMsgChar61LatinSmallLetterATex" OutName="msg_char_61_latin_small_letter_a" Format="i4" Width="16" Height="16" Offset="0x2080"/>
<Texture Name="gMsgChar62LatinSmallLetterBTex" OutName="msg_char_62_latin_small_letter_b" Format="i4" Width="16" Height="16" Offset="0x2100"/>
<Texture Name="gMsgChar63LatinSmallLetterCTex" OutName="msg_char_63_latin_small_letter_c" Format="i4" Width="16" Height="16" Offset="0x2180"/>
<Texture Name="gMsgChar64LatinSmallLetterDTex" OutName="msg_char_64_latin_small_letter_d" Format="i4" Width="16" Height="16" Offset="0x2200"/>
<Texture Name="gMsgChar65LatinSmallLetterETex" OutName="msg_char_65_latin_small_letter_e" Format="i4" Width="16" Height="16" Offset="0x2280"/>
<Texture Name="gMsgChar66LatinSmallLetterFTex" OutName="msg_char_66_latin_small_letter_f" Format="i4" Width="16" Height="16" Offset="0x2300"/>
<Texture Name="gMsgChar67LatinSmallLetterGTex" OutName="msg_char_67_latin_small_letter_g" Format="i4" Width="16" Height="16" Offset="0x2380"/>
<Texture Name="gMsgChar68LatinSmallLetterHTex" OutName="msg_char_68_latin_small_letter_h" Format="i4" Width="16" Height="16" Offset="0x2400"/>
<Texture Name="gMsgChar69LatinSmallLetterITex" OutName="msg_char_69_latin_small_letter_i" Format="i4" Width="16" Height="16" Offset="0x2480"/>
<Texture Name="gMsgChar6ALatinSmallLetterJTex" OutName="msg_char_6a_latin_small_letter_j" Format="i4" Width="16" Height="16" Offset="0x2500"/>
<Texture Name="gMsgChar6BLatinSmallLetterKTex" OutName="msg_char_6b_latin_small_letter_k" Format="i4" Width="16" Height="16" Offset="0x2580"/>
<Texture Name="gMsgChar6CLatinSmallLetterLTex" OutName="msg_char_6c_latin_small_letter_l" Format="i4" Width="16" Height="16" Offset="0x2600"/>
<Texture Name="gMsgChar6DLatinSmallLetterMTex" OutName="msg_char_6d_latin_small_letter_m" Format="i4" Width="16" Height="16" Offset="0x2680"/>
<Texture Name="gMsgChar6ELatinSmallLetterNTex" OutName="msg_char_6e_latin_small_letter_n" Format="i4" Width="16" Height="16" Offset="0x2700"/>
<Texture Name="gMsgChar6FLatinSmallLetterOTex" OutName="msg_char_6f_latin_small_letter_o" Format="i4" Width="16" Height="16" Offset="0x2780"/>
<Texture Name="gMsgChar70LatinSmallLetterPTex" OutName="msg_char_70_latin_small_letter_p" Format="i4" Width="16" Height="16" Offset="0x2800"/>
<Texture Name="gMsgChar71LatinSmallLetterQTex" OutName="msg_char_71_latin_small_letter_q" Format="i4" Width="16" Height="16" Offset="0x2880"/>
<Texture Name="gMsgChar72LatinSmallLetterRTex" OutName="msg_char_72_latin_small_letter_r" Format="i4" Width="16" Height="16" Offset="0x2900"/>
<Texture Name="gMsgChar73LatinSmallLetterSTex" OutName="msg_char_73_latin_small_letter_s" Format="i4" Width="16" Height="16" Offset="0x2980"/>
<Texture Name="gMsgChar74LatinSmallLetterTTex" OutName="msg_char_74_latin_small_letter_t" Format="i4" Width="16" Height="16" Offset="0x2A00"/>
<Texture Name="gMsgChar75LatinSmallLetterUTex" OutName="msg_char_75_latin_small_letter_u" Format="i4" Width="16" Height="16" Offset="0x2A80"/>
<Texture Name="gMsgChar76LatinSmallLetterVTex" OutName="msg_char_76_latin_small_letter_v" Format="i4" Width="16" Height="16" Offset="0x2B00"/>
<Texture Name="gMsgChar77LatinSmallLetterWTex" OutName="msg_char_77_latin_small_letter_w" Format="i4" Width="16" Height="16" Offset="0x2B80"/>
<Texture Name="gMsgChar78LatinSmallLetterXTex" OutName="msg_char_78_latin_small_letter_x" Format="i4" Width="16" Height="16" Offset="0x2C00"/>
<Texture Name="gMsgChar79LatinSmallLetterYTex" OutName="msg_char_79_latin_small_letter_y" Format="i4" Width="16" Height="16" Offset="0x2C80"/>
<Texture Name="gMsgChar7ALatinSmallLetterZTex" OutName="msg_char_7a_latin_small_letter_z" Format="i4" Width="16" Height="16" Offset="0x2D00"/>
<Texture Name="gMsgChar7BLeftCurlyBracketTex" OutName="msg_char_7b_left_curly_bracket" Format="i4" Width="16" Height="16" Offset="0x2D80"/>
<Texture Name="gMsgChar7CVerticalLineTex" OutName="msg_char_7c_vertical_line" Format="i4" Width="16" Height="16" Offset="0x2E00"/>
<Texture Name="gMsgChar7DRightCurlyBracketTex" OutName="msg_char_7d_right_curly_bracket" Format="i4" Width="16" Height="16" Offset="0x2E80"/>
<Texture Name="gMsgChar7ETildeTex" OutName="msg_char_7e_tilde" Format="i4" Width="16" Height="16" Offset="0x2F00"/>
<Texture Name="gMsgChar7FMasculineOrdinalIndicatorTex" OutName="msg_char_7f_masculine_ordinal_indicator" Format="i4" Width="16" Height="16" Offset="0x2F80"/>
<!-- Accented character section -->
<!-- These do not conform to any standard encoding, but this section is much more regular and expansive than the corresponding one in Ocarina of Time -->
<Texture Name="gMsgChar80LatinCapitalLetterAWithGraveTex" OutName="msg_char_80_latin_capital_letter_a_with_grave" Format="i4" Width="16" Height="16" Offset="0x3000"/>
<Texture Name="gMsgChar81LatinCapitalLetterAWithAcuteTex" OutName="msg_char_81_latin_capital_letter_a_with_acute" Format="i4" Width="16" Height="16" Offset="0x3080"/>
<Texture Name="gMsgChar82LatinCapitalLetterAWithCircumflexTex" OutName="msg_char_82_latin_capital_letter_a_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3100"/>
<Texture Name="gMsgChar83LatinCapitalLetterAWithDiaeresisTex" OutName="msg_char_83_latin_capital_letter_a_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3180"/>
<Texture Name="gMsgChar84LatinCapitalLetterCWithCedillaTex" OutName="msg_char_84_latin_capital_letter_c_with_cedilla" Format="i4" Width="16" Height="16" Offset="0x3200"/>
<Texture Name="gMsgChar85LatinCapitalLetterEWithGraveTex" OutName="msg_char_85_latin_capital_letter_e_with_grave" Format="i4" Width="16" Height="16" Offset="0x3280"/>
<Texture Name="gMsgChar86LatinCapitalLetterEWithAcuteTex" OutName="msg_char_86_latin_capital_letter_e_with_acute" Format="i4" Width="16" Height="16" Offset="0x3300"/>
<Texture Name="gMsgChar87LatinCapitalLetterEWithCircumflexTex" OutName="msg_char_87_latin_capital_letter_e_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3380"/>
<Texture Name="gMsgChar88LatinCapitalLetterEWithDiaeresisTex" OutName="msg_char_88_latin_capital_letter_e_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3400"/>
<Texture Name="gMsgChar89LatinCapitalLetterIWithGraveTex" OutName="msg_char_89_latin_capital_letter_i_with_grave" Format="i4" Width="16" Height="16" Offset="0x3480"/>
<Texture Name="gMsgChar8ALatinCapitalLetterIWithAcuteTex" OutName="msg_char_8a_latin_capital_letter_i_with_acute" Format="i4" Width="16" Height="16" Offset="0x3500"/>
<Texture Name="gMsgChar8BLatinCapitalLetterIWithCircumflexTex" OutName="msg_char_8b_latin_capital_letter_i_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3580"/>
<Texture Name="gMsgChar8CLatinCapitalLetterIWithDiaeresisTex" OutName="msg_char_8c_latin_capital_letter_i_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3600"/>
<Texture Name="gMsgChar8DLatinCapitalLetterNWithTildeTex" OutName="msg_char_8d_latin_capital_letter_n_with_tilde" Format="i4" Width="16" Height="16" Offset="0x3680"/>
<Texture Name="gMsgChar8ELatinCapitalLetterOWithGraveTex" OutName="msg_char_8e_latin_capital_letter_o_with_grave" Format="i4" Width="16" Height="16" Offset="0x3700"/>
<Texture Name="gMsgChar8FLatinCapitalLetterOWithAcuteTex" OutName="msg_char_8f_latin_capital_letter_o_with_acute" Format="i4" Width="16" Height="16" Offset="0x3780"/>
<Texture Name="gMsgChar90LatinCapitalLetterOWithCircumflexTex" OutName="msg_char_90_latin_capital_letter_o_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3800"/>
<Texture Name="gMsgChar91LatinCapitalLetterOWithDiaeresisTex" OutName="msg_char_91_latin_capital_letter_o_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3880"/>
<Texture Name="gMsgChar92LatinCapitalLetterUWithGraveTex" OutName="msg_char_92_latin_capital_letter_u_with_grave" Format="i4" Width="16" Height="16" Offset="0x3900"/>
<Texture Name="gMsgChar93LatinCapitalLetterUWithAcuteTex" OutName="msg_char_93_latin_capital_letter_u_with_acute" Format="i4" Width="16" Height="16" Offset="0x3980"/>
<Texture Name="gMsgChar94LatinCapitalLetterUWithCircumflexTex" OutName="msg_char_94_latin_capital_letter_u_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3A00"/>
<Texture Name="gMsgChar95LatinCapitalLetterUWithDiaeresisTex" OutName="msg_char_95_latin_capital_letter_u_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3A80"/>
<Texture Name="gMsgChar96GreekSmallLetterBetaTex" OutName="msg_char_96_greek_small_letter_beta" Format="i4" Width="16" Height="16" Offset="0x3B00"/><!-- Likely meant to be eszett -->
<Texture Name="gMsgChar97LatinSmallLetterAWithGraveTex" OutName="msg_char_97_latin_small_letter_a_with_grave" Format="i4" Width="16" Height="16" Offset="0x3B80"/>
<Texture Name="gMsgChar98LatinSmallLetterAWithAcuteTex" OutName="msg_char_98_latin_small_letter_a_with_acute" Format="i4" Width="16" Height="16" Offset="0x3C00"/>
<Texture Name="gMsgChar99LatinSmallLetterAWithCircumflexTex" OutName="msg_char_99_latin_small_letter_a_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3C80"/>
<Texture Name="gMsgChar9ALatinSmallLetterAWithDiaeresisTex" OutName="msg_char_9a_latin_small_letter_a_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3D00"/>
<Texture Name="gMsgChar9BLatinSmallLetterCWithCedillaTex" OutName="msg_char_9b_latin_small_letter_c_with_cedilla" Format="i4" Width="16" Height="16" Offset="0x3D80"/>
<Texture Name="gMsgChar9CLatinSmallLetterEWithGraveTex" OutName="msg_char_9c_latin_small_letter_e_with_grave" Format="i4" Width="16" Height="16" Offset="0x3E00"/>
<Texture Name="gMsgChar9DLatinSmallLetterEWithAcuteTex" OutName="msg_char_9d_latin_small_letter_e_with_acute" Format="i4" Width="16" Height="16" Offset="0x3E80"/>
<Texture Name="gMsgChar9ELatinSmallLetterEWithCircumflexTex" OutName="msg_char_9e_latin_small_letter_e_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x3F00"/>
<Texture Name="gMsgChar9FLatinSmallLetterEWithDiaeresisTex" OutName="msg_char_9f_latin_small_letter_e_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x3F80"/>
<Texture Name="gMsgCharA0LatinSmallLetterIWithGraveTex" OutName="msg_char_a0_latin_small_letter_i_with_grave" Format="i4" Width="16" Height="16" Offset="0x4000"/>
<Texture Name="gMsgCharA1LatinSmallLetterIWithAcuteTex" OutName="msg_char_a1_latin_small_letter_i_with_acute" Format="i4" Width="16" Height="16" Offset="0x4080"/>
<Texture Name="gMsgCharA2LatinSmallLetterIWithCircumflexTex" OutName="msg_char_a2_latin_small_letter_i_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x4100"/>
<Texture Name="gMsgCharA3LatinSmallLetterIWithDiaeresisTex" OutName="msg_char_a3_latin_small_letter_i_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x4180"/>
<Texture Name="gMsgCharA4LatinSmallLetterNWithTildeTex" OutName="msg_char_a4_latin_small_letter_n_with_tilde" Format="i4" Width="16" Height="16" Offset="0x4200"/>
<Texture Name="gMsgCharA5LatinSmallLetterOWithGraveTex" OutName="msg_char_a5_latin_small_letter_o_with_grave" Format="i4" Width="16" Height="16" Offset="0x4280"/>
<Texture Name="gMsgCharA6LatinSmallLetterOWithAcuteTex" OutName="msg_char_a6_latin_small_letter_o_with_acute" Format="i4" Width="16" Height="16" Offset="0x4300"/>
<Texture Name="gMsgCharA7LatinSmallLetterOWithCircumflexTex" OutName="msg_char_a7_latin_small_letter_o_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x4380"/>
<Texture Name="gMsgCharA8LatinSmallLetterOWithDiaeresisTex" OutName="msg_char_a8_latin_small_letter_o_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x4400"/>
<Texture Name="gMsgCharA9LatinSmallLetterUWithGraveTex" OutName="msg_char_a9_latin_small_letter_u_with_grave" Format="i4" Width="16" Height="16" Offset="0x4480"/>
<Texture Name="gMsgCharAALatinSmallLetterUWithAcuteTex" OutName="msg_char_aa_latin_small_letter_u_with_acute" Format="i4" Width="16" Height="16" Offset="0x4500"/>
<Texture Name="gMsgCharABLatinSmallLetterUWithCircumflexTex" OutName="msg_char_ab_latin_small_letter_u_with_circumflex" Format="i4" Width="16" Height="16" Offset="0x4580"/>
<Texture Name="gMsgCharACLatinSmallLetterUWithDiaeresisTex" OutName="msg_char_ac_latin_small_letter_u_with_diaeresis" Format="i4" Width="16" Height="16" Offset="0x4600"/>
<Texture Name="gMsgCharADInvertedExclamationMarkTex" OutName="msg_char_ad_inverted_exclamation_mark" Format="i4" Width="16" Height="16" Offset="0x4680"/>
<Texture Name="gMsgCharAEInvertedQuestionMarkTex" OutName="msg_char_ae_inverted_question_mark" Format="i4" Width="16" Height="16" Offset="0x4700"/>
<Texture Name="gMsgCharAFFeminineOrdinalIndicatorTex" OutName="msg_char_af_feminine_ordinal_indicator" Format="i4" Width="16" Height="16" Offset="0x4780"/>
<!-- Controller buttons and target inverted triangle -->
<Texture Name="gMsgCharB0ButtonATex" OutName="msg_char_b0_button_a" Format="i4" Width="16" Height="16" Offset="0x4800"/>
<Texture Name="gMsgCharB1ButtonBTex" OutName="msg_char_b1_button_b" Format="i4" Width="16" Height="16" Offset="0x4880"/>
<Texture Name="gMsgCharB2ButtonCTex" OutName="msg_char_b2_button_c" Format="i4" Width="16" Height="16" Offset="0x4900"/>
<Texture Name="gMsgCharB3ButtonLTex" OutName="msg_char_b3_button_l" Format="i4" Width="16" Height="16" Offset="0x4980"/>
<Texture Name="gMsgCharB4ButtonRTex" OutName="msg_char_b4_button_r" Format="i4" Width="16" Height="16" Offset="0x4A00"/>
<Texture Name="gMsgCharB5ButtonZTex" OutName="msg_char_b5_button_z" Format="i4" Width="16" Height="16" Offset="0x4A80"/>
<Texture Name="gMsgCharB6ButtonCUpTex" OutName="msg_char_b6_button_c_up" Format="i4" Width="16" Height="16" Offset="0x4B00"/>
<Texture Name="gMsgCharB7ButtonCDownTex" OutName="msg_char_b7_button_c_down" Format="i4" Width="16" Height="16" Offset="0x4B80"/>
<Texture Name="gMsgCharB8ButtonCLeftTex" OutName="msg_char_b8_button_c_left" Format="i4" Width="16" Height="16" Offset="0x4C00"/>
<Texture Name="gMsgCharB9ButtonCRightTex" OutName="msg_char_b9_button_c_right" Format="i4" Width="16" Height="16" Offset="0x4C80"/>
<Texture Name="gMsgCharBAZTargetSignTex" OutName="msg_char_ba_z_target_sign" Format="i4" Width="16" Height="16" Offset="0x4D00"/>
<Texture Name="gMsgCharBBControlStickTex" OutName="msg_char_bb_control_stick" Format="i4" Width="16" Height="16" Offset="0x4D80"/>
</File>
</Root>
+137
View File
@@ -0,0 +1,137 @@
<Root>
<File Name="parameter_static" Segment="2">
<Texture Name="gHeartEmptyTex" OutName="heart_empty" Format="ia8" Width="16" Height="16" Offset="0x0"/>
<Texture Name="gHeartQuarterTex" OutName="heart_quarter" Format="ia8" Width="16" Height="16" Offset="0x100"/>
<Texture Name="gHeartHalfTex" OutName="heart_half" Format="ia8" Width="16" Height="16" Offset="0x200"/>
<Texture Name="gHeartThreeQuarterTex" OutName="heart_three_quarter" Format="ia8" Width="16" Height="16" Offset="0x300"/>
<Texture Name="gHeartFullTex" OutName="heart_full" Format="ia8" Width="16" Height="16" Offset="0x400"/>
<Texture Name="gDefenseHeartEmptyTex" OutName="defense_heart_empty" Format="ia8" Width="16" Height="16" Offset="0x500"/>
<Texture Name="gDefenseHeartQuarterTex" OutName="defense_heart_quarter" Format="ia8" Width="16" Height="16" Offset="0x600"/>
<Texture Name="gDefenseHeartHalfTex" OutName="defense_heart_half" Format="ia8" Width="16" Height="16" Offset="0x700"/>
<Texture Name="gDefenseHeartThreeQuarterTex" OutName="defense_heart_three_quarter" Format="ia8" Width="16" Height="16" Offset="0x800"/>
<Texture Name="gDefenseHeartFullTex" OutName="defense_heart_full" Format="ia8" Width="16" Height="16" Offset="0x900"/>
<Texture Name="gFishermanMinigameTorchIconTex" OutName="fisherman_minigame_torch_icon" Format="ia8" Width="16" Height="30" Offset="0xA00"/>
<Texture Name="gSwordTrainingLogIconTex" OutName="sword_training_log_icon" Format="ia8" Width="24" Height="16" Offset="0xBE0"/>
<Texture Name="gSmallKeyCounterIconTex" OutName="small_key_counter_icon" Format="ia8" Width="16" Height="16" Offset="0xD60"/>
<Texture Name="gRupeeCounterIconTex" OutName="rupee_counter_icon" Format="ia8" Width="16" Height="16" Offset="0xE60"/>
<Texture Name="gButtonBackgroundTex" OutName="button_background" Format="ia8" Width="32" Height="32" Offset="0xF60"/>
<Texture Name="gEquippedItemOutlineTex" OutName="equipped_item_outline" Format="ia8" Width="32" Height="32" Offset="0x1360"/>
<Texture Name="gEmptyCLeftArrowTex" OutName="empty_c_left_arrow" Format="ia8" Width="32" Height="32" Offset="0x1760"/>
<Texture Name="gEmptyCDownArrowTex" OutName="empty_c_down_arrow" Format="ia8" Width="32" Height="32" Offset="0x1B60"/>
<Texture Name="gEmptyCRightArrowTex" OutName="empty_c_right_arrow" Format="ia8" Width="32" Height="32" Offset="0x1F60"/>
<Texture Name="gTimerClockIconTex" OutName="timer_clock_icon" Format="ia8" Width="16" Height="16" Offset="0x2360"/>
<Texture Name="gMapBossIconTex" OutName="map_boss_icon" Format="ia8" Width="8" Height="8" Offset="0x2460"/>
<Texture Name="gOcarinaATex" OutName="ocarina_a" Format="ia8" Width="16" Height="16" Offset="0x24A0"/>
<Texture Name="gOcarinaCDownTex" OutName="ocarina_c_down" Format="ia8" Width="16" Height="16" Offset="0x25A0"/>
<Texture Name="gOcarinaCRightTex" OutName="ocarina_c_right" Format="ia8" Width="16" Height="16" Offset="0x26A0"/>
<Texture Name="gOcarinaCLeftTex" OutName="ocarina_c_left" Format="ia8" Width="16" Height="16" Offset="0x27A0"/>
<Texture Name="gOcarinaCUpTex" OutName="ocarina_c_up" Format="ia8" Width="16" Height="16" Offset="0x28A0"/>
<Texture Name="gOcarinaTrebleClefTex" OutName="ocarina_treble_clef" Format="i4" Width="16" Height="32" Offset="0x29A0"/>
<Texture Name="gSceneTitleCardGradientTex" OutName="scene_title_card_gradient" Format="i8" Width="64" Height="1" Offset="0x2AA0"/>
<!-- All four versions of Tatl textures are identical -->
<Texture Name="gTatlCUpENGTex" OutName="tatl_c_up_eng" Format="ia4" Width="32" Height="12" Offset="0x2AE0"/>
<Texture Name="gTatlCUpGERTex" OutName="tatl_c_up_ger" Format="ia4" Width="32" Height="12" Offset="0x2BA0"/>
<Texture Name="gTatlCUpFRATex" OutName="tatl_c_up_fra" Format="ia4" Width="32" Height="12" Offset="0x2C60"/>
<Texture Name="gTatlCUpESPTex" OutName="tatl_c_up_esp" Format="ia4" Width="32" Height="12" Offset="0x2D20"/>
<Texture Name="gCarrotIconTex" OutName="carrot_icon" Format="rgba32" Width="16" Height="16" Offset="0x2DE0"/>
<Texture Name="gGoldSkulltulaCounterIconTex" OutName="gold_skulltula_counter_icon" Format="rgba32" Width="24" Height="18" Offset="0x31E0"/>
<Texture Name="gBeaverRingIconTex" OutName="beaver_ring_icon" Format="rgba32" Width="24" Height="16" Offset="0x38A0"/>
<Texture Name="gMapDungeonEntranceIconTex" OutName="map_dungeon_entrance_icon" Format="rgba16" Width="8" Height="8" Offset="0x3EA0"/>
<Texture Name="gMapChestIconTex" OutName="map_chest_icon" Format="rgba16" Width="8" Height="8" Offset="0x3F20"/>
<Texture Name="gArcheryScoreIconTex" OutName="archery_score_icon" Format="rgba16" Width="24" Height="16" Offset="0x3FA0"/>
<!-- Looking through the lens of the pictograph box -->
<Texture Name="gPictoBoxFocusIconTex" OutName="picto_box_focus_icon" Format="i4" Width="32" Height="16" Offset="0x42A0"/>
<Texture Name="gPictoBoxFocusBorderTex" OutName="picto_box_focus_border" Format="ia4" Width="16" Height="16" Offset="0x43A0"/>
<Texture Name="gPictoBoxFocusTextTex" OutName="picto_box_focus_text" Format="i4" Width="32" Height="8" Offset="0x4420"/>
<Texture Name="gCounterDigit0Tex" OutName="counter_digit_0" Format="i8" Width="8" Height="16" Offset="0x44A0"/>
<Texture Name="gCounterDigit1Tex" OutName="counter_digit_1" Format="i8" Width="8" Height="16" Offset="0x4520"/>
<Texture Name="gCounterDigit2Tex" OutName="counter_digit_2" Format="i8" Width="8" Height="16" Offset="0x45A0"/>
<Texture Name="gCounterDigit3Tex" OutName="counter_digit_3" Format="i8" Width="8" Height="16" Offset="0x4620"/>
<Texture Name="gCounterDigit4Tex" OutName="counter_digit_4" Format="i8" Width="8" Height="16" Offset="0x46A0"/>
<Texture Name="gCounterDigit5Tex" OutName="counter_digit_5" Format="i8" Width="8" Height="16" Offset="0x4720"/>
<Texture Name="gCounterDigit6Tex" OutName="counter_digit_6" Format="i8" Width="8" Height="16" Offset="0x47A0"/>
<Texture Name="gCounterDigit7Tex" OutName="counter_digit_7" Format="i8" Width="8" Height="16" Offset="0x4820"/>
<Texture Name="gCounterDigit8Tex" OutName="counter_digit_8" Format="i8" Width="8" Height="16" Offset="0x48A0"/>
<Texture Name="gCounterDigit9Tex" OutName="counter_digit_9" Format="i8" Width="8" Height="16" Offset="0x4920"/>
<Texture Name="gCounterColonTex" OutName="counter_colon" Format="i8" Width="8" Height="16" Offset="0x49A0"/>
<Texture Name="gStrayFairyMapCounterSlashTex" OutName="stray_fairy_map_counter_slash" Format="i8" Width="8" Height="16" Offset="0x4A20"/>
<Texture Name="gAmmoDigit0Tex" OutName="ammo_digit_0" Format="ia8" Width="8" Height="8" Offset="0x4AA0"/>
<Texture Name="gAmmoDigit1Tex" OutName="ammo_digit_1" Format="ia8" Width="8" Height="8" Offset="0x4AE0"/>
<Texture Name="gAmmoDigit2Tex" OutName="ammo_digit_2" Format="ia8" Width="8" Height="8" Offset="0x4B20"/>
<Texture Name="gAmmoDigit3Tex" OutName="ammo_digit_3" Format="ia8" Width="8" Height="8" Offset="0x4B60"/>
<Texture Name="gAmmoDigit4Tex" OutName="ammo_digit_4" Format="ia8" Width="8" Height="8" Offset="0x4BA0"/>
<Texture Name="gAmmoDigit5Tex" OutName="ammo_digit_5" Format="ia8" Width="8" Height="8" Offset="0x4BE0"/>
<Texture Name="gAmmoDigit6Tex" OutName="ammo_digit_6" Format="ia8" Width="8" Height="8" Offset="0x4C20"/>
<Texture Name="gAmmoDigit7Tex" OutName="ammo_digit_7" Format="ia8" Width="8" Height="8" Offset="0x4C60"/>
<Texture Name="gAmmoDigit8Tex" OutName="ammo_digit_8" Format="ia8" Width="8" Height="8" Offset="0x4CA0"/>
<Texture Name="gAmmoDigit9Tex" OutName="ammo_digit_9" Format="ia8" Width="8" Height="8" Offset="0x4CE0"/>
<Texture Name="gAmmoDigitHalfTex" OutName="ammo_digit_half" Format="ia8" Width="16" Height="8" Offset="0x4D20"/>
<Texture Name="gMagicMeterEndTex" OutName="magic_meter_end" Format="ia8" Width="8" Height="16" Offset="0x4DA0"/>
<Texture Name="gMagicMeterMidTex" OutName="magic_meter_mid" Format="ia8" Width="24" Height="16" Offset="0x4E20"/>
<Texture Name="gMagicMeterFillTex" OutName="magic_meter_fill" Format="ia8" Width="8" Height="8" Offset="0x4FA0"/>
<!-- The analog clock from day one until midnight of the final day -->
<Texture Name="gThreeDayClockDiamondTex" OutName="three_day_clock_diamond" Format="ia8" Width="40" Height="32" Offset="0x4FE0"/>
<Texture Name="gThreeDayClockMoonHourTex" OutName="three_day_clock_moon_hour" Format="ia8" Width="24" Height="24" Offset="0x54E0"/>
<Texture Name="gThreeDayClockSunHourTex" OutName="three_day_clock_sun_hour" Format="ia8" Width="24" Height="24" Offset="0x5720"/>
<Texture Name="gThreeDayClockBorderTex" OutName="three_day_clock_border" Format="i4" Width="64" Height="48" Offset="0x5960"/>
<Texture Name="gThreeDayClockHourLinesTex" OutName="three_day_clock_hour_lines" Format="i4" Width="64" Height="35" Offset="0x5F60"/>
<Texture Name="gThreeDayClockStarMinuteTex" OutName="three_day_clock_star_minute" Format="i4" Width="16" Height="16" Offset="0x63C0"/>
<Texture Name="gThreeDayClockHour12Tex" OutName="three_day_clock_hour_12" Format="i4" Width="16" Height="11" Offset="0x6440"/>
<Texture Name="gThreeDayClockHour1Tex" OutName="three_day_clock_hour_1" Format="i4" Width="16" Height="11" Offset="0x6498"/>
<Texture Name="gThreeDayClockHour2Tex" OutName="three_day_clock_hour_2" Format="i4" Width="16" Height="11" Offset="0x64F0"/>
<Texture Name="gThreeDayClockHour3Tex" OutName="three_day_clock_hour_3" Format="i4" Width="16" Height="11" Offset="0x6548"/>
<Texture Name="gThreeDayClockHour4Tex" OutName="three_day_clock_hour_4" Format="i4" Width="16" Height="11" Offset="0x65A0"/>
<Texture Name="gThreeDayClockHour5Tex" OutName="three_day_clock_hour_5" Format="i4" Width="16" Height="11" Offset="0x65F8"/>
<Texture Name="gThreeDayClockHour6Tex" OutName="three_day_clock_hour_6" Format="i4" Width="16" Height="11" Offset="0x6650"/>
<Texture Name="gThreeDayClockHour7Tex" OutName="three_day_clock_hour_7" Format="i4" Width="16" Height="11" Offset="0x66A8"/>
<Texture Name="gThreeDayClockHour8Tex" OutName="three_day_clock_hour_8" Format="i4" Width="16" Height="11" Offset="0x6700"/>
<Texture Name="gThreeDayClockHour9Tex" OutName="three_day_clock_hour_9" Format="i4" Width="16" Height="11" Offset="0x6758"/>
<Texture Name="gThreeDayClockHour10Tex" OutName="three_day_clock_hour_10" Format="i4" Width="16" Height="11" Offset="0x67B0"/>
<Texture Name="gThreeDayClockHour11Tex" OutName="three_day_clock_hour_11" Format="i4" Width="16" Height="11" Offset="0x6808"/>
<!-- The digital clock until moon crash after midnight of the final day -->
<Texture Name="gFinalHoursClockDigit0Tex" OutName="final_hours_clock_digit_0" Format="i8" Width="8" Height="8" Offset="0x6860"/>
<Texture Name="gFinalHoursClockDigit1Tex" OutName="final_hours_clock_digit_1" Format="i8" Width="8" Height="8" Offset="0x68A0"/>
<Texture Name="gFinalHoursClockDigit2Tex" OutName="final_hours_clock_digit_2" Format="i8" Width="8" Height="8" Offset="0x68E0"/>
<Texture Name="gFinalHoursClockDigit3Tex" OutName="final_hours_clock_digit_3" Format="i8" Width="8" Height="8" Offset="0x6920"/>
<Texture Name="gFinalHoursClockDigit4Tex" OutName="final_hours_clock_digit_4" Format="i8" Width="8" Height="8" Offset="0x6960"/>
<Texture Name="gFinalHoursClockDigit5Tex" OutName="final_hours_clock_digit_5" Format="i8" Width="8" Height="8" Offset="0x69A0"/>
<Texture Name="gFinalHoursClockDigit6Tex" OutName="final_hours_clock_digit_6" Format="i8" Width="8" Height="8" Offset="0x69E0"/>
<Texture Name="gFinalHoursClockDigit7Tex" OutName="final_hours_clock_digit_7" Format="i8" Width="8" Height="8" Offset="0x6A20"/>
<Texture Name="gFinalHoursClockDigit8Tex" OutName="final_hours_clock_digit_8" Format="i8" Width="8" Height="8" Offset="0x6A60"/>
<Texture Name="gFinalHoursClockDigit9Tex" OutName="final_hours_clock_digit_9" Format="i8" Width="8" Height="8" Offset="0x6AA0"/>
<Texture Name="gFinalHoursClockColonTex" OutName="final_hours_clock_colon" Format="i8" Width="8" Height="8" Offset="0x6AE0"/>
<Texture Name="gFinalHoursClockFrameTex" OutName="final_hours_clock_frame" Format="ia4" Width="80" Height="13" Offset="0x6B20"/>
<Texture Name="gMinigameCountdownGoTex" OutName="minigame_countdown_go" Format="ia8" Width="40" Height="32" Offset="0x6D28"/>
<Texture Name="gMinigameCountdown1Tex" OutName="minigame_countdown_1" Format="ia8" Width="24" Height="32" Offset="0x7228"/>
<Texture Name="gMinigameCountdown2Tex" OutName="minigame_countdown_2" Format="ia8" Width="24" Height="32" Offset="0x7528"/>
<Texture Name="gMinigameCountdown3Tex" OutName="minigame_countdown_3" Format="ia8" Width="24" Height="32" Offset="0x7828"/>
<!-- The letters of "PERFECT!" -->
<Texture Name="gMinigameLetterPTex" OutName="minigame_letter_p" Format="i4" Width="32" Height="33" Offset="0x7B28"/>
<Texture Name="gMinigameLetterETex" OutName="minigame_letter_e" Format="i4" Width="32" Height="33" Offset="0x7D38"/>
<Texture Name="gMinigameLetterRTex" OutName="minigame_letter_r" Format="i4" Width="32" Height="33" Offset="0x7F48"/>
<Texture Name="gMinigameLetterFTex" OutName="minigame_letter_f" Format="i4" Width="32" Height="33" Offset="0x8158"/>
<Texture Name="gMinigameLetterCTex" OutName="minigame_letter_c" Format="i4" Width="32" Height="33" Offset="0x8368"/>
<Texture Name="gMinigameLetterTTex" OutName="minigame_letter_t" Format="i4" Width="32" Height="33" Offset="0x8578"/>
<Texture Name="gMinigameExclamationTex" OutName="minigame_exclamation" Format="i4" Width="32" Height="33" Offset="0x8788"/>
<!-- Similar to stray fairy icons in icon_item_dungeon_static, except with a turned head -->
<Texture Name="gStrayFairyWoodfallIconTex" OutName="stray_fairy_woodfall_icon" Format="rgba32" Width="32" Height="24" Offset="0x8998"/>
<Texture Name="gStrayFairySnowheadIconTex" OutName="stray_fairy_snowhead_icon" Format="rgba32" Width="32" Height="24" Offset="0x9598"/>
<Texture Name="gStrayFairyGreatBayIconTex" OutName="stray_fairy_great_bay_icon" Format="rgba32" Width="32" Height="24" Offset="0xA198"/>
<Texture Name="gStrayFairyStoneTowerIconTex" OutName="stray_fairy_stone_tower_icon" Format="rgba32" Width="32" Height="24" Offset="0xAD98"/>
<Texture Name="gStrayFairyGlowingCircleIconTex" OutName="stray_fairy_glowing_circle_icon" Format="i4" Width="32" Height="24" Offset="0xB998"/>
</File>
</Root>
+7
View File
@@ -0,0 +1,7 @@
<Root>
<File Name="week_static" Segment="9">
<Texture Name="gClockDay1stTex" OutName="clock_day_1st_tex" Format="i8" Width="48" Height="27" Offset="0x0"/>
<Texture Name="gClockDay2ndTex" OutName="clock_day_2nd_tex" Format="i8" Width="48" Height="27" Offset="0x510"/>
<Texture Name="gClockDayFinalTex" OutName="clock_day_final_tex" Format="i8" Width="48" Height="27" Offset="0xA20"/>
</File>
</Root>

Some files were not shown because too many files have changed in this diff Show More